侧边栏壁纸
  • 累计撰写 9 篇文章
  • 累计创建 3 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

VPS 更换 IP 后 Docker 容器无法访问的排查与修复

Administrator
2026-05-09 / 0 评论 / 0 点赞 / 1 阅读 / 0 字

问题现象

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 丢失
  • iptables NAT 规则虽然存在,但包到达 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
博主关闭了所有页面的评论