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