docker容器间通信核心是veth pair与docker0网桥协同实现的纯二层转发:容器eth0通过veth pair一端接入docker0,另一端在宿主机并加入该网桥;docker0作为虚拟交换机基于mac地址表转发帧,同一子网内容器直连通信,无需nat或路由。

Docker 容器间通过虚拟网桥通信,核心是利用 Linux 内核的 bridge 和 veth pair 机制,在同一宿主机上构建一个二层虚拟交换网络。它不依赖外部物理设备,全部在内核中完成数据帧转发,效率高、隔离性好。
docker0 网桥是通信中枢
Docker 启动时自动创建一个名为 docker0 的虚拟网桥(Linux bridge 设备),默认 IP 是 172.17.0.1/16,并作为所有 bridge 模式容器的默认网关。这个网桥本身没有物理接口,只作为多个 veth 接口的逻辑汇聚点。
- 它工作在数据链路层(L2),根据 MAC 地址表转发以太网帧
- 每个接入的容器都通过一对 veth 设备连接到它:一端在容器 netns 内,一端在宿主机上并加入 docker0
- 容器启动后,Docker 自动为其分配唯一 IP(如
172.17.0.2),该地址属于 docker0 所在子网
veth pair 实现跨命名空间连接
veth(virtual ethernet)是一对成对出现的虚拟网卡,像一根“虚拟网线”——一端在容器网络命名空间(netns)里,另一端在宿主机的初始命名空间中,两端自动收发镜像流量。
- 容器内部看到的 eth0,实际是 veth 的容器侧端口;宿主机上能看到对应另一端(如 vethabcd123),已绑定到 docker0
- 当容器发出数据包,先封装为以太网帧,经 veth 发送到宿主机;docker0 根据目标 MAC 查表,决定是否转发给另一个 veth
- 整个过程不经过 iptables 过滤(除非显式配置),也不涉及 NAT,纯 L2 转发
容器间通信走纯二层路径
只要两个容器同属默认 bridge 网络,它们之间的通信就完全发生在 docker0 内部,不需要经过宿主机的物理网卡或路由表。
- 容器 A 向容器 B 的 IP(如
172.17.0.3)发包 → 触发 ARP 请求获取其 MAC → docker0 学习到该 MAC 对应的 veth 端口 - 后续帧直接按 MAC 转发,类似物理交换机行为
- 若目标 IP 不在 docker0 子网内(比如访问外网),则由 docker0 充当网关,触发 SNAT + iptables FORWARD 规则
IPAM 与 DNS 支撑自动寻址
底层转发靠 MAC,但用户通常用 IP 或容器名通信。这背后有两层支持:
-
IPAM 模块动态管理 IP 分配与回收,避免冲突;支持自定义子网、固定 IP(
--ip) -
嵌入式 DNS运行在 Docker daemon 中,容器可通过名字(如
redis)解析同网络其他容器的 IP,无需额外服务发现组件











