在使用 Docker 自定义网桥、指定固定子网部署容器项目时,很多人都会遇到一个经典报错:
Error response from daemon: invalid pool request: Pool overlaps with other one on this address space
无论填写 172.20.0.0/16 还是 172.20.80.0/24,都会提示网段重叠。本文将彻底讲清报错根源,提供临时快速解决和永久根治两种方案,彻底解决 Docker 网段冲突问题。
一、报错核心原因(99% 人踩坑的关键点)
很多同学误以为:只要我用的小段子网没被现有网络占用,就可以自定义。这是错误的核心误区。
Docker 内置了默认全局地址池,默认预留了一整段大网段:
172.17.0.0/16 ~ 172.31.0.0/16
只要你的自定义子网落在这个区间内,无论该小段是否被实际使用,Docker 都会判定为网段重叠、冲突,禁止手动创建。
这也就是为什么 172.20.0.0/16、172.20.80.0/24都会报错的根本原因——整段 172.17-172.31 已被 Docker 锁定占用。
二、快速临时解决方案(直接复制即用,零报错)
避开 Docker 172 预留网段,选用私有内网安全网段,推荐两套稳定方案,任选其一即可。
方案1:使用 10 段内网(最推荐,无任何冲突)
10.0.0.0/8 是超大私有网段,完全不在 Docker 默认地址池内,稳定性最高,适合绝大多数项目。
# 创建自定义网络,固定10段子网
docker network create --subnet=10.20.80.0/24 tortoise-network
方案2:使用 192.168 段内网(适配本地局域网习惯)
贴合家用、服务器常规内网网段,适配性强,适合小型项目测试。
# 创建自定义网络,固定192.168段子网
docker network create --subnet=192.168.80.0/24 tortoise-network
方案3:坚持使用172网段(跳出默认预留区间)
如果业务必须使用 172 网段,只能选择 172.17 之前 / 172.31 之后 的网段,示例如下:
# 可用172网段示例
docker network create --subnet=172.16.0.0/24 tortoise-network
docker network create --subnet=172.32.80.0/24 tortoise-network
三、查看当前Docker已占用网段(精准排错)
如果需要精准规避冲突,可以执行命令查看服务器所有 Docker 网络及对应子网:
# 查看所有Docker网络详细网段信息
docker network inspect $(docker network ls -q) | jq '.[].IPAM.Config'
执行后可清晰看到所有已占用的子网,按需选择空闲网段即可。
四、永久根治:修改Docker默认地址池(彻底告别冲突)
每次手动换网段太麻烦,直接修改 Docker 守护进程配置,让 Docker 后续所有新建网络默认使用自定义网段,不再占用 172 段,彻底杜绝冲突问题。
1. 编辑Docker配置文件
如果文件不存在则自动新建,执行编辑命令:
vim /etc/docker/daemon.json
2. 写入自定义地址池配置
配置让 Docker 默认从 10.10.0.0/16 分配 /24 子网,彻底避开172冲突段:
{
"default-address-pools": [
{
"base": "10.10.0.0/16",
"size": 24
}
]
}
配置说明: – base:Docker默认分配的总网段 – size:每次新建网络的子网掩码(/24 够用,包含254个可用IP)
3. 重启Docker生效配置
# 重载系统配置
systemctl daemon-reload
# 重启Docker服务
systemctl restart docker
重启完成后,后续所有 docker network create 新建网络,都会自动使用10段网段,再也不会出现网段重叠报错。
五、实用优化建议
- 禁止使用超大网段:个人/项目测试无需 /16 网段(65534个IP),统一使用 /24 网段即可,精简且无资源浪费;
- 清理无效网络:服务器存在废弃旧网络时,可执行
docker network rm 网络名删除,释放网段资源; - 优先10段网段:对比192.168段,10段完全独立,不会和服务器本地局域网、虚拟机网段冲突,兼容性最优。
六、总结
1. 报错本质:172.17.0.0/16 ~ 172.31.0.0/16 是Docker默认锁定网段,区间内所有子网均无法自定义; 2. 临时解决:改用 10段 / 192.168段 私有网段,一键创建无报错; 3. 永久解决:修改 daemon.json 自定义Docker默认地址池,彻底根除网段冲突。