执行 docker network create 或启动Compose项目时,如果返回 Pool overlaps with other one on this address space,表示准备分配的子网与Docker已经管理的另一个地址池发生重叠。它通常不是端口占用,也不是容器镜像损坏。
先查清哪些网段已经被Docker、宿主机和VPN使用,再选择新子网。 随意删除网络或修改正在使用的网段,可能让现有容器失联。

先列出Docker已经占用的网段
先查看网络清单,再输出每个网络的驱动、子网和网关:
docker network ls
docker network inspect $(docker network ls -q) \
--format '{{.Name}} {{.Driver}} {{json .IPAM.Config}}'
Docker桥接网络会拥有自己的IPv4子网,连接到该网络的容器从其中获得地址。报错说明新申请的CIDR与某个现有Docker网络的范围有交集,即使两个网段写法看起来不同也可能相互包含。
例如 172.20.0.0/16 会覆盖 172.20.10.0/24,因此不能同时作为两个本地桥接网络使用。必须按CIDR范围判断重叠,不能只比较前三段数字。
同时核对宿主机、VPN和云内网路由
Docker网络不应与VPS当前可达的业务网段冲突,否则容器访问内网、数据库或VPN对端时可能走错接口。检查主机路由和地址:
ip -4 address show
ip -4 route show
ip -4 route get 10.10.10.10
如果服务器接入WireGuard、OpenVPN、Tailscale或云厂商VPC,还要查看这些系统下发的路由。自动选择一个Docker未使用的私网段仍不够,它也必须避开宿主机未来可能接入的办公网、VPC和站点到站点VPN地址。
记录现有容器子网、宿主机LAN/VPC子网、VPN对端子网和计划新增的子网,确认任何两个CIDR都不相交。
为单个网络指定不重叠的子网
只影响一个项目时,优先为该网络显式指定经过规划的CIDR:
docker network create \
--driver bridge \
--subnet 172.30.40.0/24 \
--gateway 172.30.40.1 \
app-net
Compose可以在网络的IPAM配置中指定子网:
services:
app:
image: nginx:alpine
networks:
- app-net
networks:
app-net:
ipam:
config:
- subnet: 172.30.40.0/24
上述地址只是示例,不能直接照搬到所有服务器。上线前必须以本机和所在组织的真实路由规划为准。
调整Docker默认地址池前先验证配置
大量Compose项目依赖自动分配时,可以在 /etc/docker/daemon.json 中规划默认地址池。Docker守护进程支持 default-address-pools,并可用 dockerd --validate 检查配置文件语法。
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
sudo editor /etc/docker/daemon.json
sudo dockerd --validate --config-file=/etc/docker/daemon.json
示例配置如下,base 是可分配的大地址池,size 是每个自动创建网络的前缀长度:
{
"default-address-pools": [
{"base": "172.30.0.0/16", "size": 24}
]
}
如果文件已有其他键,应合并成一个合法JSON对象,不能覆盖日志、镜像源或运行时配置。修改后通常需要重启Docker才能生效,重启可能影响未启用可靠重启策略的容器,应安排维护窗口。
需要先演练地址池调整,可在 萤光云 创建隔离测试机;要验证跨地区VPN路由,也可用 LightNode 部署临时节点。测试环境不要复用生产密钥和真实业务网段。
已有网络不会自动重新编号
改变默认地址池只影响之后自动创建的网络,现有网络不会自动改成新子网。要迁移旧网络,应先确认连接的容器:
docker network inspect old-net
docker ps --filter network=old-net
安排停机后停止相关服务、删除旧网络,再按新地址重新创建并启动项目。Docker不会删除仍有活动端点的网络;不要用批量清理命令代替逐项确认。
容器卷和网络是不同资源,迁移网络不应顺带删除数据卷。 使用Compose时先检查项目名、外部网络声明和固定IP配置,避免重建后容器仍引用旧地址。
修复后的验收方法
创建新网络后检查实际分配结果,并从容器内验证目标连接:
docker network inspect app-net \
--format '{{json .IPAM.Config}}'
docker run --rm --network app-net alpine ip route
再核对宿主机路由,确认访问VPC、VPN和公网的路径没有被新桥接网段截获。业务容器应通过服务名通信,不要长期依赖会随重建变化的容器IP。
验收通过应同时满足网络可创建、CIDR无重叠、容器间通信正常、内网与VPN路由未改变,并且Docker重启后项目仍能恢复。
FAQ
直接执行docker network prune可以解决吗?
它只会清理未被容器使用的网络,可能释放某些旧地址池,但不能修复网段规划问题。执行前必须确认清理范围。
可以使用公网IP段作为Docker私网吗?
不建议。这样可能让容器无法访问真实公网中的同一地址范围,应使用经过组织规划且不与现有路由重叠的私有地址。
修改default-address-pools会改变现有容器IP吗?
不会自动改变。现有网络要通过受控重建才能迁移到新子网。
温馨提示
Docker网段冲突本质上是地址规划问题。先制作完整路由清单,再迁移单个网络;调整全局地址池前务必备份daemon.json、验证语法并预留回退窗口。


