Docker Engine 启动时自动创建并配置 docker0 网桥,依赖 bridge 模块、IPv4 转发和 iptables;支持通过 --bip 等参数自定义,容器默认通过 veth 对接入;失败需检查模块、日志、IP 转发、命名冲突及 NetworkManager 干扰。

Docker Engine 启动时会自动初始化网络堆栈,并默认创建一个名为 docker0 的 Linux 网桥,作为容器默认桥接网络的基础设施。这个过程不是手动触发的,而是由 dockerd 在启动阶段完成的,依赖内核的 bridge 模块和 iptables(或 nftables)规则支持。
docker0 网桥的自动创建与基础配置
Docker 守护进程在首次启动且未指定 --bridge= 或 --bip 时,会执行以下操作:
- 检查内核是否已加载
bridge模块(lsmod | grep bridge),未加载则尝试modprobe bridge - 调用 netlink 接口创建名为
docker0的虚拟网桥设备 - 为其分配默认子网
172.17.0.0/16,并设置网关地址为172.17.0.1 - 启用 IPv4 转发(
net.ipv4.ip_forward = 1),若系统未开启则尝试写入/proc/sys/net/ipv4/ip_forward - 配置 NAT 规则:通过
iptables -t nat -A POSTROUTING实现容器出向流量源地址转换(SNAT)
自定义 docker0 网桥的启动参数
可通过 dockerd 启动选项覆盖默认行为,常见组合如下:
-
--bip=192.168.100.1/24:指定docker0的 IP 和子网,替代默认172.17.0.0/16 -
--fixed-cidr=192.168.100.0/25:限制容器分配的 IPv4 地址范围(影响docker network create的默认行为) -
--mtu=1400:设置docker0的 MTU,需与底层网络匹配以避免分片 -
--bridge=docker0:显式指定网桥名(默认即此值,一般无需设置)
这些参数通常写入 /etc/docker/daemon.json 或 systemd service 文件的 ExecStart 行中,修改后需重启 dockerd 生效。
容器连接 docker0 的工作流程
当运行 docker run --network bridge(默认)时,Docker 执行以下步骤:
- 在宿主机上创建一对
veth虚拟网卡,一端加入容器命名空间(重命名为eth0),另一端挂载到docker0网桥 - 为容器内
eth0分配来自--fixed-cidr或docker0子网的 IP(如172.17.0.2) - 在容器内设置默认路由指向
docker0的 IP(如172.17.0.1) - 在宿主机添加
iptables规则:允许docker0子网间转发、对出向流量做 MASQUERADE、开放端口映射(-p)对应的 DNAT/REDIRECT
排查 docker0 初始化失败的常见原因
若 docker0 未出现或容器无法联网,可按顺序检查:
- 确认
bridge内核模块可用:lsmod | grep bridge;若无输出,执行sudo modprobe bridge - 查看 dockerd 日志:
journalctl -u docker.service -n 50 --no-pager,搜索Failed to setup docker0或could not find bridge - 检查
/proc/sys/net/ipv4/ip_forward是否为1;临时修复:echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward - 确认无其他进程占用了
docker0名称或冲突子网(例如已有同名网桥或本地服务监听172.17.0.1) - 禁用 NetworkManager 对网桥的干扰:在
/etc/NetworkManager/conf.d/10-docker.conf中添加[keyfile] unmanaged-devices=interface-name:docker0

















