Docker高级管理

这里写目录标题

Docker 容器的网络模式

当项目大规模使用 Docker 时,容器通信的问题也就产生了。要解决容器通信问题,必须先了解很多关于网络的知识。Docker 的网络模式非常丰富,可以满足不同容器的通信要求,下表列出了这些网络模式的主要信息

  • host 模式 --network host 容器直接使用宿主机的网络栈,没有独立的网络命名空间,网络性能高,但容器与宿主机共享网络资源,易出现端口冲突
  • container 模式 --network container:<已有容器名或 ID> 新容器共享指定已有容器的网络命名空间,两个容器网络配置相同,适用于需要紧密耦合通信的容器组合
  • none 模式 --network none 容器仅有一个 lo 回环接口,无任何外部网络连接,适用于对网络安全性要求极高或需手动配置网络的场景
  • bridge 模式 默认模式,可通过 -d bridge 手动指定(一般省略) Docker 默认网络模式,创建 docker0 虚拟网桥,容器通过 veth 设备连到该网桥,容器有独立 IP,借助主机 NAT 访问外部网络
  • Overlay 模式 -d overlay 用于 Docker Swarm 集群,基于 VXLAN 技术创建跨主机的虚拟覆盖网络,实现不同宿主机上容器间的通信
  • macvlan 模式 -d macvlan,还需指定 --subnet、--gateway 和 -o parent=<宿主机物理网卡> 为容器分配唯一 MAC 地址,使其像独立物理设备,直接连接宿主机物理网络接口,绕过 docker0 网桥,提高网络性能
  • 自定义网络模式 docker network create 结合如 --subnet、--gateway、--ip-range 等参数 用户可根据需求灵活配置网络参数,如子网、网关、IP 范围等,创建符合特定要求的网络

Bridge 模式

当 Docker 安装完成后,会自动创建一个名为 docker8 的虚拟网桥。在 Bridge 模式下,新创建的容器会通过一个虚拟以太网设备对(veth pair)连接到 dockerg 网桥上

Docker 守护进程会从预定义的子网中为每个容器分配一个唯一的 IP 地址。容器可以通过 dockere网桥与宿主机以及其他连接到该网桥的容器进行通信

当容器需要访问外部网络时,宿主机的内核会通过网络地址转换(NAT)将容器的私有 IP 地址转换为宿主机的公共 IP 地址,从而实现容器与外部网络的通信

bridge 模式是 docker 的默认网络模式,不写-net 参数,就是 bridge 模式。使用 docker run -p时,docker 实际是在 iptables 做了 DNAT 规则,实现端口转发功能。可以使用 iptables -t nat -vnl查看。bridge 模式如下图所示:

如果你之前有 Docker 使用经验,你可能已经习惯了使用--link 参数来使容器互联

随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数

bash 复制代码
[root@bogon ~]# ls
anaconda-ks.cfg  images  install_docker_Euler24.sh
[root@bogon ~]# cd images/
[root@bogon images]# ls
centos_7.tar       httpd_latest.tar   nginx_latest.tar
exp_docker_img.sh  imp_docker_img.sh
[root@bogon images]# bash imp_docker_img.sh 
正在导入镜像 centos_7.tar
174f56854903: Loading layer  211.7MB/211.7MB
Loaded image: centos:7
已成功导入镜像 centos_7.tar

正在导入镜像 exp_docker_img.sh
archive/tar: invalid tar header
已成功导入镜像 exp_docker_img.sh

正在导入镜像 httpd_latest.tar
650abce4b096: Loading layer     84MB/84MB
2309cdaf4afb: Loading layer  3.072kB/3.072kB
849b101b0e3b: Loading layer  5.103MB/5.103MB
a30707f342ec: Loading layer  60.41MB/60.41MB
087e3023406c: Loading layer  3.584kB/3.584kB
Loaded image: httpd:latest
已成功导入镜像 httpd_latest.tar

正在导入镜像 imp_docker_img.sh
unexpected EOF
已成功导入镜像 imp_docker_img.sh

正在导入镜像 nginx_latest.tar
4dc5cd799a08: Loading layer  62.21MB/62.21MB
e161c82b34d2: Loading layer  3.584kB/3.584kB
83ba6d8ffb8c: Loading layer  4.608kB/4.608kB
d8466e142d87: Loading layer  3.584kB/3.584kB
101af4ba983b: Loading layer  7.168kB/7.168kB
Loaded image: nginx:latest
已成功导入镜像 nginx_latest.tar
bash 复制代码
[root@bogon ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
httpd        latest    daab1fa13f86   2 years ago   145MB
nginx        latest    904b8cb13b93   2 years ago   142MB
centos       7         eeb6ee3f44bd   3 years ago   204MB
创建一个叫 my-net 的 bridge 类型的网络
bash 复制代码
[root@bogon ~]# docker network create -d bridge my-net
c55c526cf1ab95069a9b889d010347b9352d57dc7859d9afc7199384bab60731
查看都有哪些网路
bash 复制代码
[root@bogon ~]#  docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
eebe914d507a   bridge    bridge    local
31baffa1a5a3   host      host      local
c55c526cf1ab   my-net    bridge    local
e3dc131fa07d   none      null      local
运行一个容器并连接到新建的 my-net 网络
bash 复制代码
[root@bogon ~]# docker run -dit --rm --name zzk --network my-net busybox sh -c "top"
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
90b9666d4aed: Pull complete 
Digest: sha256:f85340bf132ae937d2c2a763b8335c9bab35d6e8293f70f606b9c6178d84f42b
Status: Downloaded newer image for busybox:latest
73f4cae82d551f3f468c2c535fae3a08eeae16f11f138355eef026a8808ead8e
运行一个容器并加入到 my-net 网络
bash 复制代码
[root@bogon images]# docker network create -d bridge aaa
ae37fa19dbe5f21a1bffc4dd916eeea6336a6bccd061bacc2f960f076691af9d
[root@bogon images]# docker run -it --rm --name wangwu --net=aaa busybox sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
90b9666d4aed: Pull complete 
Digest: sha256:f85340bf132ae937d2c2a763b8335c9bab35d6e8293f70f606b9c6178d84f42b
Status: Downloaded newer image for busybox:latest
bash 复制代码
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:00:02  
          inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:15 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1322 (1.2 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Host 模式

使用 Host 模式的容器会直接使用宿主机的网络栈,容器没有独立的网络命名空间,而是与宿主机共享相同的 IP 地址、端口等网络资源

由于容器和宿主机共享网络栈,因此容器可以直接使用宿主机的网络接口,不存在网络地址转换和网桥转发的开销,网络性能较高。但同时也意味着容器之间以及容器与宿主机之间的网络隔离性较差,可能会出现端口冲突等问题

网络隔离 容器直接使用宿主机的网络命名空间,无隔离

核心组件 共享宿主机的网卡、IP、端口、路由表等

通信机制 容器内应用直接通过宿主机网络接口通信,无需 NAT 转发

端口管理 容器暴露的端口直接占用宿主机端口,需手动避免冲突

性能优势 消除网络虚拟化开销,性能接近原生应用

数据流向 容器 → 宿主机网卡 → 外部网络

如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的

运行容器连接到该网络
bash 复制代码
[root@bogon images]# docker run -itd --net=host --name host1 busybox sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
90b9666d4aed: Pull complete 
Digest: sha256:f85340bf132ae937d2c2a763b8335c9bab35d6e8293f70f606b9c6178d84f42b
Status: Downloaded newer image for busybox:latest
9779c7294a983278e90d411f7fff5d978c9400b86effae4d2db3bd864338f9c0

Coneainer 模式

Container 模式允许一个容器共享另一个容器的网络命名空间,即两个容器使用相同的网络配置,包括 IP 地址、端口等,利用这种模式使得容器共享统一的网络命名空间

网络隔离 多个容器共享同一个网络命名空间(IP、端口、路由表

核心组件 - 基础容器(Base Container):提供网络栈

  • 共享容器:加入基础容器的网络命名空间
    通信机制 容器间通过 localhost 直接通信,无需网络开销
    典型场景 - Sidecar 模式(如主应用与日志收集器)
  • 容器间高性能通信
    数据流向 容器 A → 共享网络栈 → 容器 B
创建并启动一个容器
bash 复制代码
[root@bogon ~]# docker run -itd --name AAA busybox
187d3e56cf733fa5c5bfc9e0d10bd9df11ce3e9f43147affbb91453eef7e187a
创建容器时指定模式为container并加入AAA这个命名空间中
bash 复制代码
[root@bogon ~]# docker run -itd --net=container:AAA --name aaaaaa busybox
326e8317afb761d4dc3d4843362b4d212e0af427bf98b35f827cc4b53dff1e7d

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 P,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 10网卡设备通信。 Container 模式示意图:

None 模式

在 None 模式下,容器只有一个 10 回环接口,没有任何外部网络连接。这种模式适用于那些不需要网络通信或者需要手动配置网络的场景,例如某些安全敏感的 应用程序

网络隔离 容器仅有 loopback 接口(127.0.0.1),无外部网络连接。

核心组件 空网络命名空间,无虚拟网卡或网桥。

适用场景 纯离线计算任务。敏感数据处理(需完全隔离)。

通信限制 无法与外部网络或其他容器通信,仅支持容器内部进程间通信

bash 复制代码
[root@bogon ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
eebe914d507a   bridge    bridge    local
31baffa1a5a3   host      host      local
e3dc131fa07d   none      null      local
[root@bogon ~]# docker run -itd --net=none --name zzk busybox sh
ee65e7850e28439cf34e98e588894a975c29b7db1b1f5544fa6bf65ca0ddf487
[root@bogon ~]# 
[root@bogon ~]# docker exec -it zzk sh
/ # ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

使用 none 模式,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。 None 模式示意图:

Overlay 模式

overlay 模式主要用于 Docker Swarm 集群,它允许容器在不同的 Docker 宿主机之间进行通信它基于 VXLAN(Virtual extensible Local Area Network)技术,在物理网络之上创建一个虚拟的覆盖网络

当容器之间进行通信时,数据包会被封装在 VXLAN 报头中,通过物理网络进行传输。在接收端,VXLAN报头会被解封装,还原出原始的数据包

0verlay 网络是分布式的,每个Docker宿主机上都有一个网络代理(如Docker的 docker_gwbridge)负责管理和转发数据包

Macvlan 模式

在 Macvlan 模式下,Docker 为每个容器分配一个唯一的 MAC 地址,使得容器在网络中看起来像个独立的物理设备

容器直接连接到宿主机的物理网络接口,终过了 docker8 网桥,从而提高了网络性能。容器可以直接与外部网络进行通信,就像一个独立的主机一样

每个容器都有自己独立的网络配置,与宿主机和其他容器之间相互隔离

bash 复制代码
[root@bogon ~]# docker network create -d macvlan --subnet=192.168.10.0/24 --gateway=192.168.10.100 -o parent=ens160 -o macvlan_mode=bridge macvlan111
3413220c21e9149093364ae9bc2fd0e807cc92946cf50a82669ef0bf93b772ac
[root@bogon ~]# 
[root@bogon ~]# docker network ls
NETWORK ID     NAME         DRIVER    SCOPE
eebe914d507a   bridge       bridge    local
31baffa1a5a3   host         host      local
3413220c21e9   macvlan111   macvlan   local
e3dc131fa07d   none         null      local
[root@bogon ~]# docker run -itd --net=macvlan111 --name zzz busybox sh
bfc89e018cbfeba8925c21e6923744c01cfda37d1c9faca1f423e272aa829d55
[root@bogon ~]# docker exec -it zzz sh
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:C0:A8:0A:02  
          inet addr:192.168.10.2  Bcast:192.168.10.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

自定义网络模式

除了上述内置的网络模式,你还可以使用 docker network create 命令创建自定义的 bridge 网络,以满足特定的网络需求,例如指定子网、网关、IP 范围等

此命令的主要目的是创建一个新的 Docker 网络,这个网络可以用于容器之间的通信。默认情况下,创建的是一个基于 bridge 驱动的网络

docker network create:这是 Docker 提供的用于创建网络的基础命令

--subnet=172.21.0.0/16:指定了该网络使用的子网范围。172.21.0.0/16 是一个 CIDR(无类别域间路由)表示法,意味着该子网的网络地址是 172.21.0.0,子网掩码为 255.255.0.0可以容纳 65534 个可用的IP 地址(2^(32 - 16)-2,减去网络地址和广播地址)。当容器连接到这个网络时,它们将从这个子网范围内分配IP 地址

--gateway=172.21.0.1:设置了该网络的网关地址。网关是容器访问外部网络(超出该子网范围)的出口点。当容器需要与子网外的网络进行通信时,数据包会被发送到这个网关地址进行转发。

my__custom_network:为新创建的网络指定了一个名称,后续在创建容器时,可以通过这个名称将容器连接到该网络

bash 复制代码
[root@bogon ~]# docker network create --subnet=172.100.0.0/16 --gateway=172.100.0.1 dufu
6a3106af9cf05ca1a439bdea9c9f580b2ee56da2e4e87720d0bf403589141ffd
[root@bogon ~]# 
[root@bogon ~]# docker network ls
NETWORK ID     NAME         DRIVER    SCOPE
eebe914d507a   bridge       bridge    local
6a3106af9cf0   dufu         bridge    local
31baffa1a5a3   host         host      local
3413220c21e9   macvlan111   macvlan   local
e3dc131fa07d   none         null      local
[root@bogon ~]# docker run -itd --name kkk --net=dufu busybox
9cd9658009d7a3c71ee64f83b9aa67b5c3dfcffbe7660ed0bda2e7d6d6268b5d
[root@bogon ~]# 
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS          PORTS     NAMES
9cd9658009d7   busybox   "sh"      23 seconds ago       Up 22 seconds             kkk
bfc89e018cbf   busybox   "sh"      4 minutes ago        Up 4 minutes              zzz
ee65e7850e28   busybox   "sh"      9 minutes ago        Up 9 minutes              zzk
187d3e56cf73   busybox   "sh"      12 minutes ago       Up 12 minutes             AAA
9779c7294a98   busybox   "sh"      15 minutes ago       Up 15 minutes             host1
[root@bogon ~]# 
[root@bogon ~]# docker exec -it kkk sh
/ # ping kkk
PING kkk (172.100.0.3): 56 data bytes
64 bytes from 172.100.0.3: seq=0 ttl=64 time=0.141 ms
64 bytes from 172.100.0.3: seq=1 ttl=64 time=0.053 ms
64 bytes from 172.100.0.3: seq=2 ttl=64 time=0.065 ms
^C
--- kkk ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.053/0.086/0.141 ms

端口映射

Docker 是一个开源的容器化平台,用于构建、运行和管理应用程序。它使用容器来打包应用程序及其依赖项,使得应用程序可以在不同的环境中快速、可靠地运行。在 Docker 中,端口映射是一个重要的特性,它允许容器内部的应用程序与宿主机进行通信。

Docker 的端口映射使用 -p 或 --publish 选项来实现。通过该选项,可以将容器内部的端口映射到宿主机上的某个端口。这样,容器内部的应用程序可以通过宿主机的端口来访问外部的网络或服务。宿主机上的端口号,表示容器内部的端口号。通过指定这两个端口号,Docker 会将容器内部的端口映射到宿主机的端口上。

端口映射

(1)-P(大写):指的是容器应用 PORT 随机映射到宿主机上的 PORT

自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动随机选择。但是如果连续启动多个容器的话,则下一个容器的端口默认是当前容器占用端口号 +1。

生产场景一般不使用随机映射,好处是由 docker 分配,宿主机端口不会冲突。

(2)-p(小写):(宿主机 PORT: 容器 PORT)

宿主机 IP 不写表示 "0.0.0.0",宿主机 PORT 不写表示随机端口,容器 PORT 必须指定,可以同时对多个端口进行映射绑定。

指定端口映射,在标准化场景下使用频率高。随机映射

端口的取值范围 32768--61000 之间

随机映射

bash 复制代码
[root@bogon ~]# docker run --rm -d -P nginx
2e4cc63b69e094dce74d12bd6a25d39e29f4e3b888dae5937041d2e510f95adf
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS                                     NAMES
2e4cc63b69e0   nginx     "/docker-entrypoint...."   14 seconds ago   Up 13 seconds   0.0.0.0:32768->80/tcp, :::32768->80/tcp   great_wu
9cd9658009d7   busybox   "sh"                      5 minutes ago    Up 5 minutes                                              kkk
9a80a49e3672   busybox   "sh"                      5 minutes ago    Up 5 minutes                                              songjiang
bfc89e018cbf   busybox   "sh"                      8 minutes ago    Up 8 minutes                                              zzz
10a2e82a240c   busybox   "sh"                      9 minutes ago    Up 9 minutes                                              lihei
ee65e7850e28   busybox   "sh"                      13 minutes ago   Up 13 minutes                                             zzk
326e8317afb7   busybox   "sh"                      15 minutes ago   Up 15 minutes                                             aaaaaa
187d3e56cf73   busybox   "sh"                      17 minutes ago   Up 17 minutes                                             AAA
9779c7294a98   busybox   "sh"                      20 minutes ago   Up 20 minutes                                             host1
[root@bogon ~]# 
[root@bogon ~]# curl 192.168.10.101:32768
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

宿主机随机映射

bash 复制代码
[root@bogon ~]# docker run --rm -d -p 80 nginx
4d050ae6077da95bfe9d2a2f9b7ba8f72c08c202bf8cf8262393ec5f6aa173a4
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS                                     NAMES
4d050ae6077d   nginx     "/docker-entrypoint...."   5 seconds ago    Up 4 seconds    0.0.0.0:32769->80/tcp, :::32769->80/tcp   jovial_sanderson
2e4cc63b69e0   nginx     "/docker-entrypoint...."   4 minutes ago    Up 4 minutes    0.0.0.0:32768->80/tcp, :::32768->80/tcp   great_wu

指定映射[root@bogon ~]# docker run --rm -d -p 8080:80 nginx

bash 复制代码
91d9902e14e17db7e089c149d06944547bcf84c938ab308c87a2d071162acec1
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED              STATUS              PORTS                                     NAMES
91d9902e14e1   nginx     "/docker-entrypoint...."   1 second ago         Up 1 second         0.0.0.0:8080->80/tcp, :::8080->80/tcp     pedantic_booth
4d050ae6077d   nginx     "/docker-entrypoint...."   About a minute ago   Up About a minute   0.0.0.0:32769->80/tcp, :::32769->80/tcp   jovial_sanderson
2e4cc63b69e0   nginx     "/docker-entrypoint...."   5 minutes ago        Up 5 minutes        0.0.0.0:32768->80/tcp, :::32768->80/tcp   great_wu

持久化

什么是数据卷

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过了容器的文件系统,直接将宿主机上的目录或文件挂载到容器内部。这意味着即使容器被删除,数据卷中的数据也不会丢失,从而实现了数据的持久化存储。

数据卷的作用

数据持久化

容器的生命周期可能是短暂的,当容器被删除时,其内部文件系统中的数据也会随之消失。而数据卷可以将数据存储在宿主机上,确保数据不会因为容器的删除而丢失。

数据共享

多个容器可以同时挂载同一个数据卷,从而实现容器之间的数据共享。这对于需要共享配置文件、日志文件或其他数据的应用场景非常有用。

数据备份和恢复

由于数据卷中的数据存储在宿主机上,因此可以方便地进行备份和恢复操作。

分离数据和应用

将数据存储在数据卷中,可以使容器的镜像更加轻量级,只包含应用程序本身,而将数据分离出来,提高了容器的可移植性和可维护性。

匿名

bash 复制代码
[root@bogon ~]# docker run -itd -v /data1 -v /data2 --name web01 centos:7
3a1c948d5ec41dff9fc8017e938943e6a7a01b671acade2e609a30adeddb612d
[root@bogon ~]#  
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND                   CREATED              STATUS                  PORTS                                     NAMES
3a1c948d5ec4   centos:7   "/bin/bash"               1 second ago         Up Less than a second                                             web01
91d9902e14e1   nginx      "/docker-entrypoint...."   About a minute ago   Up About a minute       0.0.0.0:8080->80/tcp, :::8080->80/tcp     pedantic_booth
4d050ae6077d   nginx      "/docker-entrypoint...."   3 minutes ago        Up 3 minutes            0.0.0.0:32769->80/tcp, :::32769->80/tcp   jovial_sanderson
2e4cc63b69e0   nginx      "/docker-entrypoint...."   7 minutes ago        Up 7 minutes            0.0.0.0:32768->80/tcp, :::32768->80/tcp   great_wu
[root@3a1c948d5ec4 /]# cd /data1
[root@3a1c948d5ec4 data1]#  
[root@3a1c948d5ec4 data1]# touch aaa
[root@3a1c948d5ec4 data1]#  
[root@3a1c948d5ec4 data1]# cd /data2
[root@3a1c948d5ec4 data2]#  
[root@3a1c948d5ec4 data2]# touch bbb