Docker容器数据卷与DockerFile已经Docker网络原理

发布时间 2023-04-22 16:41:08作者: LycCj

5. Docker 容器数据卷:

5.1什么是Docker的容器数据卷:

将应用和环境打包成一个镜像

数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

例如:Mysql,容器删了,如果数据存放在容器当中,那么就是删库跑路了,因此我们希望Mysql的数据可以存储在本地当中!

要求:容器之间需要有数据共享的技术!Docker容器中产生的数据可以同步到本地当中!

解决上述的要求我们可以采用Docker当中的卷技术,也就是目录挂载,将我们容器内的目录挂载到linux目录上面。

总结:容器间的持久化和同步操作!容器间的数据也是可以共享的!

5.2 使用数据卷:

方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash

查看容器运行的详细的信息:

docker inspect  [contained ID]

image-20230421145313179

测试同步:

image-20230421150005341

再来测试:

1.停止容器
2.主机上修改文件
3.启动容器
4.容器内的数据依旧是同步的!

5.3 实战部署Mysql:

解决Mysql的数据持久化问题!

将Mysql的容器与数据分开放置,数据需要挂载到外部的文件

[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker search mysql
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Pull complete 
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
0ceb82207cd7: Pull complete 
37f2405cae96: Pull complete 
e2482e017e53: Pull complete 
70deed891d42: Pull complete 
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# 

详细运行流程:

-d      # 后台运行
-p      # 端口隐射
-v      # 卷挂载
-e      # 环境配置
--name  # 容器的名字
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker run -d -p 3344:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

image-20230421152343034

再此查看发现已经形成了数据卷挂载到了外部:

image-20230421152652279

5.4 具名挂载与匿名挂载:

# 匿名挂载
-v 容器内路径(不指定主机的路径)
docker run -d -P --name nginx01 -v /etc/nginx nginx     # -P 随机指定端口
[root@iZ2ze6y7ulztxu0enw2s8sZ data]# docker volume ls
DRIVER    VOLUME NAME
local     1c76bca13ae3c096e7409995cb6644a8eeaa3601bd0cd54865864672ed9e65d0
local     17dc3ab8640c521aa44970d006abb5e6cf4c8d85e2a88a55c9b5fe0b073ecd00

# 这里发现有很多的VOLUME NAME其实就是真实存在的目录,因为我们-v后面只写了容器内路径并没有写容器外的路径

[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
26da1ec7d499        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:32769->80/tcp   nginx02
486de1da03cb        nginx               "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes        0.0.0.0:32768->80/tcp   nginx01
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER              VOLUME NAME
local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
local               juming-nginx
# 通过-v 卷名:容器内的路径
# 查看一下这个卷
# docker volume inspect juming-nginx
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume inspect juming-nginx
[
  {
      "CreatedAt": "2020-08-12T18:15:21+08:00",
      "Driver": "local",
      "Labels": null,
      "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
      "Name": "juming-nginx",
      "Options": null,
      "Scope": "local"
  }
]

所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxxx/_data

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的是具名挂载

# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v  容器内路径                   # 匿名挂载
-v  卷名:容器内路径               # 具名挂载
-v /主机路径:容器内路径            # 指定路径挂载

拓展:

# 通过 -v 容器内容路径 ro rw 改变读写权限
ro  readonly    # 只读
rw  readwrite   # 可读可写
 
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
 
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内容无法操作

6. DockerFile:

紧跟第五小节方式一:

方式二:采用DockerFile的方式来进行

6.1 初识DockerFile:

DockerFile就是用来构建docker的镜像的文件!命令脚本

通过这个脚本可以生成镜像,镜像是一层层的,脚本一个个的命令,每一个命令都是一层!

[root@iZ2ze6y7ulztxu0enw2s8sZ docker-test-volume]# vim dockerfile1
# 创建一个dockerfile文件, 名字可以随机
# 文件的内容 指定(大写) 参数
 
FROM centos
 
VOLUME ["volume01", "volume02"]
 
CMD echo "----end----"
CMD /bin/bash
 
# 这里的每一个命令都是镜像的一层!
[root@iZ2ze6y7ulztxu0enw2s8sZ docker-test-volume]# ls
dockerfile1
[root@iZ2ze6y7ulztxu0enw2s8sZ docker-test-volume]# cat dockerfile1 
FROM centos

VOLUME ["volume01","volume2"]

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

CMD /bin/bash

[root@iZ2ze6y7ulztxu0enw2s8sZ docker-test-volume]# 
[root@iZ2ze6y7ulztxu0enw2s8sZ docker-test-volume]# docker build -f dockerfile1 -t liuyucheng/centos:1.0 .

image-20230421161032141

image-20230421162120342

这个卷和外部一定有一个同步的目录!

docker inspect [contained ID]

image-20230421162308410

6.2 数据卷容器:

解决的是多个Mysql同步数据的问题!

也就是利用一个父容器给另外多个子容器提供数据,实现数据的共享,因此此时的父容器叫作数据卷容器。

image-20230421162807863

我们首先建立两个容器:

docker run -it --name docker01 liuyucheng/centos:1.0
docker run -it --name docker2 --volumes-from docker01  liuyucheng/centos:1.0

测试:在docker01的volume01目录中创建文件,在docker2中是否会被自动创建同步,答案是可以

image-20230421164045207

结论

容器间的数虽然是依赖关系,但是只要更新就是双向拷贝概念,父容器删除文件,依赖父容器的子容器会依然持有响应的文件。

容器之间配置信息的传递, 数据卷容器的生命周期一直持续到没有容器使用为止。

但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

6.3再理解DockerFile:

dockerFile是用来构建docker镜像的文件!命令参数脚本!

步骤:

1.编写一个dockerFile文件
2.docker build构建一个镜像
3.docker run 运行镜像
4.docker push发布镜像(Docker Hub, 阿里云镜像)

查看centos镜像制作方式:

image-20230421190403506

image-20230421190430839

很多官方镜像都像是基础包,很多功能都不具备,我们通常会自己搭建自己的镜像!官方既然可以制作镜像,能我们一样可以!

6.4 DockerFile的构建过程:

基础知识:

(1)每个保留关键字(指令)都是必须大写字母
(2)执行从上到下顺序执行
(3)# 表示注释
(4)每个指令都会创建提交一个新的镜像层,并提交!

img

dockerFile是面向开发的, 我们以后要发布项目, 做镜像, 就需要编写dockefile文件, 这个文件十分简单!

Docker镜像逐渐成为企业的交互标准,必须要掌握!

步骤:开发,部署, 运维..... 缺一不可!

DockerFile: 构建文件, 定义了一切的步骤,源代码

DockerImages: 通过DockerFile构建生成的镜像, 最终发布和运行的产品!

Docker容器:容器就是镜像运行起来提供服务器

6.5 DockerFile指令说明:

image-20230421192652691

FROM            # 基础镜像,一切从这里开始构建
MAINTAINER      # 镜像是谁写的, 姓名+邮箱
RUN             # 镜像构建的时候需要运行的命令
ADD             # 步骤, tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR         # 镜像的工作目录
VOLUME          # 挂载的目录
EXPOSE          # 保留端口配置
CMD             # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT      # 指定这个容器启动的时候要运行的命令, 可以追加命令
ONBUILD         # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY            # 类似ADD, 将我们文件拷贝到镜像中
ENV             # 构建的时候设置环境变量!

6.6 构建自己的centos镜像:

官方所给出的centos镜像没有vim命令,没有ifconfig判定自己IP地址命令,因此需要自己构建自己的镜像:

FROM centos:7

MAINTAINER liuyucheng<cqlyc1117@163.com>

ENV MYPATH /usr/local (希望已进入centos系统就显示的所在目录)

WORKDIR $MYPATH

RUN yum -y install vim

RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

image-20230421195457803

我们再次进入自己所制作的centos镜像:

docker run -it mycentos:1.0

命令均可以运行了:

image-20230421195849636

我们还可以通过命令来了解镜像制作的历史步骤:

docker history [contained ID]

6.7 将centos镜像进行发布

1.发布镜像到DockerHub

(1)地址:What is Docker Hub? | Docker 注册自己的账号

(2)确定自己账号是否可以登录:

image-20230422095009606

(3)在我们自己的服务器上提交自己的镜像:

[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

image-20230422095417901

采用将镜像进行上传:

# push到我们的服务器上
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker push mycentos:1.0
The push refers to repository [docker.io/library/mycentos]
a7bd9a2294ff: Preparing 
d37958739774: Preparing 
5f70bf18a086: Preparing 
174f56854903: Preparing 
denied: requested access to the resource is denied

# push镜像的问题?
The push refers to repository [docker.io/1314520007/diytomcat]
An image does not exist locally with the tag: 1314520007/diytomcat
 
# 解决,增加一个tag
docker tag diytomcat 1314520007/tomcat:1.0

image-20230422095736354

增加tag信息:

image-20230422100648041

一般dockerHub上传都很慢,我们需要耐心的等待.

2.将我们的镜像发布到阿里云镜像服务上
1.登录阿里云
2.找到容器镜像服务
3.创建命名空间
4.创建容器镜像

(1)创建命名空间:

image-20230422101925138

(2)创建容器镜像:

image-20230422102204483

image-20230422102227715

(3)点击仓库名称可以很清楚的看到如何一步步制作自己的镜像并发布到阿里云镜像服务当中

(4)镜像真的推送成功以后就会在镜像版本栏目有对应自己的镜像

6.8 小结:

image-20230422103409386

7. Docker 的网络原理:

7.1 Docker0网络:

image-20230422104720809

三个网络:
docker是如何处理容器的网络访问的?

我们在测试Kibana连接ES时就留下了一个问题:

image-20230422105042058

# 查看容器内的网络地址 IP addr:
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker exec -it tomcat02 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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
46: eth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

注意这里可能会报以下错误:

因为我们下载的Tomcat是纯净的系统

[root@localhost ~]# docker exec -it tomcat01 ip addr
OCI runtime exec failed: exec failed: unable to start container process: exec: "ip": executable file not found in $PATH: unknown

解决方案参考博客:

(90条消息) Docker 报错:OCI runtime exec failed: exec failed: unable to start container process: exec: “xxx“: exec_GaleTeng的博客-CSDN博客

# 会发现容器启动的时候得到一个eth0@if47 ip地址,其实这就是docker分配的
# 思考一个问题:linux能不能ping通容器?
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.039 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.041 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.046 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.049 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.046 ms
64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.059 ms
64 bytes from 172.17.0.2: icmp_seq=7 ttl=64 time=0.050 ms
64 bytes from 172.17.0.2: icmp_seq=8 ttl=64 time=0.044 ms
64 bytes from 172.17.0.2: icmp_seq=9 ttl=64 time=0.045 ms
64 bytes from 172.17.0.2: icmp_seq=10 ttl=64 time=0.044 ms
64 bytes from 172.17.0.2: icmp_seq=11 ttl=64 time=0.048 ms
64 bytes from 172.17.0.2: icmp_seq=12 ttl=64 time=0.046 ms
64 bytes from 172.17.0.2: icmp_seq=13 ttl=64 time=0.049 ms
64 bytes from 172.17.0.2: icmp_seq=14 ttl=64 time=0.046 ms
--- 172.17.0.2 ping statistics ---
29 packets transmitted, 29 received, 0% packet loss, time 28000ms
rtt min/avg/max/mdev = 0.039/0.048/0.059/0.006 ms
# linux可以ping通docker容器内部
原理

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

我们再次测试:ip addr:

image-20230422140904507

# 我们发现这个容器带来网卡,都是一对对的
# veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
# 正因为有这个特性,veth-pair充当一个桥梁, 连接各种虚拟网络设备
# OpenStac, Docker容器之间的链接,OVS的链接, 都是使用veth-pair技术

再准备一个tomcat03:

image-20230422143028534

我们测试一下Tomcat02与Tomcat03能否能ping的通:

[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker exec -it tomcat02 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.049 ms
^C
--- 172.17.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.049/0.060/0.079/0.013 ms

结论是:容器与容器之间是可以相互ping通的。

先来查看下容器的信息:

image-20230422143634767

绘制一个网络模型图:

image-20230422144801106

结论:tomcat02与tomcat03是共用一个路由器,都是docker0

所有容器不指定网络的情况下,都是docker0路由的,docker会给我门容器分配一个默认的可用的IP

注意docker分配IP时候给我们显示的是采用CIDR无分类域间路由表示法。

思考一个场景:我们编写一个微服务, database url = ip;如果不重启项目,但是我们docker中ip地址改变,我们希望微服务的Mybatis中参数配置也需要动态更新。
类似:
 SpringCloudAlibaba中:Feign:我们采用的是根据服务名来进行远程访问,而不是根据IP地址

因为我们先试一下能否根据names 来ping通:发现不可行

image-20230422150506075

[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# 

解决方案:采用 --link:

[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P  --name tomcat05 --link tomcat03 tomcat
3a2bcaba804c5980d94d168457c436fbd139820be2ee77246888f1744e6bb473
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED             STATUS             PORTS                                         NAMES
77ece71ab4f4   tomcat    "catalina.sh run"   10 minutes ago      Up 10 minutes      0.0.0.0:32771->8080/tcp, :::32771->8080/tcp   tomcat05
b44e777d68b9   tomcat    "catalina.sh run"   11 minutes ago      Up 11 minutes      0.0.0.0:32770->8080/tcp, :::32770->8080/tcp   tomcat04
33967ef8891b   tomcat    "catalina.sh run"   About an hour ago   Up About an hour   0.0.0.0:32769->8080/tcp, :::32769->8080/tcp   tomcat03
5c3ab0050e8e   tomcat    "catalina.sh run"   4 hours ago         Up 4 hours         0.0.0.0:32768->8080/tcp, :::32768->8080/tcp   tomcat02
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat05 ping tomcat03
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.129 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.100 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.110 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.107 ms
 
# 反向可以ping通吗?
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat03 ping tomcat05
ping: tomcat03: Name or service not known

我们需要查看一下当前docker0一些信息:

[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
05af09696ded   bridge    bridge    local
24589a199216   host      host      local
3db1180720b1   none      null      local
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker network inspect 05af09696ded

image-20230422153011022

其实这个tomcat05就是在本地配置了tomcat03的配置:

[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker exec -it tomcat05 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.17.0.3	tomcat03 33967ef8891b
172.17.0.5	77ece71ab4f4

本质探究:--link 就是我们在hosts配置中增加了一个172.17.0.3 tomcat03 33967ef8891b

我们现在使用docker已经不建议使用--link了!

我们自定义网络不使用docker0

7.3 自定义网络:

容器互联:

查看所有的docker网络

image-20230422154135159

网络模式:

bridge: 桥接模式,桥接 docker 默认,自己创建的也是用brdge模式
none: 不配置网络
host: 和宿主机共享网络
container:容器网络连通!(用的少, 局限很大)

测试

# 我们直接启动的命令默认有一个 --net bridge,而这个就是我们的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
 
# docker0特点,默认,容器名不能访问, --link可以打通连接!
# 我们可以自定义一个网络!
# --driver bridge
# --subnet 192.168.0.0/16 可以支持255*255个网络 192.168.0.2 ~ 192.168.255.254
# --gateway 192.168.0.1
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
16632a0c84f979c2c412541d0493d4aa718f1de114d8950d5a4da1626c34d5f5
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
05af09696ded   bridge    bridge    local
24589a199216   host      host      local
16632a0c84f9   mynet     bridge    local
3db1180720b1   none      null      local
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# 

测试看自己的网络:

[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "16632a0c84f979c2c412541d0493d4aa718f1de114d8950d5a4da1626c34d5f5",
        "Created": "2023-04-22T15:49:38.492953555+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": {}
    }
]
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# 

在自己创建测网络下创建两个tomcat容器:

[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
9662fbba0282c21a72221e112f9dbcfedfc0793baee4a5d7be49f69ace8f55bc
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED         STATUS        PORTS                                         NAMES
9662fbba0282   tomcat    "catalina.sh run"   2 seconds ago   Up 1 second   0.0.0.0:32772->8080/tcp, :::32772->8080/tcp   tomcat-net-01
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
0d3617644b16dc02e5603b496ac1186c1ca850b2f22c42462052b329f73b1a42
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                         NAMES
0d3617644b16   tomcat    "catalina.sh run"   2 seconds ago    Up 1 second     0.0.0.0:32773->8080/tcp, :::32773->8080/tcp   tomcat-net-02
9662fbba0282   tomcat    "catalina.sh run"   25 seconds ago   Up 24 seconds   0.0.0.0:32772->8080/tcp, :::32772->8080/tcp   tomcat-net-01
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "16632a0c84f979c2c412541d0493d4aa718f1de114d8950d5a4da1626c34d5f5",
        "Created": "2023-04-22T15:49:38.492953555+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": {
            "0d3617644b16dc02e5603b496ac1186c1ca850b2f22c42462052b329f73b1a42": {
                "Name": "tomcat-net-02",
                "EndpointID": "74aabe369e9a76c889cd939c6ae15f69a09561a8fe39df7766969edfcae419e4",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "9662fbba0282c21a72221e112f9dbcfedfc0793baee4a5d7be49f69ace8f55bc": {
                "Name": "tomcat-net-01",
                "EndpointID": "44e32396dd0c02437db46a2588335eb7134d3c1803f36d76fc0cfabac7c02ef1",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
}

我们再次测试:

[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.045 ms
64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.046 ms
64 bytes from 192.168.0.3: icmp_seq=5 ttl=64 time=0.045 ms
64 bytes from 192.168.0.3: icmp_seq=6 ttl=64 time=0.046 ms
64 bytes from 192.168.0.3: icmp_seq=7 ttl=64 time=0.068 ms
^C
--- 192.168.0.3 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 5999ms
rtt min/avg/max/mdev = 0.045/0.051/0.068/0.009 ms
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.035 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.049 ms
^C
--- tomcat-net-02 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.035/0.043/0.049/0.006 ms
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# 

我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络

好处:

redis - 不同的集群使用不同的网络,保证集群时安全和健康的

mysql - 不同的集群使用不同的网络,保证集群时安全和健康的

即redis所有的节点处于假设192.161.0.0,mysql所有的节点处于192.161.0.0,他们之间可以互联嘛?

7.4 网络联通:

先配置环境:

[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                         NAMES
0d3617644b16   tomcat    "catalina.sh run"   22 minutes ago   Up 22 minutes   0.0.0.0:32773->8080/tcp, :::32773->8080/tcp   tomcat-net-02
9662fbba0282   tomcat    "catalina.sh run"   22 minutes ago   Up 22 minutes   0.0.0.0:32772->8080/tcp, :::32772->8080/tcp   tomcat-net-01
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker run -d -P --name tomcat01 tomcat
c4a46b91068e0c72e3e7c5f03a019b15405164474a2ce227a12c3ff43459cb67
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker run -d -P --name tomcat02 tomcat
e9cc9677d0cf954f65106ace36b70ef87ea5c8f0ad9e414c65e750698a8dad93
[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                         NAMES
e9cc9677d0cf   tomcat    "catalina.sh run"   6 seconds ago    Up 5 seconds    0.0.0.0:32775->8080/tcp, :::32775->8080/tcp   tomcat02
c4a46b91068e   tomcat    "catalina.sh run"   12 seconds ago   Up 12 seconds   0.0.0.0:32774->8080/tcp, :::32774->8080/tcp   tomcat01
0d3617644b16   tomcat    "catalina.sh run"   23 minutes ago   Up 23 minutes   0.0.0.0:32773->8080/tcp, :::32773->8080/tcp   tomcat-net-02
9662fbba0282   tomcat    "catalina.sh run"   23 minutes ago   Up 23 minutes   0.0.0.0:32772->8080/tcp, :::32772->8080/tcp   tomcat-net-01

方法:
image-20230422162850550

image-20230422162925600

测试打通tomcat01到mynet:

image-20230422163125615

[root@iZ2ze6y7ulztxu0enw2s8sZ ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.063 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.050 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.048 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.051 ms
^C
--- tomcat-net-01 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.048/0.053/0.063/0.005 ms