这个坑值得记一笔。公司办公网用的是 172.17.0.0/16,一台 CentOS 7.9 的开发机装了 Docker 后容器访问外部接口全部超时,宿主机自己 curl 却正常。
刚开始盯着「自定义 bridge 也分到了同一网段,NAT 之后的源地址被办公网设备丢弃」,折腾了半个多小时,排掉了。
排查方向其实有限,先把可能性排一排。docker0 默认网段就是 172.17.0.0/16,与办公网完全重叠,回包被发到了错误的网关;容器里的路由认为 172.17.x.x 在本地链路,报文根本没出宿主机;宿主机上有多张网卡,返回路由走了错误的那一张。
先确认冲突的具体网段
ip route | grep -E '172.17|docker'
然后改 daemon.json 里的默认网段
printf '{"bip":"10.99.0.1/24","default-address-pools":[{"base":"10.99.0.0/16","size":24}]}' > /etc/docker/daemon.json
接着重启 docker 让新网段生效
systemctl restart docker && ip -4 addr show docker0
新建网络并验证容器出网
docker network create --subnet 10.99.5.0/24 appnet && docker run --rm --network appnet busybox ping -c1 8.8.8.8
怎么算真的好了,看的是同一批现象。ip addr 显示 docker0 变成 10.99.0.1/24,容器内 ping 与 curl 均正常,traceroute 第一跳是宿主机网关。
补一句。改网段会让老容器全部重建,IP 也会变;规划容器网段时要和办公网、VPC、专线网段一起看,撞上之后再改代价很大。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
