Appearance
Docker 网络模式
Docker 提供四种内置网络模式,控制容器与外部网络及其他容器之间的通信方式。
Bridge 模式(桥接)
Docker 的默认网络模式。容器通过虚拟网桥 docker0 与宿主机及其他容器通信。
- 每个容器拥有独立的 Network Namespace
- Docker 为容器分配独立 IP 地址(默认网段 172.17.0.0/16)
- 容器通过 veth pair 连接到 docker0 网桥
- 宿主机通过 docker0 网桥与容器通信
- 容器间可通过 IP 地址互相访问,但需使用
--link或自定义网络实现名称解析 - 适用场景:单机多容器部署、需要容器间网络隔离
text
┌──────────┐ ┌──────────┐
│ 容器 A │ │ 容器 B │
│ eth0 │ │ eth0 │
└────┬─────┘ └────┬─────┘
│ veth │ veth
└─────┬───────┘
│
docker0 网桥
│
宿主机物理网卡
│
外部网络💡 提示:默认 bridge 网络不支持容器名解析,推荐使用
docker network create创建自定义 bridge 网络,自定义网络内置 DNS,容器间可通过容器名直接访问。
Host 模式(主机)
容器直接使用宿主机的网络栈,与宿主机共享网络命名空间。
- 容器不创建独立的 Network Namespace,与宿主机共享
- 容器没有独立 IP 地址,直接使用宿主机 IP 和端口
- 容器内监听的端口直接暴露在宿主机上,无需
-p端口映射 - 网络性能最佳,无 NAT 转换开销
- 端口冲突风险:容器使用的端口不能与宿主机已占用端口冲突
- 适用场景:对网络性能要求高、容器需直接使用宿主机网络
text
┌──────────────────────┐
│ 宿主机 │
│ 物理网卡 │ 容器 A │
│ 端口 │ (共享) │
└─────┬────────────────┘
│
外部网络⚠️ 注意:Host 模式下容器失去网络隔离性,可能带来安全风险,需谨慎使用。
None 模式(无网络)
容器拥有独立的 Network Namespace,但不进行任何网络配置。
- 容器仅有 lo(回环)接口,无其他网络设备
- 容器无法与外部网络、宿主机及其他容器通信
- 网络隔离级别最高
- 如需网络,需手动添加网络设备并配置
- 适用场景:无需网络的计算任务、安全敏感场景、需自定义网络配置
text
┌──────────┐
│ 容器 A │
│ lo (仅) │
└──────────┘
(无任何外部连接)Container 模式(容器共享)
新容器与指定容器共享 Network Namespace,共用网络栈。
- 新容器不创建独立网络,而是加入已有容器的网络命名空间
- 共享 IP 地址、端口范围、路由表等网络资源
- 共享网络的容器间可通过 lo 接口(127.0.0.1)直接通信
- 端口冲突风险:共享网络的容器不能监听相同端口
- 适用场景:Sidecar 模式、多个紧密耦合的容器需共享网络
text
┌─────────────────────────┐
│ 共享 Network Namespace │
│ ┌────────┐ ┌────────┐ │
│ │ 容器 A │ │ 容器 B │ │
│ └────────┘ └────────┘ │
│ eth0 │
└───────────┬─────────────┘
│
docker0 网桥
│
宿主机物理网卡💡 提示:Kubernetes 中 Pod 内多容器默认使用此模式,同一 Pod 内所有容器共享网络命名空间。
四种模式对比
| 特性 | Bridge | Host | None | Container |
|---|---|---|---|---|
| 独立 Network Namespace | ✅ | ❌ | ✅ | ❌ |
| 独立 IP 地址 | ✅ | ❌(共享宿主机) | ❌ | ❌(共享目标容器) |
| 容器 → 外网 | ✅ | ✅ | ❌ | ✅ |
| 外网 → 容器 | 需端口映射 | 直接访问 | ❌ | 需端口映射 |
| 容器间通信 | ✅(同网络) | ✅ | ❌ | ✅(共享 lo) |
| 网络性能 | 一般(NAT) | 最佳 | — | 一般(NAT) |
| 网络隔离性 | 中 | 低 | 高 | 低 |
| 端口冲突风险 | 低 | 高 | 无 | 高 |
常用命令
bash
# 查看所有网络
docker network ls
# 查看网络详情
docker network inspect bridge
# 创建自定义 bridge 网络
docker network create my-net
# 运行容器时指定网络模式
docker run --network bridge nginx
docker run --network host nginx
docker run --network none nginx
docker run --network container:目标容器名 nginx
# 将运行中容器连接到网络
docker network connect my-net 容器名
# 断开容器与网络的连接
docker network disconnect my-net 容器名