当Docker容器无法访问外部网络时,可能是由多种原因导致的。以下是系统化的排查步骤和解决方案:
# 在宿主机上测试基本网络连接
ping 8.8.8.8
ping www.google.com
# 在容器内测试网络连接
docker run --rm busybox ping 8.8.8.8
docker run --rm busybox ping www.google.com
# 查看Docker网络列表
docker network ls
# 检查默认bridge网络配置
docker network inspect bridge
症状:能ping通IP但无法解析域名
解决方案:
# 方法1:运行容器时指定DNS
docker run --dns 8.8.8.8 --dns 8.8.4.4 your_image
# 方法2:修改Docker守护进程配置
# 编辑/etc/docker/daemon.json
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
# 重启Docker服务
sudo systemctl restart docker
症状:完全无法访问外部网络
解决方案:
# 临时关闭防火墙测试
sudo systemctl stop firewalld # CentOS/RHEL
sudo ufw disable # Ubuntu
# 检查iptables规则
sudo iptables -L -n
# 添加允许规则
sudo iptables -I FORWARD -j ACCEPT
解决方案:
# 尝试使用host网络模式运行容器
docker run --network host --rm busybox ping 8.8.8.8
# 如果host模式可以,考虑创建自定义网络
docker network create --driver bridge my_network
docker run --network my_network your_image
解决方案:
# 检查Docker服务状态
sudo systemctl status docker
# 检查Docker日志
sudo journalctl -u docker.service
# 重启Docker服务
sudo systemctl restart docker
# 宿主机上
ip addr show
# 容器内
docker run --rm --net=host busybox ip addr show
# 宿主机上
route -n
# 容器内
docker run --rm busybox route -n
sudo iptables -t nat -L -n
对于VPN环境:
- 可能需要配置路由规则
- 考虑使用--net=host
模式
对于公司代理环境:
# 在Docker配置中设置代理
mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
EOF
systemctl daemon-reload
systemctl restart docker
通过以上步骤,大多数Docker网络连接问题都可以得到解决。如果问题仍然存在,可能需要更深入地检查特定的网络环境和Docker配置。