容器ping 8.8.8.8失败说明网桥或ip转发异常:需先停docker、pkill残留进程、清iptables nat规则、删docker0网桥后重启;再检查ip_forward是否为1、forward链策略是否accept、networkmanager是否劫持docker0及resolv.conf。

容器 ping 8.8.8.8 失败,说明不是 DNS 问题而是网桥断连
只要 docker exec -it <container> ping 8.8.8.8</container> 超时,但宿主机能通,就不用查 /etc/resolv.conf 或换 DNS——这是底层 IP 转发或 docker0 网桥挂了。宝塔环境里尤其容易被 NetworkManager 静默劫持网桥配置,导致容器发不出任何包。
验证方式很简单:
- 执行
ip link show docker0,没输出说明网桥已丢失 - 执行
sysctl net.ipv4.ip_forward,返回0表示内核转发关闭 - 执行
iptables -t nat -L POSTROUTING,若无MASQUERADE规则,NAT 层就断了
重建 docker0 网桥前必须停掉所有 Docker 进程
宝塔环境下常有残留的 dockerd 进程卡住,直接 systemctl restart docker 可能无效。必须手动清理干净再重建:
- 先运行
sudo systemctl stop docker - 再执行
sudo pkill docker(重点杀掉未响应的 dockerd) - 清空 NAT 规则:
sudo iptables -t nat -F - 删掉旧网桥:
sudo ifconfig docker0 down && sudo brctl delbr docker0 - 最后启动:
sudo systemctl start docker
完成后用 ip addr show docker0 确认接口存在,且 IP 是 172.17.0.1/16 类型;再用 docker network ls 看 bridge 是否恢复。
宿主机 IP 转发未开启会导致容器出向流量静默丢弃
Docker 的 SNAT 依赖 net.ipv4.ip_forward=1,关着它,哪怕 docker0 存在、容器能分配 IP,照样上不了网。
- 临时开启:
sudo sysctl -w net.ipv4.ip_forward=1 - 永久生效:往
/etc/sysctl.conf追加net.ipv4.ip_forward = 1,再执行sudo sysctl -p - 注意宝塔服务器若启用了
firewalld或ufw,还需检查FORWARD链默认策略是否为ACCEPT,否则转发包会被拦截
NetworkManager 会偷偷覆盖容器 DNS 和接管 docker0
Ubuntu/CentOS 桌面版或部分云镜像自带 NetworkManager,它会在你不知情时把 docker0 当成普通网卡管理,导致容器内 /etc/resolv.conf 被清空或写入错误 nameserver。
- 编辑
/etc/NetworkManager/NetworkManager.conf,在[main]段下添加dns=none(或注释掉dns=dnsmasq) - 重启服务:
sudo systemctl restart NetworkManager && sudo systemctl restart docker - 验证容器内 DNS:
docker exec -it bt-panel cat /etc/resolv.conf,应含nameserver 8.8.8.8或宿主机真实 DNS
这个干扰点不报错、不写日志,只能靠人工比对 /etc/resolv.conf 内容判断,是宝塔 + Docker 组合中最隐蔽的故障源。











