目录
第一节:容器通信技术
一:Docker 容器的网络模式
1:Bridge模式
2:Host模式
3:Container模式
4:None模式
5:Overlay 模式
6:Macvlan 模式
7:自定义网络模式
二:端口映射
关键对比
三:容器互联
关键对比
四:容器间通信实现案例
1. 网络创建选项
2. 容器通信实现步骤
3. 通信方式对比
第二节:数据持久化技术
一:Docker的数据管理
1. 数据卷核心概念
2. 数据卷核心作用
3. 数据卷操作命令
4. 数据卷类型对比
二:Docker数据管理注意事项
关键对比:数据卷类型选择
第一节:容器通信技术
一:Docker 容器的网络模式
当项目大规模使用 Docker 时,容器通信的问题也就产生了。要解决容器通信问题,必须先了解很多关于网络的知识。Docker 的网络模式非常丰富,可以满足不同容器的通信要求,下表列出了这些网络模式的主要信息。
网络模式 | 创建方式 | 特点说明 |
---|---|---|
host 模式 | --network host | 容器直接使用宿主机网络栈,无独立网络命名空间,性能高但易端口冲突 |
container 模式 | --network container:<已有容器名或ID> | 新容器共享指定容器的网络命名空间,适用于需要紧密耦合通信的容器组合 |
none 模式 | --network none | 容器仅有lo回环接口,无外部网络连接,适合高安全性需求或手动配置网络场景 |
bridge 模式 | 默认模式,可通过-d bridge 手动指定(通常省略) | Docker默认模式,通过docker0虚拟网桥连接容器,有独立IP,通过NAT访问外网 |
Overlay 模式 | -d overlay | 用于Docker Swarm集群,基于VXLAN技术实现跨主机容器通信 |
macvlan 模式 | -d macvlan ,需指定--subnet 、--gateway 和--o parent=<物理网卡> | 为容器分配唯一MAC地址,直接连接物理网络接口,绕过docker0网桥,性能高 |
自定义网络 | docker network create 配合--subnet 、--gateway 等参数 | 用户可灵活配置子网、网关、IP范围等参数,创建符合特定需求的网络 |
1:Bridge模式
特性 | 说明 |
---|---|
默认网络模式 | Docker 安装后自动创建 docker0 虚拟网桥,新容器默认连接到此网桥。 |
IP 分配 | Docker 从预定义的子网中为每个容器分配唯一 IP 地址。 |
容器间通信 | 通过 docker0 网桥实现同一宿主机上的容器间通信。 |
外部网络访问 | 宿主机通过 NAT(网络地址转换) 将容器私有 IP 转换为宿主机公网 IP 进行通信。 |
适用场景 | 适用于大多数单机容器场景,提供网络隔离,同时支持外部访问。 |
优点 | - 默认配置,简单易用 - 提供网络隔离,避免端口冲突 - 支持 NAT 访问外网 |
缺点 | - 相比 host 或 macvlan 模式,网络性能稍低- 跨主机通信需要额外配置 |
bridge 模式是 docker 的默认网络模式,不写 --net 参数,就是 bridge 模式。使用 docker run -p 时,docker 实际是在 iptables 做了 DNAT 规则,实现端口转发功能。可以使用 iptables -t nat -vnL 查看。bridge 模式如下图所示:
如果你之前有 Docker 使用经验,你可能已经习惯了使用 --link 参数来使容器互联。
随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数。
创建一个叫 my-net 的 bridge 类型的网络
[root@bogon ~]# docker network create -d bridge my-net
查看都有哪些网络
[root@bogon ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8cd27b16846c bridge bridge local
8095f54e4dee host host local
2171fab71098 my-net bridge local
be41d33662a5 none null local
运行一个容器并连接到新建的 my-net
网络
[root@bogon ~]# docker run -itd --rm --name busybox1 --network my-net busybox sh -c 'while true;do echo hello;done'
f7614de88f1eabf174de8c4679e4f5407bf1c5fbb4c2932a5f8327ecaea4978
运行一个容器并加入到 my-net
网络
/ # ping busybox1
这样,busybox1
容器和 busybox2
容器建立了互联关系,如果你有多个容器之间需要互相连接,推荐使用 Docker Compose
。
2:Host模式
特性 | 说明 |
---|---|
网络模式 | 容器直接使用宿主机的网络栈,无独立网络命名空间。 |
IP 地址 | 容器与宿主机共享 IP 地址,无独立 IP。 |
端口管理 | 容器直接使用宿主机端口,可能导致端口冲突。 |
网络性能 | 高性能(无 NAT 或网桥转发开销)。 |
隔离性 | 低隔离性(容器与宿主机网络环境完全共享)。 |
适用场景 | 适用于需要极致网络性能且不担心端口冲突的场景(如性能测试、本地开发)。 |
优点 | - 网络延迟低,吞吐量高 - 无需额外配置端口映射 |
缺点 | - 无网络隔离,安全性较低 - 多个容器可能因端口冲突无法共存 |
如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。Host
模式如下图所示:
[root@bogon ~]# docker run -tid --net=host --name docker_host1 busybox
由于使用了 Host
模式,容器会直接使用宿主机的网络端口,因此可以直接在宿主机上通过 localhost
访问容器内的服务,使用 ifconfig
命令可以看到容器的网络和宿主机的是一致的。
[root@bogon ~]# docker exec -it docker_host1 sh
/ # ifconfig
3:Container模式
特性 | 说明 |
---|---|
网络模式 | 新容器共享指定容器的网络命名空间(IP、端口、网络接口等完全一致)。 |
IP 地址 | 与目标容器使用相同 IP 和端口,无法独立分配。 |
通信方式 | 容器间直接通过 localhost 或共享网络栈通信,无需经过 NAT 或网桥。 |
网络性能 | 高性能(无额外网络开销,类似 host 模式但限定共享范围)。 |
隔离性 | 低隔离性(共享网络栈的容器间无网络隔离)。 |
适用场景 | 适用于紧密耦合的容器组(如主应用 + Sidecar 日志/监控容器)。 |
优点 | - 容器间通信零延迟 - 无需配置端口映射或服务发现 - 资源占用少 |
缺点 | - 共享网络的容器不能绑定相同端口 - 调试复杂(网络行为相互影响) |
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。Container 模式示意图:
[root@bogon ~]# docker run -tid --name host1 busybox
# 创建 host2 容器共享 host1 容器的网络
[root@bogon ~]# docker run -itd --net=container:host1 --name host2 busybox
# 查询 host1 容器的网络
[root@bogon ~]# docker exec -it host1 ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02 inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:8 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:648 (648.0 B) TX bytes:0 (0.0 B)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
# 查看 host2 容器的网络,确认和 host1 容器的网络一致
[root@bogon ~]# docker exec -it host2 ifconfig
4:None模式
特性 | 说明 |
---|---|
网络模式 | 容器仅拥有 lo 回环接口,无任何外部网络连接。 |
IP 地址 | 无外部 IP,完全隔离。 |
网络功能 | 默认无法与宿主机、其他容器或外网通信,需手动配置网络(如添加 veth 设备)。 |
安全性 | 最高隔离性,适用于对网络安全要求极高的场景。 |
适用场景 | - 安全敏感型应用(如审计、加密服务) - 需完全自定义网络的特殊场景 |
优点 | - 绝对网络隔离,避免攻击面 - 完全自主控制网络配置 |
缺点 | - 无默认网络功能,需手动配置 - 不适合需要常规通信的容器 |
使用 none 模式,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。None 模式示意图:
[root@bogon ~]# docker run -itd --net=none --name none01 busybox sh
c7805a0df84bdfb370c106b24eaba173abd4fcee6ee689eade46191015548a
[root@bogon ~]# docker exec -it none01 sh
/ # ifconfig
lo Link encap:Local Loopbackinet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
5:Overlay 模式
Overlay 模式主要用于 Docker Swarm 集群,它允许容器在不同的 Docker 宿主机之间进行通信。它基于 VXLAN(Virtual eXtensible Local Area Network)技术,在物理网络之上创建一个虚拟的覆盖网络。
当容器之间进行通信时,数据包会被封装在 VXLAN 报头中,通过物理网络进行传输。在接收端,VXLAN 报头会被解封装,还原出原始的数据包。
Overlay 网络是分布式的,每个 Docker 宿主机上都有一个网络代理(如 Docker 的 docker_gwbridge)负责管理和转发数据包。
# 在 Docker Swarm 集群中创建一个 Overlay 网络
docker network create -d overlay my_overlay_network
# 在不同的宿主机上创建服务并连接到 Overlay 网络
docker service create --name my_service --network my_overlay_network nginx
6:Macvlan 模式
在 Macvlan 模式下,Docker 为每个容器分配一个唯一的 MAC 地址,使得容器在网络中看起来像一个独立的物理设备。
容器直接连接到宿主机的物理网络接口,绕过了 docker0 网桥,从而提高了网络性能。容器可以直接与外部网络进行通信,就像一个独立的主机一样。
每个容器都有自己独立的网络配置,与宿主机和其他容器之间相互隔离。
# 创建一个 Macvlan 网络
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
my_macvlan_network
# 创建一个使用 Macvlan 网络的容器
docker run -d --name my_macvlan_container --network my_macvlan_network nginx
7:自定义网络模式
除了上述内置的网络模式,你还可以使用 docker network create 命令创建自定义的 bridge 网络,以满足特定的网络需求,例如指定子网、网关、IP 范围等。
使用如下命令创建一个自定义网络
docker network create \
--subnet=172.21.0.0/16 \
--gateway=172.21.0.1 \
my_custom_network
此命令的主要目的是创建一个新的 Docker 网络,这个网络可以用于容器之间的通信。默认情况下,创建的是一个基于 bridge 驱动的网络。
参数/选项 | 说明 | 示例值 | 作用 |
---|---|---|---|
docker network create | Docker 创建网络的基础命令 | - | 用于创建自定义 Docker 网络 |
--subnet | 指定网络的子网范围(CIDR 格式) | 172.21.0.0/16 | 定义容器的 IP 分配范围(示例中可用 IP:172.21.0.1 ~ 172.21.255.254) |
--gateway | 设置网络的网关地址(必须是子网内的有效 IP) | 172.21.0.1 | 容器通过该网关访问外部网络(类似路由器的功能) |
<network_name> | 自定义网络的名称 | my_custom_network | 创建容器时通过名称连接到此网络(如 --network=my_custom_network ) |
创建一个新的容器并加入这个自定义网络
docker run -d --name my_container --network my_custom_network nginx
二:端口映射
特性 | 说明 | 命令示例 | 适用场景 |
---|---|---|---|
随机映射(-P 大写) | 自动将容器内 EXPOSE 声明的所有端口随机映射到宿主机的高端口(32768-61000) | docker run -d -P nginx | 快速测试,避免手动指定端口冲突 |
指定映射(-p 小写) | 手动指定宿主机端口与容器端口的映射关系 | docker run -d -p 8080:80 nginx (宿主机8080 → 容器80) | 生产环境标准化部署,需固定端口 |
宿主机随机端口 | 仅指定容器端口,宿主机端口由 Docker 自动分配 | docker run -d -p 80 nginx (容器80 → 宿主机随机端口如32769) | 需要暴露容器端口但不关心宿主机具体端口 |
多端口映射 | 同时映射多个端口 | docker run -d -p 8080:80 -p 443:443 nginx | 需暴露多个服务的场景(如HTTP+HTTPS) |
绑定特定IP | 限制端口映射仅对指定宿主机IP生效 | docker run -d -p 192.168.1.100:8080:80 nginx | 增强安全性,仅允许特定网络接口访问 |
协议指定 | 显式声明端口协议(TCP/UDP) | docker run -d -p 8080:80/tcp -p 53:53/udp nginx | 需区分协议的场景(如DNS服务用UDP) |
--rm 选项 | 容器停止后自动删除 | docker run --rm -d -p 8080:80 nginx | 临时测试,避免残留容器 |
关键对比
对比项 | -P(大写) | -p(小写) |
---|---|---|
端口分配 | Docker 自动随机选择(32768-61000) | 用户手动指定或部分随机 |
映射范围 | 容器内所有 EXPOSE 端口 | 仅映射命令行中指定的端口 |
使用场景 | 快速测试、临时环境 | 生产环境、需精确控制端口的场景 |
注意事项
-
端口冲突:宿主机端口若被占用,容器会启动失败(错误提示
Bind for 0.0.0.0:8080 failed
)。 -
防火墙:确保宿主机防火墙(如
firewalld
/iptables
)放行映射的端口。 -
安全建议:
-
生产环境避免使用随机端口(
-P
)。 -
限制IP绑定(如
-p 127.0.0.1:8080:80
)以减少暴露面。
-
三:容器互联
特性 | 说明 | 命令示例 | 适用场景 |
---|---|---|---|
--link 方式 | 通过别名连接容器(已逐渐被弃用) | docker run -dit --name web02 --link web01:myweb01 centos:7 | 旧版本 Docker 兼容场景 |
自定义网络方式 | 创建自定义网络,容器加入同一网络即可互联(推荐方式) | docker network create mynet docker run -dit --network=mynet --name web01 centos:7 docker run -dit --network=mynet --name web02 centos:7 | 生产环境,需灵活管理容器通信 |
DNS 自动解析 | 同一自定义网络内的容器可通过容器名直接通信 | 在 web02 中直接执行 ping web01 | 替代 --link ,无需手动配置别名 |
/etc/hosts 注入 | --link 会在目标容器的 /etc/hosts 中写入源容器 IP 和别名 | cat /etc/hosts 显示 172.17.0.2 myweb01 | 调试或兼容旧应用 |
隔离性 | 默认 bridge 网络隔离容器;自定义网络提供可控的互联 | - | 需平衡隔离与通信需求的场景 |
安全性 | --link 仅单向通信;自定义网络支持双向通信 | - | 需细粒度控制通信权限的场景 |
关键对比
对比项 | --link (旧方式) | 自定义网络(推荐方式) |
---|---|---|
通信方向 | 单向(源→目标) | 双向 |
配置复杂度 | 需手动指定别名 | 自动通过容器名解析 |
维护性 | 难扩展(容器增多后混乱) | 易管理(天然支持多容器互联) |
版本兼容性 | 旧版本支持,新版本逐渐弃用 | 所有现代 Docker 版本均支持 |
创建自定义网络并互联容器
# 创建网络
docker network create mynet# 启动容器并加入同一网络
docker run -dit --network=mynet --name web01 centos:7
docker run -dit --network=mynet --name web02 centos:7# 测试通信(在 web02 中)
docker exec -it web02 ping web01
--link
方式(仅作了解)
docker run -dit --name web01 centos:7
docker run -dit --name web02 --link web01:myweb01 centos:7
docker exec -it web02 ping myweb01
注意事项
-
弃用警告:
--link
可能导致依赖问题,建议迁移到自定义网络。 -
DNS 优势:自定义网络自动提供容器名解析,无需维护
/etc/hosts
。 -
多网络支持:一个容器可加入多个网络,实现复杂拓扑(如隔离后端数据库与前端服务)。
四:容器间通信实现案例
1. 网络创建选项
选项 | 说明 | 示例命令 |
---|---|---|
--driver / -d | 指定网络驱动类型(默认 bridge ) | docker network create -d bridge my_network |
--subnet | 定义网络的子网范围(CIDR 格式) | docker network create --subnet=172.18.0.0/16 my_network |
--gateway | 设置网络的网关 IP(需在子网范围内) | docker network create --subnet=172.19.0.0/16 --gateway=172.19.0.1 my_network |
--ip-range | 指定容器 IP 的分配范围(子网的子集) | docker network create --subnet=172.20.0.0/16 --ip-range=172.20.1.0/24 my_network |
--internal | 创建仅限内部通信的网络(禁止访问外网) | docker network create --internal my_internal_network |
--attachable | 允许非 Swarm 服务的容器加入网络 | docker network create --attachable my_attachable_network |
2. 容器通信实现步骤
步骤 | 操作 | 关键命令 |
---|---|---|
1. 创建自定义网络 | 使用 docker network create 创建网络 | docker network create my_net |
2. 启动容器并加入网络 | 通过 --net 将容器连接到同一网络 | docker run -dit --name pc01 --net=my_net centos:7 |
3. 测试通信 | 在同一网络内的容器可通过容器名直接通信 | docker exec -it pc01 ping pc02 (成功) |
4. 隔离验证 | 未加入同一网络的容器无法通信 | docker exec -it pc01 ping web03 (失败) |
3. 通信方式对比
特性 | --link (旧方式) | 自定义网络(推荐方式) |
---|---|---|
通信方向 | 单向 | 双向 |
配置复杂度 | 需手动指定别名 | 自动通过容器名解析 |
扩展性 | 难维护(容器增多后混乱) | 天然支持多容器互联 |
跨主机支持 | 仅单机 | 支持(结合 overlay 驱动) |
安全性 | 低(依赖 /etc/hosts 注入) | 高(隔离网络 + DNS 解析) |
第二节:数据持久化技术
一:Docker的数据管理
1. 数据卷核心概念
特性 | 说明 |
---|---|
定义 | 绕过容器文件系统,直接挂载宿主机目录到容器内部的特殊目录 |
生命周期 | 独立于容器,删除容器后数据卷仍保留 |
存储位置 | 默认位于宿主机 /var/lib/docker/volumes/ 下,也可绑定到自定义宿主目录 |
共享性 | 支持多个容器同时挂载同一数据卷 |
2. 数据卷核心作用
作用 | 说明 | 应用场景示例 |
---|---|---|
数据持久化 | 容器删除后数据仍保留在宿主机 | 数据库容器(如 MySQL、PostgreSQL) |
数据共享 | 多个容器读写同一数据卷 | 共享配置文件、日志文件或静态资源(如 Nginx 配置) |
备份与恢复 | 直接操作宿主机上的数据卷文件进行备份 | 定期备份数据库文件到外部存储 |
分离数据与应用 | 容器镜像仅包含应用,数据独立存储 | 开发环境与生产环境使用相同镜像,通过不同数据卷加载数据 |
3. 数据卷操作命令
操作 | 命令示例 | 说明 |
---|---|---|
创建数据卷 | docker volume create my_volume | 创建名为 my_volume 的匿名卷 |
绑定挂载目录 | docker run -v /宿主机路径:/容器路径 nginx | 将宿主机目录直接挂载到容器(需绝对路径) |
使用命名卷 | docker run -v my_volume:/容器路径 nginx | 使用已创建的命名卷 |
查看数据卷列表 | docker volume ls | 列出所有数据卷 |
删除数据卷 | docker volume rm my_volume | 删除指定数据卷(需先解除容器挂载) |
4. 数据卷类型对比
类型 | 匿名卷 | 命名卷 | 绑定挂载 |
---|---|---|---|
创建方式 | -v /容器路径 | docker volume create + -v 卷名:/容器路径 | -v /宿主机路径:/容器路径 |
存储位置 | Docker 管理(随机哈希命名) | Docker 管理(用户自定义名称) | 用户指定宿主机目录 |
可维护性 | 低(依赖容器生命周期) | 高(显式管理) | 高(直接操作宿主机文件) |
适用场景 | 临时数据 | 生产环境持久化数据 | 开发调试或需直接修改宿主机文件的场景 |
二:Docker数据管理注意事项
注意事项 | 说明 | 示例/建议 |
---|---|---|
1. 选择合适的数据卷类型 | 根据场景选择匿名卷、具名卷或绑定挂载 | - 匿名卷:临时数据(如编译缓存) - 具名卷:数据库持久化(如 MySQL) - 绑定挂载:开发时共享配置文件 |
2. 使用绝对路径 | 绑定挂载宿主机目录时必须使用绝对路径 | -v /home/user/app:/app (正确)-v ./app:/app (错误,需绝对路径) |
3. 定期清理数据卷 | 匿名卷和未使用的具名卷会占用磁盘空间 | docker volume ls (查看)docker volume rm <卷名> (删除) |
4. 容器内数据持久化 | 关键数据必须挂载到数据卷,避免容器删除后丢失 | MySQL 数据目录:-v mysql_data:/var/lib/mysql |
5. 数据共享与并发控制 | 多容器挂载同一数据卷时需处理并发问题 | 数据库容器:应用层加锁或使用事务 日志文件:使用日志收集工具(如 Fluentd) |
6. 备份与恢复 | 通过操作宿主机上的数据卷文件实现备份 | 备份 MySQL 数据卷:docker run --rm -v mysql_data:/volume -v /backup:/backup alpine tar czf /backup/mysql_backup.tar.gz /volume |
7. 权限管理 | 确保容器内用户有权限访问挂载的目录 | Nginx 容器: 宿主机目录权限设为 755 ,用户组与容器内 www-data 匹配 |
8. 安全性 | 敏感数据避免直接挂载,使用 Docker Secret 或加密卷 | 配置文件含密码:docker secret create db_password ./password.txt |
关键对比:数据卷类型选择
类型 | 匿名卷 | 具名卷 | 绑定挂载 |
---|---|---|---|
管理难度 | 难(随机名称,易遗留) | 易(自定义名称,可追溯) | 易(直接操作宿主机文件) |
持久性 | 是(需手动清理) | 是(显式删除) | 是(依赖宿主机目录) |
适用场景 | 临时数据、测试环境 | 生产环境数据库、持久化存储 | 开发调试、配置文件共享 |