问题现象
VPS 厂商更换公网 IP 后,原本正常运行的 Docker 容器服务突然无法从外部访问。
- 服务状态正常:
docker ps显示容器运行中 - 端口映射正常:
-p 8080:8080已配置 - 但外部访问
http://<新IP>:8080/始终超时
排查过程
第一步:确认服务监听状态
ss -tlnp | grep 8080
# LISTEN 0 4096 0.0.0.0:8080 0.0.0.0:* users:(("docker-proxy",pid=...))
Docker 端口映射已建立,服务在监听。
第二步:分层测试连通性
| 测试路径 | 结果 | 结论 |
|---|---|---|
容器内部 127.0.0.1:8080 | ✅ 正常 | 应用本身没问题 |
宿主机 curl 127.0.0.1:8080 | ❌ 卡住 | 宿主机→容器路径有问题 |
宿主机 ping 172.20.0.4 | ❌ 不通 | Docker bridge 网络异常 |
关键发现:宿主机无法 ping 通容器 IP!
第三步:检查 Docker Bridge 网络
ip addr show br-473fb3d4a9fb
发现 bridge 接口 没有 IP 地址:
7: br-473fb3d4a9fb: <BROADCAST,MULTICAST,UP,LOWER_UP>
link/ether 72:35:b3:3f:e8:31
# 没有 inet 地址!
正常应该有 172.20.0.1/16 作为网关。
根因分析
VPS 更换公网 IP 时,系统网络层发生变动,触发了 Docker bridge 网络的异常状态:
- Docker 自定义 bridge 网络的 网关 IP 丢失
iptablesNAT 规则虽然存在,但包到达 bridge 后没有网关可转发- 导致宿主机与容器之间的通信完全中断
修复方案
方案一:手动恢复(临时)
# 为 bridge 接口添加丢失的 IP
ip addr add 172.20.0.1/16 dev br-473fb3d4a9fb
缺点:重启后失效。
方案二:重启 Docker 服务(推荐)
systemctl restart docker
Docker 会重新初始化所有 bridge 网络,自动正确配置网关 IP。
验证修复
# 1. 检查 bridge IP 已恢复
ip addr show br-473fb3d4a9fb
# inet 172.20.0.1/16 scope global
# 2. 测试容器连通性
ping -c 3 172.20.0.4
# 64 bytes from 172.20.0.4: icmp_seq=1 ttl=64
# 3. 测试外部访问
curl -s http://<公网IP>:8080/
# HTTP/1.1 200 OK
总结
| 问题 | 原因 | 解决 |
|---|---|---|
| 容器服务无法访问 | Docker bridge 网关 IP 丢失 | systemctl restart docker |
预防措施:
- VPS 更换 IP 后,检查 Docker 网络状态
- 若发现
br-*接口缺少 IP,直接重启 Docker 即可 - 无需手动修改 iptables 或网络配置
相关命令速查
# 查看 Docker 网络
ip addr show | grep br-
docker network ls
# 检查容器 IP
docker inspect <容器名> --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
# 测试容器连通性
docker exec <容器名> wget -qO- http://127.0.0.1:8080/
# 快速修复
systemctl restart docker