docker

1、Docker概述

  • 官网:https://www.docker.com
  • 仓库地址:https://hub.docker.com
  • Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖到一个可移植的镜像中,然后发布到任何流行的Linux和Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

  • Docker和虚拟机技术的不同
    • 传统虚拟机,虚拟出一个硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
    • 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所有就轻便了
    • 每个容器是互相隔离的,每个容器内都有一个属于自己的文件系统,互不影响

  • docker的基本组成
    • 镜像(image):docker镜像就好比一个模板,可以通过这模板来创建容器服务,tomcat镜像-->run-->tomcat容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)
    • 容器(container):docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的
    • 仓库(repository):存放镜像的地方

2、安装Docker

2.1、安装

  • 卸载旧版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  • 需要的安装包
yum install -y yum-utils
  • 设置镜像仓库(阿里云的)
yum-config-manager     --add-repo     http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 更新yum软件包索引
yum makecache fast
  • 安装docker
yum install docker-ce docker-ce-cli containerd.io
  • 启动docker
systemctl start docker
  • 查看docker版本
docker version
  • 运行镜像
docker run hello-world
  • 查看本地镜像
docker images

2.2、卸载

  • yum remove docker-ce docker-ce-cli containerd.io
  • rm -rf /var/lib/docker

2.3、阿里云镜像加速

image.png

3、Docker常用命令

docker version  #显示docker版本信息
docker info     #显示docker的系统信息
docker 命令 --help  #帮助信息

3.1、镜像命令

docker images 查看所有本地主机上的镜像

  • 可选项
    • -a : 列出所有的镜像
    • -q :只显示镜像的id

docker search 搜索镜像

  • 可选项
    • --filter=STARS=3000 :搜索出来的镜像就是STARS大于3000的

docker pull 下载镜像

  • 指定版本下载
    • docker pull 镜像名:[tag]

docker rmi 删除镜像

  • docker rmi -f 镜像id :删除指定的镜像
  • docker rmi -f 镜像id 镜像id 镜像id :删除多个镜像
  • docker rmi -f $(docker images -aq) :删除全部镜像

3.2、容器命令

  • 说明:有了镜像才可以创建容器,linux,下载一个centos镜像测试
docker pull centos
  • 新建容器并启动
docker run [可选参数] image

#参数说明
--name="Name" 容器名称,用于区分容器
-d            后台运行方式
-it           使用交互式运行,进入容器查看内容
-p            指定容器端口
-P            随机指定端口


# 测试 启动并进入容器
[root@izbp1jbs6mikenptx3k00bz ~]# docker run -it centos /bin/bash
[root@dacefc4cfdcb /]#


# 退出容器,从容器中退回主机
exit  # 容器直接停止并退出
Ctrl + P +Q  #容器不停止退出
  • 列出所有的运行的容器
# docker ps
     # 列出当前正在运行的容器
-a   # 列出当前正在运行的容器 + 历史运行过的容器
-n=? # 显示最近创建的容器
-q   # 只显示容器的编号
  • 删除容器
docker rm 容器id                #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq)   #删除所有的容器
  • 停止和启动容器
docker start 容器id    # 启动容器
docker restart 容器id  # 重启容器
docker stop 容器id     # 停止当前正在运行的容器
docker kill 容器id     # 强制停止当前容器

3.3 常用其他命令

  • 后台启动容器
# docker run -d 镜像名
  • 查看日志
docker logs -tf --tail 10 容器id

-f             # 显示日志
--tail number  # 要显示日志条数
  • 查看容器中的进程信息
docker top 容器id
  • 查看容器的元数据
docker inspect 容器id
  • 进入当前正在运行的容器
docker exec -it 容器id /bin/bash
docker attach 容器id

# docker exec   # 进入容器后开启一个新的终端,可以在里面操作
# docker attach # 进入容器正在运行的终端,不会启动新的进程
  • 从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径

4、部署Tomcat

  • 下载tomcat
docker pull tomcat:9.0
  • 启动运行
docker run -d -p 3344:8080 --name tomcat01 tomcat
  • 将webapp.dist文件中的内容拷贝到webapp,或删除webapp将webapp.dist重命名为webapp

  • 访问

image.png

4、Dokcer镜像

镜像是什么

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

Dokcer镜像加载原理

  • UnionFS(联合文件系统)
    • UnionFS(联合文件系统):Union系统(UnionFS)是一种份分层、轻量级并且高性能的文件系统,它支持文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
    • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
  • Docker镜像加载原理
    • docker的镜像实际上由一层一层的文件系统组成,这种层级关系的文件系统UnionFS
    • bootfs(boot file system)主要包括bootLoader和kernel,bootLoader主要是引导加载kernel,Linux刚启动时会架子bootfs文件系统,在docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,抱恨boot加载器和内核。当boot加载完成之后整个内核都在内存中了,此时内存的使用权已由boot转交给内核,此时系统也会卸载bootfs
    • rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统的发行版,比如Ubuntu,Centos等等

image.png

  • 对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。因此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同发型版本可以公用bootfs

分层理解

  • 所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上创建新的镜像层

  • Dokcer镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就是我们通常说的容器层,容器层之下的都叫镜像层

commit镜像

docker commit

docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
  • 实战测试
    • 启动一个默认的tomcat
    • 发现默认的tomcat是没有webapps应用
    • 拷贝进入基本的文件
    • 将操作的容器通过commit提交为一个镜像
[root@izbp1jbs6mikenptx3k00bz ~]# docker commit -a="cml" -m="add webap"
 d64ce9e05617 tomcat-cml:1.0
sha256:a2abc348f45bdaed212143adf15e31f9bea14e6c04d2efed518506a835d19709
[root@izbp1jbs6mikenptx3k00bz ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
tomcat-cml   1.0       a2abc348f45b   14 seconds ago   209MB

5、容器卷技术

  • Docker容器中产生的数据,同步到本地,目录的挂载,将我们的容器的目录挂载到Linux上面
  • 容器的持久化和同步数据,容器间也是可以数据共享的

5.1、使用容器卷技术

#  docker run -it -v 主机目录:容器目录

[root@izbp1jbs6mikenptx3k00bz ~]# docker run -it -v /home/centos:/home centos /bin/bash

# 启动之后查看容器的消息信息

docker inspect 容器id

"Mounts": [
       {
       "Type": "bind",
       "Source": "/home/centos", # 主机内地址
       "Destination": "/home", #docker容器内地址
       "Mode": "",
       "RW": true,
       "Propagation": "rprivate"
       }
     ],

5.2、mysql同步数据

# 获取镜像
docker pull mysql:5.7

# 运行容器,需要做数据挂载
docker run -d -p 3344:3306 -v /home/mysql/conf:/etc/mysql/conf -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1 mysql:5.7
  • 连接测试

image.png

5.3、具名挂载和匿名挂载

  • 匿名挂载
# 匿名挂载,在挂载的时候只写了容器内的路径,没有写容器外的路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有卷的情况
[root@izbp1jbs6mikenptx3k00bz home]# docker volume ls
DRIVER    VOLUME NAME
local     0dc52ad4ec2467b095683bec6c6dd1ed41bb4771efb37589ab7697cdbd913926   # 匿名卷挂载
  • 具名挂载
docker run -d -P --name nginx01 -v nginx:/etc/nginx nginx

[root@izbp1jbs6mikenptx3k00bz home]# docker volume ls
DRIVER    VOLUME NAME
local     nginx    # 具名挂载
  • 所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/...

  • ro(readonly) rw(readwrite)

docker run -d -P --name nginx01 -v nginx:/etc/nginx nginx:ro

docker run -d -P --name nginx01 -v nginx:/etc/nginx nginx:rw

5.4、初识Dokcerfile

  • Dockerfile 就是用来构建docker镜像的构建文件(命令脚本),通过这个脚本可以生成镜像,镜像是一层一层的,脚本每个命令都是一层

  • 创建volumefile文件

vim dockerfile
  • 编写volumefile文件
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "-----end-----"

CMD /bin/bash
  • 构建镜像
docker build -f /home/docker-test-volume/dockerfile -t cml/centos:1.0 .

Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 1aa3663f64bf
Removing intermediate container 1aa3663f64bf
 ---> 31b45322c01a
Step 3/4 : CMD echo "-----end-----"
 ---> Running in b94a197fb3d7
Removing intermediate container b94a197fb3d7
 ---> 40b6382df689
Step 4/4 : CMD /bin/bash
 ---> Running in fea3e4e1594d
Removing intermediate container fea3e4e1594d
 ---> 80f7a3e9a61d
Successfully built 80f7a3e9a61d
Successfully tagged cml/centos:1.0
  • 查看构建的镜像 cml/centos
[root@izbp1jbs6mikenptx3k00bz docker-test-volume]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
cml/centos   1.0       80f7a3e9a61d   About a minute ago   209MB
  • 启动自己创建的镜像
docker run -it 80f7a3e9a61d /bin/bash

[root@48404c83c808 /]# ls -ll
total 56
lrwxrwxrwx  1 root root    7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x  5 root root  360 Feb 22 02:00 dev
drwxr-xr-x  1 root root 4096 Feb 22 02:00 etc
drwxr-xr-x  2 root root 4096 Nov  3 15:22 home
lrwxrwxrwx  1 root root    7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx  1 root root    9 Nov  3 15:22 lib64 -> usr/lib64
drwx------  2 root root 4096 Dec  4 17:37 lost+found
drwxr-xr-x  2 root root 4096 Nov  3 15:22 media
drwxr-xr-x  2 root root 4096 Nov  3 15:22 mnt
drwxr-xr-x  2 root root 4096 Nov  3 15:22 opt
dr-xr-xr-x 90 root root    0 Feb 22 02:00 proc
dr-xr-x---  2 root root 4096 Dec  4 17:37 root
drwxr-xr-x 11 root root 4096 Dec  4 17:37 run
lrwxrwxrwx  1 root root    8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x  2 root root 4096 Nov  3 15:22 srv
dr-xr-xr-x 13 root root    0 Feb 22 02:00 sys
drwxrwxrwt  7 root root 4096 Dec  4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec  4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec  4 17:37 var
drwxr-xr-x  2 root root 4096 Feb 22 02:00 volume01    # 生成目录就是我们生成镜像的时候自动挂载的,数据卷目录
drwxr-xr-x  2 root root 4096 Feb 22 02:00 volume02
  • 查看卷挂载位置
docekr inspect 容器id


"Mounts": [
    {
         "Type": "volume",
         "Name": "2ee46c6f0ca4a8d1c598d9d8de1478d8b5bcaa78f8ce7f979505bae2f90ade38",
         "Source": "/var/lib/docker/volumes/2ee46c6f0ca4a8d1c598d9d8de1478d8b5bcaa78f8ce7f979505bae2f90ade38/_data",
         "Destination": "volume02",
         "Driver": "local",
         "Mode": "",
         "RW": true,
         "Propagation": ""
    },
    {
         "Type": "volume",
         "Name": "2bdbda467044bb9cf3d9ab235b4acd5d2d362d56a3b99b4d0af7984191b9a50f",
         "Source": "/var/lib/docker/volumes/2bdbda467044bb9cf3d9ab235b4acd5d2d362d56a3b99b4d0af7984191b9a50f/_data",
         "Destination": "volume01",
         "Driver": "local",
         "Mode": "",
         "RW": true,
         "Propagation": ""
     }
]
  • 卷挂载位置
[root@izbp1jbs6mikenptx3k00bz volumes]# pwd
/var/lib/docker/volumes
[root@izbp1jbs6mikenptx3k00bz volumes]# ll
total 32
drwx-----x 3 root root   4096 Feb 22 10:00 2bdbda467044bb9cf3d9ab235b4acd5d2d362d56a3b99b4d0af7984191b9a50f
drwx-----x 3 root root   4096 Feb 22 10:00 2ee46c6f0ca4a8d1c598d9d8de1478d8b5bcaa78f8ce7f979505bae2f90ade38

5.5、数据卷容器

  • 多个容器同步数据(--volumes-from)

image.png

# 查看镜像(cml/centos)
[root@izbp1jbs6mikenptx3k00bz ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
cml/centos   1.0       80f7a3e9a61d   25 minutes ago   209MB

# 启动cml/centos镜像 --name docker01
[root@izbp1jbs6mikenptx3k00bz ~]# docker run -it --name docker01 cml/centos:1.0

# 启动cml/centos镜像 --name docker02 挂载到docker01
docker run -it --name docker02 --volumes-from docker01 cml/centos:1.0

# 启动cml/centos镜像 --name docker03 挂载到docker01
docker run -it --name docker03 --volumes-from docker01 cml/centos:1.0

6、DokcerFile

6.1、DockerFile介绍

  • dockerfile是用来构造docker镜像的文件,命令参数脚本
  • 构建步骤
    • 编写一个dockerfile文件
    • docker build构造成为一个镜像
    • docker run 运行镜像
    • docker push 发布镜像(DockerHub,阿里云镜像仓库)

  • 查看一下官方是怎么做的(centos7)

image.png

image.png

  • 很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像

6.2、DockerFile搭建过程

  • 每个保留关键字(指令)都必须是大写字母
  • 执行从上到下顺序执行
  • 表示注释

  • 每一个指令都会创建提交一个新的镜像层,并提交

image.png

  • DockerFile :构建文件,定义了一切的步骤
  • DokcerImages :通过DockerFile构建生成的镜像,最终发布和运行的产品
  • Docker容器 :镜像运行起来提供服务器

6.3、DockerFile指令

指令 说明
FROM 指定基础镜像
MAINTAINER 指定维护者信息,姓名+邮箱
RUN 镜像构造的时候需要运行的命令
ADD 添加内容
WORKDIR 镜像的工作目录
VOLUME 挂载目录
EXPOSE 暴露端口
CMD 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD 当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令
COPY 将我们的文件拷贝到镜像中
ENV 构造的时候设置环境变量

6.4、实战测试

6.4.1、构建centos镜像
  • 编写dockerfile-centos
FROM centos
MAINTAINER cml<507545713@qq.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

  • 通过dockerfile文件构建镜像
[root@izbp1jbs6mikenptx3k00bz dokcerfile]# docker build -f dockerfile-centos -t mycentos:1.0

[root@izbp1jbs6mikenptx3k00bz dokcerfile]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mycentos     0.1       ef41b76755e2   53 seconds ago   282MB
  • 查看镜像构建过程(docker history 镜像id)
[root@izbp1jbs6mikenptx3k00bz dokcerfile]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mycentos     0.1       ef41b76755e2   7 minutes ago   282MB

[root@izbp1jbs6mikenptx3k00bz dokcerfile]# docker history ef41b76755e2
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
ef41b76755e2   7 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
fff85f9b5d60   7 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
7729d8686dd5   7 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
b33a03f878d4   7 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
e3f132221a90   7 minutes ago   /bin/sh -c yum -y install net-tools             14.3MB    
0e5bef2bd9ff   7 minutes ago   /bin/sh -c yum -y install vim                   58MB      
3b99b59c0b28   7 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
6f2546f9b347   7 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
615dd81bbe53   7 minutes ago   /bin/sh -c #(nop)  MAINTAINER cml<507545713@…   0B        
300e315adb2f   2 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      2 months ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      2 months ago    /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB 
6.4.2、构建tomcat镜像
  • 上传tomcat 和 jdk 到linux服务器
[root@izbp1jbs6mikenptx3k00bz my-tomcar9]# pwd
/home/dokcerfile/my-tomcar9
[root@izbp1jbs6mikenptx3k00bz my-tomcar9]# ll
total 151592
-rw-r--r-- 1 root  root   11483588 Feb 22 18:49 apache-tomcat-9.0.43.tar.gz
-rw-r--r-- 1 root  root        796 Feb 22 22:13 Dockerfile
-rw-r--r-- 1 root  root  143722924 Feb 22 19:00 jdk-8u281-linux-x64.tar.gz

  • 编写Dockerfile
FROM centos
MAINTAINER cml<507545713@qq.com>

# 把java与tomcat添加到容器中
ADD jdk-8u281-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.43.tar.gz /usr/local/

# 安装vim编辑器
RUN yum -y install vim

# 设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH

# 配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_281
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.43
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.43
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA/lib:$CATALINA_HOME/bin

# 容器运行时监听端口
EXPOSE 8080

# 启动时运行tomcat
CMD /usr/local/apache-tomcat-9.0.43/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.43/bin/logs/catalina.out
  • build镜像
[root@izbp1jbs6mikenptx3k00bz my-tomcar9]# docker build -t my-tomcat9 .
  • 启动镜像
[root@izbp1jbs6mikenptx3k00bz my-tomcar9]# docker run -d -p 3344:8080 --name my-tomcat9 -v /home/dokcerfile/my-tomcar9/test:/usr/local/apache-tomcat-9.0.43/webapps/test -v /home/dokcerfile/my-tomcar9/logs/:/usr/local/apache-tomcat-9.0.43/logs --privileged=true my-tomcat9
  • 访问tomcat

image.png

6.5、发布镜像

6.5.1、dockerhub
  • linux登录docker
[root@izbp1jbs6mikenptx3k00bz ~]# docker login -u 507545713
  • 发布镜像
[root@izbp1jbs6mikenptx3k00bz ~]# docker images
REPOSITORY         TAG       IMAGE ID       CREATED        SIZE
507545713/tomcat   9.0       f2fc7d0b29b2   12 hours ago   640MB

[root@izbp1jbs6mikenptx3k00bz ~]# docker push 507545713/tomcat:9.0
6.5.1、阿里云镜像服务
  • 阿里云容器镜像服务
  • 创建命名空间

image.png

  • 创建镜像仓库

image.png

  • 操作步骤参考官方文档

image.png

7、Dokcer网络

7.1、Dokcer0

image.png

  • 测试
# 启动tomcat01
docker run -d -P --name tomcat01 tomcat

# 查看容器内部网络地址,发现容器启动的时候会得到一个eth0@if99 ip地址,docker分配的
[root@izbp1jbs6mikenptx3k00bz ~]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
98: eth0@if99: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

# linux ping docker容器内部
[root@izbp1jbs6mikenptx3k00bz ~]# ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.057 ms

原理

  • 我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0 桥接模式,使用 veth-pair技术

  • 再次测试ip addr

image.png

  • 启动tomcat02,发现又对了一对网卡

image.png

  • tomcat02 ip addr

image.png

# 发现这个容器带来网卡都是一对对的
# veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连接协议,一端彼此相连
# veth-pair 充当一个桥梁,连接各种虚拟网络设备
  • 测试tomcat01 和 tomcat02 能否ping通
[root@izbp1jbs6mikenptx3k00bz ~]# docker exec -it tomcat01 ping 172.18.0.1
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=0.070 ms

# 容器和容器之间是可以互相ping通的

image.png

  • 结论:tomcat01和tomcat02,是公用的一个路由器docker0,所有容器不指定容器的情况下,都是docker路由的,docker会给我们的容器分配一个默认的可用ip

image.png

  • 只要容器删了对应的一对网桥就没了
  • 启动tomcat01 tomcat02 用tomcat01 ping tomcat02,无法ping通
[root@izbp1jbs6mikenptx3k00bz ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED       STATUS         PORTS                     NAMES
c74538b006c1   tomcat    "catalina.sh run"   5 hours ago   Up 3 minutes   0.0.0.0:49158->8080/tcp   tomcat02
f65f8ec0d264   tomcat    "catalina.sh run"   6 hours ago   Up 3 minutes   0.0.0.0:49157->8080/tcp   tomcat01
[root@izbp1jbs6mikenptx3k00bz ~]# dokcer exec -it tomcat01 ping tomcat02
-bash: dokcer: command not found
  • 启动tomcat01 启动tomcat02 --link 连接tomcat01,用tomcat02 ping tomcat01 可以ping通
[root@izbp1jbs6mikenptx3k00bz ~]# docker run -d -P --name tomcat01 tomcat
6f5539ba86e78377ec0406dd8e6b1bc915954a4a174572d35c19dc15fb569c83
[root@izbp1jbs6mikenptx3k00bz ~]# docker run -d -P --name tomcat02 --link tomcat01 tomcat
deddaadf62030a875caf8d7596cebf9eee39c82ccaffbffe271681f5e540a7b4
[root@izbp1jbs6mikenptx3k00bz ~]# docker exec -it tomcat02 ping tomcat01
PING tomcat01 (172.18.0.2) 56(84) bytes of data.
64 bytes from tomcat01 (172.18.0.2): icmp_seq=1 ttl=64 time=0.092 ms
64 bytes from tomcat01 (172.18.0.2): icmp_seq=2 ttl=64 time=0.076 ms
  • 查看hosts配置,--link就是我们在tomcat02zhong 增加了一个tomcat01(172.18.0.2)的映射
[root@izbp1jbs6mikenptx3k00bz ~]# docker exec -it tomcat02 cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.18.0.2	tomcat01 6f5539ba86e7
172.18.0.3	deddaadf6203

7.3、自定义网络

  • 查看所有的docker网络
[root@izbp1jbs6mikenptx3k00bz ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
c78db2fe3f94   bridge    bridge    local
769b9db06398   host      host      local
e40b892c0ac8   none      null      local
  • 网络模式

    • bridge 桥接(默认)
    • none 不配置网络
    • host 和宿主机共享网络
  • 测试

# 我们直接启动的命令 --net bridge (docker0)是默认启动的
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat

# docker0 特点,默认的,域名不能访问,--link可以打通连接

# 自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

[root@izbp1jbs6mikenptx3k00bz ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
c78db2fe3f94   bridge    bridge    local
769b9db06398   host      host      local
ecfe36802163   mynet     bridge    local   # 自定义网络
e40b892c0ac8   none      null      local
  • 查看自己创建的网络
[root@izbp1jbs6mikenptx3k00bz ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "ecfe36802163f114bba1897312101f130319ff2e9b960a958de90a1633f59d14",
        "Created": "2021-02-27T15:27:26.539448898+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
  • 启动tomcat01 和 tomcat02 使用自定义网络,使用tomcat01 ping tomcat02
[root@izbp1jbs6mikenptx3k00bz ~]# docker run  -d -P --name tomcat01-mynet --net mynet tomcat
10ee97ca1b8ad04f4628c25b9947a08af834d054a28f280dddfde22038849dce
[root@izbp1jbs6mikenptx3k00bz ~]# docker run  -d -P --name tomcat02-mynet --net mynet tomcat
ace61514f044477f3db7716d38fa1abc938a291a23bc7b52dae61b300c381ede

# 不使用 --link 也可以ping名字了
[root@izbp1jbs6mikenptx3k00bz ~]# docker exec -it tomcat01-mynet ping tomcat02-mynet
PING tomcat02-mynet (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat02-mynet.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.153 ms
64 bytes from tomcat02-mynet.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.074 ms
  • 不同的集群使用不同的网络保证集群的安全和健康

7.3、网络连通

  • 容器连接到网络(connect)

image.png

  • 启动tomcat01 使用docker0网络
docker run -d -P --name tomcat01 tomcat

[root@izbp1jbs6mikenptx3k00bz ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED              STATUS              PORTS                     NAMES
4aef405af1a8   tomcat    "catalina.sh run"   About a minute ago   Up About a minute   0.0.0.0:49159->8080/tcp   tomcat01
ace61514f044   tomcat    "catalina.sh run"   3 minutes ago        Up 3 minutes        0.0.0.0:49158->8080/tcp   tomcat02-mynet
10ee97ca1b8a   tomcat    "catalina.sh run"   3 minutes ago        Up 3 minutes        0.0.0.0:49157->8080/tcp   tomcat01-mynet
  • 测试打通tomcat01 --> mynet网络
# tomcat01容器连接到mynet网络
docker network connect mynet tomcat01

# 查看mynet网络
docker network inspect mynet

# tomcat01 放到了 mynet网络下 ,一个容器两个ip
        "Containers": {
            "10ee97ca1b8ad04f4628c25b9947a08af834d054a28f280dddfde22038849dce": {
                "Name": "tomcat01-mynet",
                "EndpointID": "492e4d8f1e907801e665c503e45a5ee40f66114670dae15c9dfb8d0c6c2de526",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "4aef405af1a80ea21c927e5c03eca970215372904e724a9060ee25006d553281": {
                "Name": "tomcat01",
                "EndpointID": "047ffeed0bbcf2129332b37a4de85eec90bf6fb20bde0d7254ace48d7914cb61",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
            },
            "ace61514f044477f3db7716d38fa1abc938a291a23bc7b52dae61b300c381ede": {
                "Name": "tomcat02-mynet",
                "EndpointID": "7a10a022d61daae53088b840f85bb9e504b14afb9a56948e16380cc00f0f632e",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        }
  • tomcat01 ping tomcat01-mynet
[root@izbp1jbs6mikenptx3k00bz ~]# docker exec -it tomcat01 ping tomcat01-mynet
PING tomcat01-mynet (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat01-mynet.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from tomcat01-mynet.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.066 ms
posted @ 2022-11-06 22:34  youmo~  阅读(142)  评论(0编辑  收藏  举报