核心是通过 /etc/docker/daemon.json 配置 default-address-pools(如 "base": "172.29.0.0/16", "size": 24)避开公司内网网段,重启 Docker 后 docker0 自动分配首个 /24 子网(如 172.29.0.0/24),并支持后续自定义网络按序分配。

要让 Docker 容器的默认桥接网络(docker0)不与公司内网冲突,核心是修改 Docker daemon 的默认网桥子网——这必须通过 /etc/docker/daemon.json 配置实现,而不是运行时参数或容器启动选项。
确认公司内网常用网段,避开典型私有地址
先摸清你司内网实际使用的 IP 段,常见但需避开的包括:
• 192.168.0.0/16(尤其 192.168.1.0/24、192.168.10.0/24 等高频办公网段)
• 172.16.0.0/12(如 172.16.100.0/24、172.20.0.0/16 等常被用作办公或服务器网段)
• 10.0.0.0/8(特别是 10.1.0.0/16、10.254.0.0/16 等常用于 Kubernetes 或旧系统)
建议优先选用非常规、低使用率的私有网段,例如 172.29.0.0/16 或 10.200.0.0/16,避免未来扩容时踩坑。
正确配置 daemon.json 中的 default-address-pools
Docker 20.10+ 推荐使用 default-address-pools 替代老旧的 bip,它更灵活、支持多子网且兼容 swarm。编辑 /etc/docker/daemon.json:
{
"default-address-pools": [
{
"base": "172.29.0.0/16",
"size": 24
}
]
}
说明:
• base 是分配池起始网段,必须是私有地址且不与内网重叠
• size 表示每个新创建的桥接网络(如 docker0 或用户自定义 bridge)默认划出 /24 子网
• 此配置生效后,docker0 会自动从 172.29.0.0/16 中取第一个 /24(即 172.29.0.0/24),后续新建 bridge 网络依次分配 172.29.1.0/24、172.29.2.0/24…
重启 Docker 并验证配置是否生效
执行以下操作确保变更落地:
• sudo systemctl daemon-reload
• sudo systemctl restart docker
• 检查 docker0 是否已更新:ip addr show docker0 | grep inet → 应显示类似 inet 172.29.0.1/24
• 查看所有 bridge 网络子网:docker network inspect bridge | grep Subnet
• 新建一个自定义网络验证池分配:docker network create testnet,再 docker network inspect testnet 看 Subnet 是否为 172.29.1.0/24
注意事项与避坑点
• 修改前务必停止所有正在运行的容器(或接受它们重启),因为 bridge 网络重建会导致容器网络重置
• 若已有大量容器依赖默认 docker0,建议提前测试并通知协作方
• 不要同时设置 bip 和 default-address-pools,后者优先级更高且更健壮
• 如果公司内网用了非常规段(如 100.64.0.0/16 或 198.18.0.0/15),也要一并避开——这些虽非 RFC1918 私有段,但被 IANA 分配给特殊用途
• 生产环境建议配合 iptables 或防火墙策略,限制 docker0 对内网路由,进一步防误连


















