Docker请求超时是开发者和运维人员经常遇到的问题,表现为容器间通信或外部访问容器服务时出现连接超时。本文将系统性地介绍排查方法和解决方案。
# 检查Docker网络状态
docker network ls
docker network inspect [网络名称]
# 检查容器IP配置
docker inspect [容器ID] | grep IPAddress
# 测试基础网络连通性
docker exec [容器ID] ping 8.8.8.8
docker exec [容器ID] ping www.google.com
# 检查防火墙规则
sudo iptables -L -n
sudo ufw status
# 临时关闭防火墙测试
sudo systemctl stop firewalld
# 或
sudo ufw disable
# 检查容器内DNS配置
docker exec [容器ID] cat /etc/resolv.conf
# 测试DNS解析
docker exec [容器ID] nslookup www.google.com
可能原因: - 容器不在同一网络 - 网络驱动不兼容 - 端口未正确映射
解决方案:
# 创建自定义网络
docker network create my-network
# 将容器加入同一网络
docker network connect my-network container1
docker network connect my-network container2
# 检查网络连通性
docker exec -it container1 ping container2
可能原因: - 端口未正确映射 - 绑定到127.0.0.1而非0.0.0.0 - 防火墙阻止
解决方案:
# 确保正确端口映射
docker run -p 0.0.0.0:8080:80 nginx
# 检查端口监听
netstat -tulnp | grep 8080
# 检查防火墙规则
sudo iptables -L -n | grep 8080
可能原因: - DNS配置错误 - 容器内应用未监听正确端口 - 网络代理问题
解决方案:
# 检查容器内服务状态
docker exec [容器ID] netstat -tulnp
# 更新DNS配置
docker run --dns 8.8.8.8 --dns 8.8.4.4 my-image
# 对于代理问题
docker run -e http_proxy=http://proxy.example.com:8080 \
-e https_proxy=https://proxy.example.com:8080 \
my-image
修改配置文件 (/etc/docker/daemon.json
):
{
"dns": ["8.8.8.8", "8.8.4.4"],
"mtu": 1500,
"default-shm-size": "512M",
"max-concurrent-downloads": 10,
"debug": true
}
重载配置:
sudo systemctl daemon-reload
sudo systemctl restart docker
# 在宿主机上抓包
sudo tcpdump -i docker0 -w docker.pcap
# 在容器内抓包
docker run --net=host -v $(pwd):/capture corfr/tcpdump -i any -w /capture/container.pcap
# 获取容器PID
docker inspect -f '{{.State.Pid}}' [容器ID]
# 进入网络命名空间
sudo nsenter -t [PID] -n ip a
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
docker run --restart=on-failure:5 my-image
# 查看容器网络统计
docker stats [容器ID]
sudo apt-get update && sudo apt-get upgrade docker-ce
通过以上系统性的排查和解决方案,大多数Docker请求超时问题都可以得到有效解决。如问题仍然存在,建议收集详细的日志信息并咨询Docker社区或专业支持团队。