Docker Compose 无原生网络监控插件,但可通过 healthcheck 主动探测、docker exec + netcat 手动验证、docker compose stats 观察 NetIO、自定义网络 + nslookup 排查 DNS 四步实现低成本连通性观测闭环。

用 healthcheck 主动探测服务可达性
在 `docker-compose.yml` 中为每个依赖外部服务的组件配置健康检查,是最直接、最 Compose 原生的方式。它不依赖外部插件,且能触发自动重启(配合 restart 策略):示例:检查 API 服务能否连通数据库
services:
api:
image: myapp/api
healthcheck:
test: ["CMD", "curl", "-f", "http://db:5432/health"]
interval: 15s
timeout: 5s
retries: 3
start_period: 30s
depends_on:
db:
condition: service_healthy
说明:
- test 命令必须在容器内可执行;若目标服务无 HTTP 接口,可用 nc -z db 5432 或 timeout 3 bash -c 'cat < /dev/null > /dev/tcp/db/5432'
- start_period 给数据库留出启动时间,避免误判
- 搭配 docker compose ps --format "{{.Name}}\t{{.Status}}" 可快速筛查异常状态
用 docker exec + netcat 实时验证跨服务连接
当健康检查不够细粒度(比如想查某次请求是否超时),可手动或脚本化发起连接测试:进入一个服务容器,测试对另一服务的端口连通性:
docker exec -it app-container sh -c "nc -z database 5432 && echo 'OK' || echo 'FAIL'"
更进一步,写成循环检测脚本(适用于调试阶段):
-
每 2 秒测一次 db 连通性,并记录时间戳:
while true; do echo "$(date): $(nc -z db 5432 && echo UP || echo DOWN)"; sleep 2; done - 输出重定向到文件后,可用 grep DOWN 快速定位中断时段
用 docker stats + 网络 I/O 指标辅助判断
虽然 docker compose stats 不显示“丢包率”或“连接数”,但它能暴露异常的网络行为模式:运行以下命令观察各服务的网络吞吐变化:
docker compose stats --no-stream --format "table {{.Service}}\t{{.NetIO}}"
重点关注:
- 某个服务 NetIO 长期为 0B / 0B → 可能未建立连接或完全阻塞
- 某服务 NetIO 突增但 CPU/内存无响应 → 可能卡在连接等待(如 DNS 解析失败、防火墙拦截)
- 对比正常时段 baseline,识别偏离趋势
用自定义网络 + docker network inspect 快速定位解析失败
服务名无法解析是连通异常的高频原因。确认 DNS 是否生效比抓包更高效:检查服务是否在同一个自定义网络中:
docker network inspect myproject_default | jq '.Containers | keys[]'
验证容器内能否解析服务名:
docker exec app-container nslookup db
如果返回 server can't find db:
- 确认 db 服务已定义且正在运行(
docker compose ps) - 确认 app 和 db 都显式加入了同一自定义网络(非默认 bridge)
- 检查 compose 文件中是否拼错服务名(大小写敏感、下划线等)

















