Docker 高级管理 -- 容器通信技术与数据持久化

发布于:2025-07-11 ⋅ 阅读:(56) ⋅ 点赞:(0)

目录

第一节:容器通信技术

一: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.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 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: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.0
          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: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 Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          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:1
          RX 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 端口 仅映射命令行中指定的端口
使用场景 快速测试、临时环境 生产环境、需精确控制端口的场景

注意事项

  1. 端口冲突:宿主机端口若被占用,容器会启动失败(错误提示 Bind for 0.0.0.0:8080 failed)。

  2. 防火墙:确保宿主机防火墙(如 firewalld/iptables)放行映射的端口。

  3. 安全建议

    • 生产环境避免使用随机端口(-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

注意事项

  1. 弃用警告--link 可能导致依赖问题,建议迁移到自定义网络。

  2. DNS 优势:自定义网络自动提供容器名解析,无需维护 /etc/hosts

  3. 多网络支持:一个容器可加入多个网络,实现复杂拓扑(如隔离后端数据库与前端服务)。

四:容器间通信实现案例

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

关键对比:数据卷类型选择

类型 匿名卷 具名卷 绑定挂载
管理难度 难(随机名称,易遗留) 易(自定义名称,可追溯) 易(直接操作宿主机文件)
持久性 是(需手动清理) 是(显式删除) 是(依赖宿主机目录)
适用场景 临时数据、测试环境 生产环境数据库、持久化存储 开发调试、配置文件共享

网站公告

今日签到

点亮在社区的每一天
去签到