Debian Stretch下断网时无法访问Docker PHP容器问题求助
解决Debian Stretch离线时无法访问Docker PHP容器的问题
我之前碰到过几乎一模一样的场景,结合你的配置和现象来看,核心问题大概率出在离线状态下Docker的网络转发规则或主机路由被意外重置,下面是具体的分析和可落地的修复方案:
现象拆解
你提到离线时连容器IP(172.19.0.3)都访问不了,这说明不是DNS解析的问题(毕竟访问IP不需要依赖DNS),而是主机和Docker自定义网桥之间的网络连通性出现了中断。Debian Stretch的NetworkManager默认会在网络断开时清理iptables规则,而Docker正是依赖iptables来实现容器端口转发和子网路由的——这几乎就是罪魁祸首。
修复方案
1. 禁止NetworkManager修改iptables(最常用的解决办法)
Debian的NetworkManager默认会在网络状态变化时重置iptables,关掉这个行为就能解决大部分问题:
- 编辑NetworkManager配置文件:
nano /etc/NetworkManager/NetworkManager.conf - 在
[main]区块添加一行:iptables=false - 重启NetworkManager使配置生效:
systemctl restart NetworkManager - 接着重启Docker服务,让它重新生成iptables转发规则:
systemctl restart docker - 最后重启容器:
docker-compose up -d
2. 手动添加自定义网桥的路由(如果路由丢失)
如果离线时主机到172.19.0.0/24子网的路由消失了,手动添加路由即可:
- 先找到自定义网桥的实际名称:
输出会类似docker network inspect lamp | grep "com.docker.network.bridge.name""com.docker.network.bridge.name": "br-abcdef123456" - 添加临时路由(重启主机后失效):
ip route add 172.19.0.0/24 dev br-abcdef123456 - 要让路由永久生效,创建一个网桥配置文件:
写入以下内容(注意替换网桥名称和网关地址):nano /etc/network/interfaces.d/lamp_bridge
这里的auto br-abcdef123456 iface br-abcdef123456 inet static address 172.19.0.1 netmask 255.255.255.0172.19.0.1是你自定义子网的网关,一般是子网的第一个IP地址。
3. 验证离线连通性
断开网络后,执行以下命令验证修复效果:
- ping容器IP:
ping 172.19.0.3,确认是否能收到响应 - 访问容器服务:
curl http://172.19.0.3或curl http://test.dkr,确认网页正常加载
额外说明
你的/etc/hosts配置127.0.0.1 test.dkr是完全没问题的,因为容器端口已经映射到主机的80/443端口,只要主机到容器的转发规则正常,通过test.dkr访问就会生效。
内容的提问来源于stack exchange,提问作者sakhunzai
相关产品推荐
相关产品推荐

