2. Docker 网络基础:Linux 网络命名空间、veth pair、网桥原理

Docker 的网络隔离与通信能力,本质上是 Linux 内核网络栈的轻量级虚拟化。理解 网络命名空间(Network Namespace)、veth pair 和 网桥(Bridge) 这三个核心组件,是掌握 Docker 网络模式的基石。本节将逐一拆解其原理与交互关系。

2.1 网络命名空间:隔离的网络栈副本

网络命名空间(netns)是 Linux 内核提供的一种网络栈隔离机制。每个 netns 拥有独立的网络设备、IP 地址、路由表、防火墙规则(iptables/ip6tables)和 socket 端口号空间。Docker 为每个容器创建一个独立的 netns,使得容器内的进程只能看到自己的网络环境。

特性 默认(宿主机)命名空间 容器命名空间
网络设备 eth0, lo, docker0 等 eth0(veth 端), lo
路由表 宿主机完整路由 仅容器内路由
iptables 规则 宿主机全局规则 独立规则链
进程可见性 所有进程 仅容器内进程
操作验证: 在宿主机执行 ip netns list 可查看所有命名空间;使用 nsenter -t <PID> -n ip addr 可进入容器 netns 查看网络设备。

2.2 veth pair:跨命名空间的虚拟网线

veth(Virtual Ethernet)pair 是一对虚拟网卡,像一根“网线”的两端。数据包从一端进入,必然从另一端原样流出。Docker 利用 veth pair 将容器 netns 与宿主机 netns 连接起来:一端放入容器(通常命名为 eth0),另一端挂载到宿主机网桥上(通常命名为 vethXXXX)。

  • 创建方式: ip link add veth0 type veth peer name veth1
  • 移动端: ip link set veth1 netns <容器PID>
  • 关键特性: 全双工、二层链路、无中间交换逻辑。
数据流示意: 容器内进程发送数据 → 容器 eth0(veth 端) → 宿主机 veth 端 → 网桥 → 物理网卡或另一容器。

2.3 网桥:虚拟的二层交换机

Linux 网桥(bridge)是一个工作在数据链路层(L2)的虚拟交换机。它根据 MAC 地址表转发帧,支持 STP(生成树协议)和 VLAN 过滤。Docker 默认创建 docker0 网桥,所有连接到该网桥的容器(通过 veth pair)都在同一个二层网络中,可以直接通信。

网桥功能 说明
MAC 学习 自动记录端口与 MAC 地址的映射关系
帧转发 根据目标 MAC 决定转发端口或丢弃
IP 分配 通常配合 DHCP 或 Docker 内置 IPAM 为容器分配 IP
NAT/路由 宿主机 iptables 规则实现容器访问外网(MASQUERADE)
注意: 默认 docker0 网桥的 IP 段为 172.17.0.0/16。若宿主机已有该网段,需通过 --bip 参数修改 docker0 地址,避免路由冲突。

2.4 三组件协同:容器通信的完整路径

下图展示了两个容器(Container A 和 Container B)通过 Docker 默认 bridge 网络通信的完整路径:

Docker 默认 bridge 网络通信路径 宿主机网络命名空间 容器 A netns eth0 (veth端) IP: 172.17.0.2 MAC: 02:42:ac:11:00:02 容器 B netns eth0 (veth端) IP: 172.17.0.3 MAC: 02:42:ac:11:00:03 veth pair veth pair docker0 网桥 IP: 172.17.0.1/16 MAC 表:02:42:ac:11:00:02 → vethA 数据帧 数据流:容器A进程 → eth0 → veth pair → docker0 网桥(查MAC表) → veth pair → 容器B eth0 → 容器B进程

2.5 核心组件对比总结

组件 工作层级 核心作用 Docker 中的角色
网络命名空间 L3/L4 栈隔离 提供独立的网络栈副本 每个容器拥有独立 netns
veth pair L2 虚拟链路 连接两个 netns 的虚拟网线 容器 eth0 ↔ 宿主机网桥
Linux 网桥 L2 交换 MAC 地址学习与帧转发 docker0 作为默认交换机
关键结论: Docker 默认 bridge 网络模式 = 每个容器一个 netns + 一对 veth pair + 一个共享的 docker0 网桥。三者缺一不可,共同构成了容器间通信的“虚拟局域网”。