docker0 网桥作用
面试题
Docker 中的 docker0 网桥是什么?有什么作用?它是如何工作的?
标准答案
docker0 是 Docker 安装后自动创建的 Linux 网桥(Bridge),它是默认 bridge 网络模式的核心组件。本质上,docker0 是一个工作在二层的虚拟交换机。
docker0 是什么
# 查看 docker0 网桥
ip link show docker0
# 3: docker0: mtu 1500 qdisc noqueue
# link/ether 02:42:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
# 查看 docker0 的 IP
ip addr show docker0
# inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
# 查看网桥上连接的设备
brctl show docker0
# bridge name bridge id STP enabled interfaces
# docker0 8000.0242xxxxxxxx no veth12ab
# veth34cd
# veth56ef
本质: docker0 是一个 Linux Bridge(即软件实现的二层交换机),它在内核层面工作,效率远高于用户态模拟的虚拟交换机。
docker0 的核心作用
1. 容器间通信的枢纽
所有连接到 docker0 的容器可以通过它相互通信:
# 每个通过 bridge 模式启动的容器
# 它的 veth 对一端在宿主机上连接到 docker0
# 另一端在容器内作为 eth0
# 网桥的工作方式
# - 记录每个端口连接的 MAC 地址
# - 收到数据帧后根据目标 MAC 地址决定转发到哪个端口
# - 不知道目标 MAC 时广播到所有端口(ARP 广播)
2. 容器的默认网关
# docker0 的 IP 地址是容器的默认网关
docker exec web ip route
# default via 172.17.0.1 dev eth0
# 172.17.0.0/16 dev eth0 scope link src 172.17.0.2
# 容器访问外部网络时,数据包先发给 docker0
# docker0 通过 NAT 转发到宿主机物理网卡
3. NAT 和端口映射的入口
# docker0 与 iptables 配合实现:
# 1. 容器 → 外网:源地址转换(SNAT/Masquerade)
# 2. 外网 → 容器:目的地址转换(DNAT/端口映射)
# NAT 规则
iptables -t nat -L -n | grep docker0
docker0 的工作流程
# 场景:一个数据包从 Web 容器发送到数据库容器
# 1. 容器 A (172.17.0.2) 发送数据包到容器 B (172.17.0.3)
# 源 MAC: 容器 A 的 eth0 MAC
# 目标 MAC: 容器 B 的 eth0 MAC(通过 ARP 获取)
# 2. 数据包通过 veth pair 到达宿主机上的 vethXXX
# vethXXX 连接到 docker0 网桥
# 3. docker0 查找 MAC 转发表
# 发现目标 MAC 对应 vethYYY(容器 B 的 veth)
# 将数据包转发到 vethYYY
# 4. 数据包通过 vethYYY 到达容器 B 的 eth0
# 容器 B 的内核协议栈处理数据包
查看和管理 docker0
# 网桥基本信息
docker network inspect bridge
# 输出包含:Subnet、Gateway、Containers 列表
# 网桥的 MAC 地址表
brctl showmacs docker0
# port no mac addr is local? ageing timer
# 1 02:42:ac:11:00:02 no 0.00
# 2 02:42:ac:11:00:03 no 1.23
# 监控网桥流量
tcpdump -i docker0
# 修改 docker0 的 MTU
# /etc/docker/daemon.json
{
"mtu": 1450
}
docker0 与用户自定义网桥的区别
| 特性 | docker0(默认 bridge) | 自定义 bridge |
|---|---|---|
| 创建方式 | 自动创建 | 用户显式创建 |
| DNS 解析 | ❌ 不支持容器名解析 | ✅ 支持自动 DNS |
| 子网 | 固定 172.17.0.0/16 | 用户自定义 |
| 端口隔离 | 默认互通 | 默认互通 |
| 隔离性 | 同一宿主机所有容器共享 | 网络间隔离 |
| iptables 规则 | Docker 自动管理 | Docker 自动管理 |
常见问题
Q:可以删除或修改 docker0 网桥吗?
可以但需要重启 Docker:
# 删除默认 docker0(重启 Docker 会自动重建)
ip link set docker0 down
brctl delbr docker0
# 或者修改配置
# /etc/docker/daemon.json
{
"bridge": "none" # 禁用默认 bridge
}
Q:docker0 的 IP 地址可以修改吗?
# /etc/docker/daemon.json
{
"bip": "192.168.10.1/24" # custom bridge IP
}
systemctl restart docker
Q:多个自定义 bridge 网桥与 docker0 什么关系?
它们之间没有直接关系。每个自定义网桥是独立的虚拟交换机,网络之间完全隔离。容器要跨网桥通信需要通过宿主机路由或其他机制。
Q:docker0 的性能瓶颈在哪里?
- 大量容器时,docker0 的 MAC 地址表可能饱和
- 所有容器共享同一个网桥的带宽
- iptables 规则数量增加会影响转发性能
最佳实践
# 1. 生产环境建议使用自定义 bridge
docker network create --driver bridge --subnet 10.0.0.0/16 mynet
# 2. docker0 适合单机简单场景
# 复杂多网络场景用自定义 bridge
# 3. 修改 docker0 子网避免与其他网段冲突
# 特别是公司内网使用 172 网段时
总结
docker0 是默认 bridge 模式的底层基础设施,充当虚拟交换机 + 网管 + NAT 入口的三重角色。理解 docker0 就理解了 Docker 网络的核心。实际生产环境推荐使用自定义 bridge,但了解 docker0 的工作原理对排查网络问题至关重要。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容