Docker Bridge模式下,docker0是内核级虚拟交换机,通过veth pair连接容器,基于MAC地址表实现二层转发:容器间通信走纯二层路径,对外通信则经iptables NAT转换。

剖析 Docker Bridge 模式下 docker0 的数据转发运行拓扑,关键在于理清“谁连谁、怎么转、往哪走”这三件事。它不是黑盒,而是一套可观察、可验证的 Linux 网络栈组合:虚拟网桥 + veth pair + 内核转发 + iptables/NAT。
docker0 本质是内核级虚拟交换机
docker0 不是进程,也不是用户态程序,而是 Linux 内核 bridge 模块创建的虚拟网络设备,工作在 OSI 第二层(数据链路层)。它像物理交换机一样维护 MAC 地址表,自动学习接入端口的 MAC,并按目标 MAC 转发以太帧。
- 执行
ip link show docker0可确认其状态和类型(BROADECAST,MULTICAST,UP) - 用
brctl show或bridge fdb show br docker0查看当前学习到的 MAC 表项,对应容器内 eth0 的 MAC - 所有挂载到 docker0 的 veth 接口(如 vethabc123)都作为它的“端口”,彼此处于同一广播域
veth pair 构成容器与网桥之间的双向通道
每个容器启动时,Docker 创建一对命名空间隔离的虚拟网卡:一端在容器 Network Namespace 中(通常叫 eth0),另一端在宿主机 root namespace 中并接入 docker0(如 veth7f3a9c4)。它们就像一根不可分割的网线,帧从一端进,必从另一端出。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 在容器内执行
ip link,能看到 eth0 的 ifindex 和 peer index;在宿主机执行ip link | grep veth,能找到配对的另一端 - 用
ip link set dev vethxxx master docker0可手动将 veth 接入网桥(Docker 自动完成) - 容器间通信(如 A ping B)全程不经过宿主机协议栈三层处理,纯二层转发:A→vethA→docker0→vethB→B
流量路径分两类:容器间 vs 容器对外
docker0 本身只负责二层交换;是否能访问外网,取决于三层路由和 NAT 是否启用。
- 同网桥容器互访:源容器发 ARP 请求获取目标容器 MAC → docker0 学习并记录 MAC → 直接二层转发帧 → 目标容器收包。全程无 IP 路由参与
- 容器访问外部网络(如 curl google.com):数据包经 docker0 到宿主机协议栈 → 触发 iptables FORWARD 链(默认 ACCEPT)→ 经 POSTROUTING 做 SNAT(伪装成宿主机 IP)→ 从物理网卡(如 eth0)发出
- 外部访问容器(如 -p 8080:80):宿主机 iptables PREROUTING 做 DNAT,把目标 IP:Port 映射为容器 IP:Port → 再经 FORWARD 转发 → 最终送达容器内服务
验证拓扑的常用命令组合
不需要画图也能还原真实拓扑,靠命令输出交叉比对即可:
-
docker network inspect bridge:查子网、网关(172.17.0.1)、已连接容器列表及 IP 分配 -
ip addr show docker0和ip route show table local:确认网桥 IP 和本地路由 -
iptables -t nat -vnL和iptables -t filter -vnL FORWARD:看 NAT 规则是否启用、FORWARD 是否放行 - 进容器执行
ip route:默认路由指向 172.17.0.1(即 docker0 的 IP),这就是它的网关

















