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,与物理网卡默认一致

3.4 数据包流转路径

以下 SVG 展示了容器 A 访问容器 B 以及容器 A 访问外部网络时的完整数据包路径:

Docker Bridge 模式数据包流转路径 Docker Bridge 模式数据包流转路径 容器 A 172.17.0.2 eth0 容器 B 172.17.0.3 eth0 vethA vethB docker0 网桥 (172.17.0.1) 二层交换 + iptables NAT 宿主机 eth0 物理网卡 / 外网 路径①:容器间通信(二层转发) 路径②:访问外网(SNAT) 路径①:容器 A → docker0 二层交换 → 容器 B(无需 NAT) | 路径②:容器 A → docker0 → SNAT → 宿主机 eth0 → 外网

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 网络的完整工作状态。