Docker 装好了却访问不到服务?按五层证据定位问题
排查 Docker 服务时,先把“客户端能执行”“守护进程可连接”“容器在运行”“应用有响应”“外部网络可达”分开验证,能减少无效重装和反复放开安全组的操作。本文给出一条适用于 Linux 云服务器的检查路径;命令输出中的容器名需替换为自己的实际名称。
1. 看客户端与服务端,不只看版本号
docker --version
docker version
第一条只能说明客户端程序存在。第二条要同时关注 Client 与 Server 部分。若出现无法连接 Docker daemon 的错误,先检查服务和当前连接目标,而不是重新下载镜像。
systemctl status docker --no-pager
journalctl -u docker.service -n 80 --no-pager
printf "%s\n" "$DOCKER_HOST"
以上服务检查适用于由 systemd 管理的 Docker Engine。若使用 rootless 模式或 Docker Desktop,应按对应安装方式检查。分享日志前应移除令牌、账号和内部地址等信息。
2. 镜像存在,不代表容器启动成功
docker images
docker ps -a
docker logs --tail 80 web
docker inspect --format '{{.State.Status}} exit={{.State.ExitCode}} error={{.State.Error}}' web
镜像是运行模板,容器才是进程实例。Exited 状态需要结合退出码与日志判断;Up 状态也只说明主进程尚在运行,不能单独证明应用已经就绪。不要因为日志为空就判定没有错误,应用可能没有把日志写到标准输出。
3. 核对端口映射的方向
docker port web
-p 8080:80 的含义是宿主机 8080 端口映射到容器 80 端口。浏览器应访问宿主机的 8080,而不是把容器端口直接当作云服务器端口。Dockerfile 中的 EXPOSE 也不能代替实际发布端口。
4. 先在云服务器内部测试
curl -v --connect-timeout 3 --max-time 10 http://127.0.0.1:8080/
请按实际映射端口修改 URL。连接被拒绝、连接超时、HTTP 404 分别指向不同线索:没有可接受连接的服务、链路未能及时建立、HTTP 服务已响应但资源路径不匹配。它们都不能只凭单条结果确定根因。
如果本机测试成功、外部失败,再检查公网 IP、安全组入站规则、主机防火墙和应用绑定地址。按需开放指定业务端口,限制来源;不要为排查一个网页服务而放开全部端口。
5. 把结论写成可复查的证据
记录检查时间、容器名、状态、端口映射和本机 HTTP 测试结果。只在确认配置问题后修改对应项,每次只改一处并重测。这样即使远程会话断开,也能从上一个已验证的环节继续,而不必从重装开始。
参考资料:
- Docker 官方文档:Troubleshooting the Docker daemon(Docker 官方文档站,路径 engine/daemon/troubleshoot/)
- Docker 官方文档:Read the daemon logs(Docker 官方文档站,路径 engine/daemon/logs/)
- Docker 官方文档:Port publishing and mapping(Docker 官方文档站,路径 engine/network/port-publishing/)
本文由 AI 辅助整理,示例用于说明排查方法,不代表已在所有系统和版本上验证。
- 点赞
- 收藏
- 关注作者
评论(0)