Docker网络核心是docker0网桥和veth pair:docker0是宿主机上真实存在的虚拟交换机(IP通常为172.17.0.1/16),所有默认容器接入其下并获得同网段IP;veth pair一端为容器eth0,另一端挂载到docker0,实现二层通信;外网访问依赖iptables NAT规则;自定义bridge网络则提供DNS解析、服务名互通与更好隔离。

理解 Docker 的网络模型,核心是抓住「容器怎么连上网络」和「彼此之间怎么通信」这两件事。docker0 网桥就是默认场景下的关键枢纽,它不是抽象概念,而是宿主机上真实存在的虚拟设备。
docker0 是什么:一个自带 IP 的虚拟交换机
安装 Docker 后,系统自动创建一个叫 docker0 的 Linux 网桥,带一个 IPv4 地址(通常是 172.17.0.1/16)。它不依赖物理网卡,但行为像一台二层交换机:
- 所有默认启动的容器,都会被“插”进这个网桥
- 容器获得的 IP(如 172.17.0.2)属于同一子网,网关指向 docker0 自身
- 容器间通信直接走二层转发,无需经过宿主机协议栈
veth pair:连接容器与网桥的虚拟网线
每个容器接入 docker0,并非靠单个虚拟网卡,而是一对成套出现的 veth 设备:
- 一端在容器内部,命名为 eth0,归属该容器的 Network Namespace
- 另一端在宿主机上,名字类似 vethabc123,挂载到 docker0 网桥
- 这对设备像一根“透明网线”,数据包从容器发出后,经 veth 传入网桥,再由网桥决定转发给谁
容器如何访问外网:NAT + iptables 是幕后推手
docker0 本身只管内部通信,容器要访问互联网或宿主机以外的地址,必须经过地址转换:
- Docker 启动时自动配置 iptables 规则,在 POSTROUTING 链中添加 MASQUERADE
- 出向流量源 IP 被替换成宿主机 IP(比如 eth0 的 192.168.1.100)
- 入向流量若涉及端口映射(-p 8080:80),则靠 DNAT 规则将宿主机端口转给容器
为什么推荐用自定义 bridge 网络
默认的 docker0 网桥虽然开箱即用,但在实际项目中很快会遇到瓶颈:
- 容器只能靠 IP 互访,没法用服务名(比如 curl nginx)
- 所有未指定网络的容器都挤在同一个网段,缺乏隔离
- 无法动态调整 MTU、启用 IPv6、设置网关等参数
- 重启 Docker 服务才会重新加载 docker0 配置,不够灵活
而 docker network create mynet 创建的自定义网络,本质是另一个独立网桥,但自带 DNS 解析、命名互通、网络作用域隔离——这才是生产环境该用的方式。


















