深浅主题
容器正常但服务不可达
问题现象
docker ps 显示 Up,访问却连接拒绝、超时或返回错误;容器重启没有改善。
适用环境
Docker Engine、HTTP 服务;应用可能没有健康检查。
本文是可复用的排障示例,不代表某次个人生产事故。命令中的名称、账号和数据均为示例,执行前请替换为已确认的目标。
复现或诊断步骤
- 查看容器日志与 health 状态,确认 Up 只说明主进程还存在。
- 在容器内检查监听端口和绑定地址,再从同网络访问,最后检查宿主机发布端口。
- 分别测试容器内、容器网络、宿主机、外部客户端,找出第一段失败链路。
原因分析
服务可能只监听 127.0.0.1、监听的端口与映射不一致,或仍在启动依赖。防火墙、安全组与代理路由也可能阻断外部流量。返回错误码则说明网络已到达某个 HTTP 服务,应继续查应用而非只看端口。
修复示例
bash
docker ps --format 'table {{.Names}} {{.Status}} {{.Ports}}'
docker logs --tail 100 app
docker inspect app --format '{{json .State.Health}}'
docker port app
# 容器具备这些工具时再运行:
docker exec app sh -c 'ss -lnt || netstat -lnt'
# 内部服务应绑定 0.0.0.0:8080,而宿主机发布范围按架构限定让应用监听正确接口并增加反映依赖状态的健康检查。不要为了可达性直接开放全部端口;只调整确认缺失的路由或允许规则。保存原 Compose 与防火墙规则,验证后保留最小变更,失败恢复旧配置。
验证方法
检查健康端点、真实业务接口、依赖失败时状态、容器重建后的服务名访问。外部验证应从独立网络发起;本机 curl 不能证明公网安全组正确。
常见误区
ping 成功不代表 TCP 或 HTTP 可用。distroless 镜像可能没有 shell、curl 或 ss,工具缺失不代表应用故障,应使用受控诊断容器。