Docker概述

Docker provides the ability to package and run an application in a loosely isolated environment called a container. The isolation and security allow you to run many containers simultaneously on a given host. Containers are lightweight and contain everything needed to run the application, so you do not need to rely on what is currently installed on the host. You can easily share containers while you work, and be sure that everyone you share with gets the same container that works in the same way.

传统项目开发完成,发布时需要在每台电脑上配置环境。而环境配置是很麻烦的,有些环境不能跨平台。

docker 的出现是为了解决软件开发后,发布到线上时需要重新部署整个环境的问题。将 jar包 与环境一起打包做成镜像,发布时只需下载镜像并运行即可。

docker容器与容器之间相互隔离,可以在一台电脑上运行多个而不会相互影响。

官方文档 :https://docs.docker.com/

镜像地址 :https://hub.docker.com/

Docker 基本组成

  • 镜像(images):

    • docker镜像就好比一个模板,可以通过模板创建容器服务。可以通过这个镜像创建多个容器,并且都是相互独立的
  • 容器(container):

    • Docker 利用容器技术,独立运行一个或一组应用,通过镜像创建。简易的 linux
  • 仓库(repository):

    • 仓库用于存放镜像资源。分为私有、共有

安装 Docker

  • 删除旧版本
Bash
 sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  • 安装需要的安装包
Bash
sudo yum install -y yum-utils
  • 修改镜像仓库
Bash
sudo yum-config-manager \
	--add-repo \
	http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # https://download.docker.com/linux/centos/docker-ce.repo
  • 更新软件包索引
Bash
yum makecache fast
  • 安装docker
Bash
sudo yum install docker-ce docker-ce-cli containerd.io
# ce 指社区版, ee 指企业版
  • 安装其它版本 docker

    • 查看其它版本的 docker

      Bash
      yum list docker-ce --showduplicates | sort -r
      
    • 安装其它版本的 docker

    Bash
    sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
    
  • 启动docker

Bash
sudo systemctl start docker
  • 查看是否安装成功
Bash
docker version
  • 运行 hello-world
Bash
sudo docker run hello-world

image-20210927091829133

查看 hello-world 镜像

Bash
docker images
  • 卸载 docker
Bash
sudo yum remove docker-ce docker-ce-cli containerd.io
Bash
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

Docker 基本命令

Docker 镜像(image)操作

查看本地镜像列表

Bash
docker images

image-20210927131446563

  • REPOSITORY:镜像所在的仓库名称
  • TAG:镜像标签 版本号
  • IMAGE ID:镜像ID 唯一
  • CREATED:镜像的创建日期(不是获取该镜像的日期)
  • SIZE:镜像大小
  • 这些镜像都存储在 Docker 宿主机的 /var/lib/docker 目录下。

搜索镜像

  • 从网络中查找需要的镜像

    Bash
    docker search 镜像名称
    

    image-20210927131725073

    • NAME:仓库名称

    • DESCRIPTION:镜像描述

    • STARS:用户评价,反应一个镜像的受欢迎程度

    • OFFICIAL:是否官方

    • AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的

拉取镜像

从 Docker Hub 拉取
  • 官网地址 :https://hub.docker.com

  • Mirror与Private Registry的区别:

    • Private Registry(私有仓库)是开发者或者企业自建的镜像存储库,通常用来保存企业内部的 Docker 镜像,用于内部开发流程和产品的发布、版本控制。 Mirror是一种代理中转服务,我们(比如daocloud)提供的Mirror服务,直接对接Docker Hub的官方Registry。Docker Hub 上有数以十万计的各类 Docker 镜像。 在使用Private Registry时,需要在Docker Pull 或Dockerfile中直接键入Private Registry 的地址,通常这样会导致与 Private Registry 的绑定,缺乏灵活性。 使用 Mirror 服务,只需要在 Docker 守护进程(Daemon)的配置文件中加入 Mirror 参数,即可在全局范围内透明的访问官方的 Docker Hub,避免了对 Dockerfile 镜像引用来源的修改。
  • 拉取镜像

    Bash
    docker pull mysql:5.7
    # dokcer pull 镜像名:版本号,若不加版本号,则默认使用 latest,最新版
    
使用 ustc 的镜像【可选】
  1. 编辑文件:

    Bash
    vim /etc/docker/daemon.json
    
  2. 在文件中输入内容

    Bash
    {
    	"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    }
    
    • 选择阿里云镜像地址,速度更快
    • 登录阿里云控制台>所有产品->弹性计算->容器镜像服务->镜像工具->镜像加速器
    • image-20210927133354162
  3. 重启docker服务

    Bash
    systemctl restart docker
    

删除镜像

Shell
docker rmi 指定镜像
docker rmi 名称:tag

# 删除全部镜像
docker rmi -f $(docker images -aq)

Docker 容器操作

查看容器

  • 查看当前正在运行的容器

    Bash
    docker ps 
    # 查看当前正在运行的容器
    # docker ps --help  查看ps的所有选项
    

    image-20210927142130674

  • 查看所有的容器【常用】,包括运行中的与停止的

    Bash
    docker ps -a
    
  • 查看最后一次运行的容器

    Bash
    docker ps -l
    

创建与启动容器

  • 创建容器命令
Bash
docker run(创建且运行 create+st) (create)
  • 常用参数说明

    参数名说明
    -i表示容器运行
    -t表示容器启动后会进入其命令行。加入这个参数后,容器创建就能登录进去。
    --name为创建的容器命名
    -v表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射
    -d在run后面加上 -d 参数,则容器可以在后台运行
    -p表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射。
    Bash
    --restart always	# 容器会随着 docker 的启动而启动
    

创建交互式容器

  • 创建一个交互容器并取名为 mycentos
Bash
docker run -it --name=mycentos centos:7 /bin/bash
# 创建后会自动进入容器中

image-20210927161452010

  • 退出当前容器

    Bash
    exit
    

守护式容器

  • 创建一个守护式容器:如果对于一个需要长期运行运行的容器,我们可以创建一个守护式容器命令

    Bash
    docker run -i -d --name=mycentos2 centos:7
    
  • 登录守护式容器

    Bash
    docker exec -i -t 容器名/容器id /bin/bash
    # 进入容器,开启一个新终端
    
    Bash
    docker attach 容器id
    # 进入容器,不会启动新的终端,而是进入之前开启的终端
    

    image-20210927162106389

停止与启动容器

  • 停止正在运行的容器

    Bash
    docker stop 容器名
    

    image-20210927162317148

  • 启动已存在的容器

    Bash
    docker start 容器名
    

    image-20210927162417453

  • 重启容器

    Bash
    docker restart 容器名/容器id
    

文件拷贝

Bash
docker cp source target
# 容器中地址:容器id:/路径
# source 源文件地址,可以是容器中或宿主中
# targer 目标地址,容器中或宿主中

目录挂载(映射)

在创建容器时,将宿主机的目录与容器内的目录进行映射,这样就可以通过修改宿主机某个目录的文件从而去影响容器中所对应的目录。

  • 创建容器,并挂载宿主机目录到容器中的目录下:

    Bash
    docker run -i -d -v /usr/local/myhtml:/user/local/myhtml --name=mycentos3 centos:7
    # 宿主目录:容器目录
    
    • 如果你共享的是多级的目录,可能会出现权限不足的提示。这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数--privileged=true来解决挂载的目录没有权限的问题。

      Bash
      docker run -di --privileged=true -v /root/test:/usr/local/test --name=mycentos4 centos:7
      

查看容器IP地址

  • 查看容器运行的各种数据

    Bash
    docker inspect 容器名
    
  • 也可以直接执行查看IP地址

    Bash
    docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名
    

    image-20210927164212809

删除容器

删除指定容器:只能删除已经停止的

Bash
docker rm 容器名/容器id
  • 删除所有容器【慎用】

    Bash
    docker rm ${docker ps -aq)
    

查看容器日志

Bash
docker logs 容器名/容器id

Docker 镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件等。

所有的应用,直接打包docker镜像,就可以直接跑起来。

镜像加载原理

UnionFS(联合文件系统)

UnionFS:Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。

Docker镜像实际上是由一层一层的文件系统组成的。

Boots

环境部署

MySQL 部署

  • 拉取镜像

    Bash
    docker pull mysql:5.7.35
    
  • 创建 mysql 容器

    Bash
    docker run -i -d --name=mysql -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.35
    
    • -p 代表端口映射:宿主端口:容器运行端口
    • -e 代表给容器添加环境变量。 MYSQL_ROOT_PASSWORD 是 root 用户登录密码,严格区分大小写
  • 进入MySql容器

    Bash
    docker exece -i -t mysql /bin/bash
    
  • 登录 MySql

    Bash
    mysql -u root -p
    

    image-20210927165418547

  • 授权远程登录

    Bash
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
    
  • 进行远程登录mysql即可

tomcat 部署

  • 拉取 tomcat 镜像

    Bash
    docker pull tomcat:7-jre8
    
  • 创建tomcat容器

    Bash
    docker run -di --name=tomcat -p 9100:8080 tomcat:7-jre8
    
  • 测试tomcat

Nginx部署

  • 拉取Nginx镜像

    Bash
    docker pull nginx
    
  • 创建 nginx 容器

    Bash
    docker run -di --name=pinyougou_nginx -p 80:80  nginx 
    
  • 测试

Redis 部署

  • 拉取Redis镜像

    Bash
    docker pull redis
    
  • 创建Redis容器

    Bash
    docker run -di --name=pinyougou_redis -p 6379:6379 redis
    
  • 测试

备份与迁移

容器保存为镜像

Shell
docker commit -m='提交者的描述信息' -a='作者' 容器id 目标镜像名:tag

镜像备份

Bash
docker save -o 要保存的文件名.tar 镜像名称:tag/镜像id
# -o 表示输出到文件

镜像的恢复

Bash
docker load -i xxx.tar
# -i 输入的文件

容器数据卷

Docker的数据都直接存储在 Docker之中,若docker被删除则数据丢失。

容器数据卷:容器之间的一个数据共享技术。Docker 容器中产生的数据,同步到本地。即目录的挂载。

使用数据卷

  • 使用命令直接挂载 -v

    Shell
    docker run -it -v /home/test:/home centos:7 /bin/bash
    # 前边的目录为宿主机的目录
    # 后边的目录为容器中的目录
    # 会将宿主机中的该目录与容器中的该目录进行同步,双向绑定
    
  • 当挂载后将容器删除,宿主机中文件仍然存在。

  • 具名和匿名

    • 具名:-v 容器内路径,设置容器内卷名

      Shell
      docker run -it -v named:/etc/local centos:7 
      
    • 匿名:-v 之后直接写容器内路径而不写宿主机地址

      Shell
      docker volume ls
      # 查看所有 卷 的情况
      
    • 所有docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volume/xxx,数据都在其目录下的 _data 中

    • 具名与匿名区分:

      Shell
      -v 容器内路径		   # 匿名挂载
      -v 卷名:容器内路径		  # 具名挂载
      -v /容器外路径:容器内路径	# 指定路径挂载
      
      Shell
      # 通过 -v 容器内路径,ro rw 改变读写权限
      ro readonly # 只读
      rw readwrite # 读写
      
      docker run -d -p --name centos01 -v named:/etc/centos:ro centos:7
      docker run -d -p --name centos01 -v named:/etc/centos:rw centos:7
      # 一旦设置了容器权限,容器挂载出来的内容就有限定了
      # ro 容器内只能读,只有宿主机中才能修改
      

Dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像.

创建镜像步骤:

  1. 编写一个 Dockerfile 文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像

Dockerfile 构建过程

构建命令

  • 基础
    1. 每个保留关键字(指令)都必须是大写
    2. 执行顺序从上至下
    3. # 表示注释
    4. 每一个指令都会创建提交一个新的镜像层,并提交
命令作用
FROM image_name:tag定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name声明镜像的创建者
ENV key value设置环境变量,可以设置多条
RUN command启动时运行的指令,可以写多条
ADD source_dir/file dest_dir/file将宿主机的文件复制到容器内,会自动解压缩
COPY source_dir/file dest_dir/file与ADD相似,只是不会自动解压
WORKDIR path_dir设置工作目录
EXPOSE port1 port2用来指定端口,使容器内的应用可以通过端口和外界交互
CMD argument在容器启动时使用,只有最后一个生效,会被 docker run 后的参数覆盖
ENTRYPOINT argument和CMD类似,追加指令,但是不会被 docker run 后的内容覆盖
VOLUME将本地文件或者其它容器的文件挂载到容器中
  • Dockerfile:构建文件,定义了构建镜像的步骤,源代码
  • DockerImages:通过 Dockerfile 构建生成的镜像,最终发布和运行的产品
  • Docker容器:就是镜像运行起来提供服务器

自己构建 Dockerfile

官方 Centos Dockerfile

Shell
FROM scratch	# 最基本的
ADD centos-7-x86_64-docker.tar.xz /

LABEL \
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20201113" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-11-13 00:00:00+00:00"

CMD ["/bin/bash"]

官方 MySQL5.7 Dockerfile

Shell
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#

FROM debian:buster-slim

# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysql

RUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/*

# add gosu for easy step-down from root
# https://github.com/tianon/gosu/releases
ENV GOSU_VERSION 1.12
RUN set -eux; \
	savedAptMark="$(apt-mark showmanual)"; \
	apt-get update; \
	apt-get install -y --no-install-recommends ca-certificates wget; \
	rm -rf /var/lib/apt/lists/*; \
	dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
	wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \
	wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \
	export GNUPGHOME="$(mktemp -d)"; \
	gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
	gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
	gpgconf --kill all; \
	rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
	apt-mark auto '.*' > /dev/null; \
	[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
	apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
	chmod +x /usr/local/bin/gosu; \
	gosu --version; \
	gosu nobody true

RUN mkdir /docker-entrypoint-initdb.d

RUN apt-get update && apt-get install -y --no-install-recommends \
# for MYSQL_RANDOM_ROOT_PASSWORD
		pwgen \
# for mysql_ssl_rsa_setup
		openssl \
# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
# File::Basename
# File::Copy
# Sys::Hostname
# Data::Dumper
		perl \
# install "xz-utils" for .sql.xz docker-entrypoint-initdb.d files
		xz-utils \
	&& rm -rf /var/lib/apt/lists/*

RUN set -ex; \
# gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported
	key='A4A9406876FCBD3C456770C88C718D3B5072E1F5'; \
	export GNUPGHOME="$(mktemp -d)"; \
	gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \
	gpg --batch --export "$key" > /etc/apt/trusted.gpg.d/mysql.gpg; \
	gpgconf --kill all; \
	rm -rf "$GNUPGHOME"; \
	apt-key list > /dev/null

ENV MYSQL_MAJOR 5.7
ENV MYSQL_VERSION 5.7.35-1debian10

RUN echo 'deb http://repo.mysql.com/apt/debian/ buster mysql-5.7' > /etc/apt/sources.list.d/mysql.list

# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
# also, we set debconf keys to make APT a little quieter
RUN { \
		echo mysql-community-server mysql-community-server/data-dir select ''; \
		echo mysql-community-server mysql-community-server/root-pass password ''; \
		echo mysql-community-server mysql-community-server/re-root-pass password ''; \
		echo mysql-community-server mysql-community-server/remove-test-db select false; \
	} | debconf-set-selections \
	&& apt-get update \
	&& apt-get install -y \
		mysql-server="${MYSQL_VERSION}" \
# comment out a few problematic configuration values
	&& find /etc/mysql/ -name '*.cnf' -print0 \
		| xargs -0 grep -lZE '^(bind-address|log)' \
		| xargs -rt -0 sed -Ei 's/^(bind-address|log)/#&/' \
# don't reverse lookup hostnames, they are usually another container
	&& echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnf \
	&& rm -rf /var/lib/apt/lists/* \
	&& rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \
	&& chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \
# ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime
	&& chmod 1777 /var/run/mysqld /var/lib/mysql

VOLUME /var/lib/mysql

COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 3306 33060
CMD ["mysqld"]

自定义 Dockerfile [自定义centos,添加 vim 和 ifconfig]

  • 创建 demo 目录并创建 Dockerfile 文件

    Bash
    mkdir /home/dockerfile
    cd /home/dockerfile
    vim Dockerfile
    
  • 在 Dockerfile 中输入内容

    Shell
    FROM centos:7
    MAINTAINER zhboom<suffergoof@gmail.com>
    
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    RUN yum -y install vim
    RUN yum -y install net-tools
    
    EXPOSE 80
    
    CMD echo $MYPATH
    CMD echo "---end---"
    CMD /bin/bash
    
  • 在当前目录中创建自定义镜像,最后的 . 不能被省略

    Bash
    docker build -f Dockerfile -t mycentos:1.0 .
    # -f 指定要构建的文件,默认为 Dockerfile
    # -t 生成的对象文件
    

image-20210928100813457

image-20210928100856747

image-20210928100834608

  • 测试运行

    Bash
    docker run -i -t mycentos:1.0
    

    image-20210928101202841

  • 查看本地进行的变更历史

    Shell
    docekr history $image_name:tag
    

    image-20210928101435621

CMD 和 ENTRYPOINT 的区别

  • CMD 命令会被替换,而不能直接在后边追加命令
Bash
[root@zhboom dockerfile]# dockerfile-cmd-test

FROM centos:7.0
CMD ["ls", "-a"]

# 构建镜像
[root@zhboom dockerfile]# docker build -f docker-cmd-test -t cmdtest .

# run 运行
[root@zhboom dockerfile]# docker run cmdtest
# 正常展示文件列表,执行了 ls -a

[root@zhboom dockerfile]# docker run cmdtest -l
ERROR
# 因为 -l 命令替换了 ls -a ,而系统不识别 -l 命令,因此会报错
  • ENTRYPOINT 命令可以在后边直接追加。就是命令直接拼接在 ENTRYPOINT 指定的命令后再一起执行
Shell
[root@zhboom dockerfile]# dockerfile-cmd-test

FROM centos:7.0
ENTRYPOINT ["ls", "-a"]

# 构建镜像
[root@zhboom dockerfile]# docker build -f docker-cmd-test -t cmdtest .

# run 运行
[root@zhboom dockerfile]# docker run cmdtest
# 正常展示文件列表,执行了 ls -a

[root@zhboom dockerfile]# docker run cmdtest -l
# 展示文件列表及其详细信息

自定义 tomcat 镜像

准备工作

  1. 准备一个 tomcat 压缩包,jdk压缩包。
  2. 编写 Dockerfile 文件,
Shell
FROM centos:7

MAINTAINER zhboom<suffergoof@gmail.com>

COPY readme.txt /usr/local/readme.txt

ADD OpenJDK8U-jdk_x64_linux_hotspot_8u302b08.tar.gz /usr/local/
ADD apache-tomcat-9.0.53.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk8u302-b08
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.53
ENV CATALINA_BASH  /usr/local/apache-tomcat-9.0.53
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD  /usr/local/apache-tomcat-9.0.53/bin/startup.sh && tail -F  /usr/local/apache-tomcat-9.0.53/bin/logs/catalin
a.out
  • 构建镜像
Shell
docker build -t diytomcat .

image-20210928110729219

image-20210928110845537

  • 运行容器实例,并挂载路径

    Shell
    docker run -d -p 18080:8080 --name=zhboomtomcat \
    -v /home/zhboom/build/tomcat/test:/usr/local/apache-tomcat-9.0.53/webapps\test \
    -v/home/zhboom/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.53/logs diytomcat
    

    image-20210928112129028

    image-20210928112155470

  • 查看历史信息

    Shell
    docker history diytomcat:latest
    

    image-20210928112221457

提交镜像

提交到 Docker Hub

  • 登录自己的 Docker Hub 账号

    Shell
    docker login -u username # 回车
    # 输入密码
    Login Success # 表示登录成功
    
  • 提交镜像

    Shell
    # 重命名镜像
    docker tag 镜像id|镜像名 username/diytomcat:1.0
    # 发布到 Docker Hub
    docker push username/diytomcat:1.0
    

提交到 阿里云

  • 登录到 阿里云控制台
  • 找到容器镜像服务
  • 创建命名空间(一个账号只能创建三个空间)
  • 创建容器镜像
  • 具体操作看官方文档

Docker网络

理解Docker 0

  • 先清空环境

    Shell
    # 删除所有容器
    docker rm -f $(docker ps -aq)
    # 删除所有镜像
    docker rmi -f $(docker images -aq)
    
  • 获取当前 ip 地址

    Shell
    ip addr
    
  • image-20210928192051533
  • 三个网络:docker如何进行网络连接
Shell
# 启动一个 tomcat 容器
docker run -id -P --name tomcat01 tomcat:9.0
# -P 大写P,随机分配端口

# 查看容器的ip
# docker exec -id tomcat01 ip addr	新版的tomcat容器中不带 ip 指令
docker inspect --format='{{.NetworkSettings.IPAddress}}' tomcat01
172.17.0.2
  • 测试宿主与容器能否联通

    代码
    ping 172.17.0.2
    

image-20210928202259347

原理

我们每启动一个 docker 容器,docker 就会给 docker容器分配一个 ip,只要安装了 docker,就会有一个网卡 docker0。

docker0 使用了桥接模式,使用了 veth-pair 技术

veth-pair : 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连。通常利用 veth-pair 充当一个桥梁,用于连接各种虚拟网络设备。

解决问题:两个容器之间无法通过容器名相互连通。需要通过ip地址才能连接,但是每次容器启动ip不能保持一致。

--link

Shell
docker run -d -p --name tomcat03 --link tomcat02 tomcat
# tomcat02为之前已存在并运行中的容器名
# 使用 --link 会在 tomcat03 存储 tomcat02 的链接

# 此时 tomcat03可以直接 ping 通 tomcat02
docker exec -it tomcat03 ping tomcat02

# 但反过来却不通,需要在 tomcat02 中配置 tomcat03
docker exec -it tomcat02ping tomcat03
  • 在 host 配置中增加 容器名到 ip 的映射【192.168.0.3 tomcat02 容器id】

自定义网络

  • 查看所有docker网络

    Shell
    docker network ls
    

网络模式

  • bridge :桥接 docker(默认)
  • none :不配置网络
  • host :和宿主机共享网络
  • container :容器网络连通(使用少,局限很大)

创建网络

  • docker network 的所有指令

image-20211001091628579

Shell
docker run -id -p --name tomcat01 --net bridge tomcat:9.0

# 之前启动,其实默认就是上面的语句,自带 --net bridge。docker0
docker run -id -p --name tomcat01 tomcat:9.0

# docker0: 默认,但是不能通过容器名链接
  • docker network create 指令

image-20211001092400873

  • 创建网络
Shell
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# 创建了一个网络名为 mynet
# driver: 该网络使用网桥模式,桥接
# subnet: 子网为 192.168.0.0/16,B类网络。
# gateway: 网关为 192.168.0.1

image-20211001093002522

  • 使用自己创建的网络启动容器
Shell
docker run -id -P --name tomcat02 --net mynet tomcat:9.0

docker run -id -P --name tomcat02 --net mynet tomcat:9.0
  • 此时再次测试,不使用--link,可以通过容器名直接 ping 通

通过自定义网络创建的容器可以直接通过容器名互联

感谢读到这里

日志还会继续,欢迎常来。

返回首页