自定义Docker桥接网络:docker0及容器与本地同网关/IP段配置异常
首先,我帮你梳理下当前配置里的潜在问题,再一步步排查修复:
1. 先检查配置的子网合理性
你的daemon.json配置内容如下:
{ "bip": "10.80.44.248/24", "fixed-cidr": "10.80.44.250/25", "mtu": 1500, "default-gateway": "10.80.44.254", "dns": ["10.80.41.14"] }
这里有个关键前提要确认:你的本地物理网卡必须处于10.80.44.0/24网段,且网关10.80.44.254是本地机器正在使用的网关。如果本地机器不在这个网段,Docker网桥和本地网络的路由会直接断层,这是docker0收不到数据的常见原因。
另外,fixed-cidr的10.80.44.250/25子网范围是10.80.44.128-255,和bip的10.80.44.0/24是兼容的,这部分没问题。
2. 确认Docker服务已加载新配置
修改daemon.json后必须重启Docker服务才能生效,执行命令:
sudo systemctl restart docker
重启后验证配置是否生效:
# 查看docker0的IP和状态 ip addr show docker0 # 检查容器IP是否在fixed-cidr范围内 docker inspect <容器ID/名称> | grep IPAddress
3. 排查iptables规则异常
Docker依赖iptables处理容器和外部的网络通信,如果iptables规则被重置或破坏,会直接导致docker0无法接收数据。执行命令检查Docker专属链是否存在:
sudo iptables -L -n | grep DOCKER
如果看不到DOCKER、DOCKER-ISOLATION-STAGE-1这类链,说明Docker的iptables规则没有生成。可以尝试重置后重启Docker:
sudo systemctl stop docker sudo iptables -F && sudo iptables -t nat -F sudo systemctl start docker
4. 检查IP地址冲突
确认bip配置的10.80.44.248没有被本地网络中的其他设备占用:
ping 10.80.44.248 -c 3
如果能收到其他设备的响应,说明IP冲突,需要把bip改成同网段内的空闲IP。
5. 验证路由表配置
查看系统路由表,确认存在Docker子网的正确路由:
ip route show
正常情况下会看到类似10.80.44.0/24 dev docker0 proto kernel scope link src 10.80.44.248的条目。如果没有,手动添加路由:
sudo ip route add 10.80.44.0/24 dev docker0
6. 测试容器连通性
启动一个测试容器,验证和本地机器、网关的连通性:
# ping本地机器IP docker run --rm busybox ping <本地机器IP> -c 3 # ping网关 docker run --rm busybox ping 10.80.44.254 -c 3
如果ping不通,回到前面的步骤重新排查路由、iptables或网段匹配问题。
内容的提问来源于stack exchange,提问作者Seek Addo

