通过修改 /etc/docker/daemon.json 中的 default-address-pools 配置项,可以指定 docker 使用特定的 ip 子网段来分配容器地址,从而避开与宿主机或局域网中其他设备的网卡冲突。设置完成后重启 docker 服务即可生效。

Docker 默认分配的网段是否与当前网络冲突
Docker 在首次启动时会自动选择一个未被占用的私有网段(通常是 172.17.0.0/16)作为默认的桥接网络。如果该网段已经存在于你的局域网中,或者你手动创建的网络与现有路由冲突,新容器将无法获取 IP。我们可以通过查询当前 Docker 网络的详细信息来确认是否存在冲突。

{
"default-address-pools": [
{
"base": "192.168.0.0/16",
"size": 24
}
]
}
上述 JSON 配置将 Docker 的默认分配范围限制在 192.168.0.0/24 到 192.168.255.0/24 之间。假设你的局域网使用的是 10.0.0.0/8 或 192.168.1.0/24,这种配置就能有效避免冲突。保存文件后,执行 sudo systemctl restart docker 使配置生效。此时新建的容器将从指定的子网中获取 IP。
如何验证新配置的 IP 分配是否生效
配置修改并重启服务后,需要验证 Docker 是否真的使用了新的网段。可以通过运行一个临时容器并检查其内部 IP 地址来确认。如果 IP 落在配置的范围内,说明冲突已解决。

docker run --rm -it alpine ip addr show eth0
运行上述命令后,观察输出结果。如果 eth0 接口的 IP 地址以 192.168.x.x 开头,则证明 Docker 已成功应用新的地址池配置。若仍然出现旧网段的 IP,请检查 daemon.json 语法是否正确,并确保没有残留的旧网络对象占用资源。可以使用 docker network prune 清理未使用的网络,但需注意这会断开正在运行的容器的网络连接。
特定容器无法获取 IP 时的排查步骤
即使全局配置正确,个别容器仍可能因网络状态异常而无法分配 IP。这通常是因为容器对应的虚拟网卡处于错误状态或 IP 租约过期。此时不需要修改全局配置,而是针对该容器进行重置。
首先,停止有问题的容器:docker stop 。然后,删除该容器:docker rm 。最后,重新启动容器:docker start 。Docker 守护进程会在启动时重新为容器分配网络命名空间和 IP 地址。如果问题依旧,检查宿主机内核模块 br_netfilter 是否加载,以及防火墙规则是否阻止了 Docker 的桥接通信。











