3. Docker默认网络:bridge模式的工作原理与默认配置
Docker 安装后会自动创建三种网络:bridge、host 和 none。其中 bridge 是默认网络模式,也是单机容器通信的基础。理解 bridge 模式的工作原理,是掌握 Docker 网络通信优化的第一步。
3.1 什么是 bridge 网络
Bridge 网络基于 Linux 内核的 网桥(bridge) 和 iptables NAT 技术实现。Docker 守护进程在宿主机上创建一个名为 docker0 的虚拟网桥,所有连接到默认 bridge 网络的容器都会通过 veth pair 虚拟网卡对挂载到 docker0 上,从而实现容器间的互联互通。
关键概念: veth pair 是一对虚拟以太网卡,一端在容器内(eth0),另一端在宿主机网桥上(vethxxx),数据包通过这对虚拟网卡在容器和网桥之间传递。
3.2 默认 bridge 网络的核心组件
| 组件 | 名称/标识 | 作用 |
|---|---|---|
| 虚拟网桥 | docker0 |
二层交换设备,连接所有容器,默认 IP 段 172.17.0.0/16 |
| veth pair | 容器端: eth0;宿主机端: vethXXXX |
容器与网桥之间的虚拟网线 |
| IP 分配 | DHCP 子网 | Docker 内置 DHCP 为每个容器分配私有 IP |
| NAT 规则 | iptables MASQUERADE | 容器访问外部网络时做源地址转换 |
| 端口映射 | -p / --publish |
宿主机端口 → 容器端口,通过 DNAT 实现 |
3.3 默认配置参数
通过 docker network inspect bridge 可以查看默认 bridge 网络的完整配置:
[
{
"Name": "bridge",
"Id": "xxxxxxxxxxxx",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
}
}
]
默认配置要点:
• 子网:172.17.0.0/16,网关 172.17.0.1(即 docker0 的 IP)
• ICC(Inter-Container Communication):默认开启,容器间可以互相通信
• IP Masquerade:默认开启,容器访问外网时自动 SNAT
• MTU:1500,与物理网卡默认一致
• 子网:172.17.0.0/16,网关 172.17.0.1(即 docker0 的 IP)
• ICC(Inter-Container Communication):默认开启,容器间可以互相通信
• IP Masquerade:默认开启,容器访问外网时自动 SNAT
• MTU:1500,与物理网卡默认一致
3.4 数据包流转路径
以下 SVG 展示了容器 A 访问容器 B 以及容器 A 访问外部网络时的完整数据包路径:
3.5 容器间通信与外部访问
3.5.1 容器间通信(ICC)
同一台宿主机上,连接到默认 bridge 网络的容器可以通过 IP 地址直接通信。Docker 通过 docker0 网桥的二层转发实现,不经过 NAT,性能较高。
# 启动两个容器
docker run -d --name web1 nginx
docker run -d --name web2 nginx
# 查看容器 IP
docker inspect web1 | grep IPAddress
# 输出: "172.17.0.2"
# 从 web1 ping web2
docker exec web1 ping 172.17.0.3
注意: 默认 bridge 网络不支持通过容器名称进行 DNS 解析。容器之间只能通过 IP 地址通信,或者使用
--link 参数(已废弃)。如果需要容器名自动解析,应使用用户自定义 bridge 网络。
3.5.2 外部网络访问
容器访问外部网络时,数据包经过 docker0 网桥后,由 iptables 的 MASQUERADE 规则执行源地址转换(SNAT),将容器私有 IP 转换为宿主机物理网卡 IP。
| 方向 | 源 IP | 目标 IP | 转换规则 |
|---|---|---|---|
| 容器 → 外网 | 172.17.0.x | 外网 IP | SNAT → 宿主机 eth0 IP |
| 外网 → 容器(端口映射) | 外网 IP | 宿主机 IP:Port | DNAT → 容器 IP:Port |
3.6 端口映射机制
使用 -p 参数发布容器端口时,Docker 在 iptables 中创建 DNAT 规则,将宿主机端口上的入站流量转发到容器端口。
# 将宿主机 8080 端口映射到容器 80 端口
docker run -d -p 8080:80 --name web nginx
# 查看 iptables 规则
iptables -t nat -L DOCKER -n
# Chain DOCKER (2 references)
# DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.2:80
3.7 默认 bridge 的局限性
- 无 DNS 解析: 容器间只能通过 IP 通信,容器重启后 IP 会变化,导致连接失效
- 所有容器共享同一网段: 无法隔离不同业务组的网络
- 端口映射冲突: 多个容器不能映射同一宿主机端口
- 性能损耗: 外部访问需要经过 iptables NAT,高并发场景有额外开销
最佳实践: 默认 bridge 适合单机开发测试环境。生产环境建议使用用户自定义 bridge 网络,以获得内置 DNS 解析、更好的隔离性和更灵活的配置。
3.8 验证默认 bridge 网络
以下命令可以帮助你快速验证当前宿主机上的默认 bridge 网络状态:
# 查看 docker0 网桥信息
ip addr show docker0
# 查看所有网络
docker network ls
# 查看 bridge 网络详情
docker network inspect bridge
# 查看 iptables NAT 规则
iptables -t nat -L -n | grep -A 10 "Chain DOCKER"
# 查看 veth pair 列表
ip link | grep veth
通过以上命令,你可以清晰地看到 docker0 的 IP 地址、已连接的 veth 接口以及 iptables 中的 NAT 规则,从而验证 bridge 网络的完整工作状态。