当 Docker 容器无法访问外网时,可能是由多种原因导致的。以下是逐步排查和解决方案:
# 查看容器的网络配置(以容器名为例)
docker inspect <容器名> | grep -i "networkmode\|ipaddress\|gateway"
# 确认容器使用的网络模式(默认是bridge)
docker network ls
--net=host
主机模式,可能是主机网络本身有问题。bridge
模式或自定义网络。# 进入容器检查DNS配置
docker exec -it <容器名> cat /etc/resolv.conf
nameserver 8.8.8.8
的DNS服务器。bash
docker run --dns 8.8.8.8 --dns 8.8.4.4 ...
# 确保宿主机已开启IP转发
sysctl net.ipv4.ip_forward
# 如果返回0,需启用:
echo 1 > /proc/sys/net/ipv4/ip_forward
/etc/sysctl.conf
中设置 net.ipv4.ip_forward=1
,然后执行 sysctl -p
。# 检查iptables规则(重点看FORWARD和DOCKER链)
iptables -L -n -v
iptables -t nat -L -n -v
bash
# 允许FORWARD流量
iptables -P FORWARD ACCEPT
# 重启Docker服务以重建规则
systemctl restart docker
bash
# 查看Docker守护进程配置
cat /etc/docker/daemon.json
dns
或 bip
配置。json
{
"dns": ["8.8.8.8", "1.1.1.1"],
"default-address-pools": [{"base": "172.80.0.0/16", "size": 24}]
}
bash
systemctl restart docker
# 进入容器测试外网连通性
docker exec -it <容器名> ping 8.8.8.8
docker exec -it <容器名> curl -v https://www.google.com
bash
docker network rm <网络名>
docker network create <网络名>
http_proxy
环境变量。容器无法访问外网
├─→ 检查网络模式(host/bridge)
├─→ 验证DNS配置
├─→ 宿主机IP转发是否开启?
├─→ 防火墙/iptables是否拦截?
└─→ Docker守护进程配置是否正确?
通过以上步骤逐步排查,通常可以定位问题根源。如果仍无法解决,请提供具体错误信息和环境细节(如Docker版本、操作系统等)。