插件窝 干货文章 docker突然不能访问外网怎么办

docker突然不能访问外网怎么办

Docker 宿主机 容器 网络 118    来源:    2025-04-28

当 Docker 容器突然无法访问外网时,可以按照以下步骤排查和解决问题:


1. 检查宿主机的网络连接

  • 确保宿主机本身能访问外网: bash ping 8.8.8.8 # 测试基础网络 curl -I https://www.google.com # 测试DNS和HTTP
  • 如果宿主机无法访问外网,检查宿主机的网络配置(如IP、网关、DNS等)。

2. 检查 Docker 服务状态

  • 确保 Docker 服务正在运行: bash systemctl status docker # Linux
  • 重启 Docker 服务: bash systemctl restart docker # Linux

3. 检查 Docker 网络配置

  • 查看 Docker 网络模式: bash docker network ls
  • 默认的 bridge 网络是否正常: bash docker inspect bridge
  • 重点检查以下字段:
    • "Gateway":应为宿主机的 Docker 网桥 IP(如 172.17.0.1)。
    • "IPAM.Config":子网配置是否合理。

4. 验证容器的网络配置

  • 进入容器测试网络: bash docker exec -it <容器名> sh ping 8.8.8.8 # 测试基础连通性 nslookup google.com # 测试DNS解析
  • 如果容器内无法解析域名,检查 /etc/resolv.conf 文件是否包含有效 DNS(如 8.8.8.8 或宿主机的 DNS)。

5. 检查防火墙/安全组规则

  • 宿主机防火墙(如 iptables/ufw/firewalld)可能阻止了容器的出站流量: bash iptables -L -n # 查看规则 iptables -P FORWARD ACCEPT # 临时允许转发流量
  • 如果使用云服务器(如 AWS/Azure),检查安全组是否放行出站流量。

6. 重启 Docker 默认网络

  • 重置 Docker 的默认网络配置(谨慎操作,会重建所有网络): bash systemctl stop docker rm -rf /var/lib/docker/network systemctl start docker

7. 检查 Docker DNS 配置

  • 如果容器内 DNS 解析失败,启动容器时显式指定 DNS: bash docker run --dns 8.8.8.8 --dns 8.8.4.4 ...
  • 或修改 Docker 守护进程配置(/etc/docker/daemon.json): json { "dns": ["8.8.8.8", "1.1.1.1"] } 然后重启 Docker: bash systemctl restart docker

8. 检查 IPv6 冲突

  • 如果宿主机启用了 IPv6,但 Docker 未配置,可能导致问题。禁用 IPv6 或调整 Docker 配置: json { "ipv6": false }

9. 其他可能原因

  • Docker 版本问题:升级 Docker 到最新稳定版。
  • 网络驱动问题:尝试使用 host 网络模式测试: bash docker run --network=host ...
  • 代理设置:如果宿主机使用代理,需在容器内配置 HTTP_PROXY 环境变量。

快速恢复步骤总结:

  1. 重启 Docker 服务:systemctl restart docker
  2. 检查防火墙规则:iptables -L -n
  3. 验证容器 DNS:docker exec -it <容器> cat /etc/resolv.conf
  4. 重置 Docker 网络(谨慎操作)。

如果问题仍存在,提供以下信息以便进一步排查: - docker info - docker network inspect bridge - 容器内的 ifconfigroute -n 输出。