这里写目录标题
- [Docker 容器的网络模式](#Docker 容器的网络模式)
-
- [Bridge 模式](#Bridge 模式)
-
-
- [创建一个叫 my-net 的 bridge 类型的网络](#创建一个叫 my-net 的 bridge 类型的网络)
- 查看都有哪些网路
- [运行一个容器并连接到新建的 my-net 网络](#运行一个容器并连接到新建的 my-net 网络)
- [运行一个容器并加入到 my-net 网络](#运行一个容器并加入到 my-net 网络)
-
- [Host 模式](#Host 模式)
- [Coneainer 模式](#Coneainer 模式)
- [None 模式](#None 模式)
- [Overlay 模式](#Overlay 模式)
- [Macvlan 模式](#Macvlan 模式)
- 自定义网络模式
- 端口映射
- 持久化
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