docker compose 通过 healthcheck、结构化日志、init 容器探活和一键诊断脚本实现多容器应用基础自诊断:健康检查确保依赖服务真正就绪,json 日志便于错误过滤,前置探测验证外部依赖,diag.sh 聚合关键排查命令。

直接用 docker compose 自带能力+合理配置,就能让多容器应用具备基础的“自诊断”能力——不是全自动修复,而是自动暴露问题、缩短定位路径。关键不在加工具,而在设计阶段就埋好可观测性。
健康检查(healthcheck)是自诊断的第一道防线
它让容器自己报告“我是否真的可用”,而非仅靠进程存活判断。Docker Compose 会依据这个状态控制依赖顺序和重启策略。
- 在服务定义中显式声明
healthcheck,例如 MySQL:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot123"]
interval: 20s
timeout: 10s
retries: 3
start_period: 30s
-
start_period很重要:给数据库足够时间完成初始化,避免刚启动就因连接失败被标记为 unhealthy - 搭配
depends_on的service_healthy条件,可确保 Web 服务只在 DB 真正就绪后才启动:
image: nginx:alpine
depends_on:
db:
condition: service_healthy
日志驱动 + 结构化输出,让错误自动浮现
默认日志杂乱难查。改用 JSON 驱动并规范应用日志格式,能大幅提升排查效率。
- 在
docker-compose.yml中统一配置日志驱动:
web:
image: myapp:latest
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
- 应用内部输出结构化日志(如 JSON 格式),包含
level、service、trace_id字段 - 这样执行
docker compose logs --tail=50 | jq '.level == "error"'就能直接过滤出错误事件
网络连通性预检:用 init 容器做启动前探活
有些依赖(如外部 API 或 Redis)无法用 healthcheck 覆盖,可在服务启动前加一层主动探测。
- 写一个轻量级探测脚本(如用 curl 检查 Redis 是否响应 PING)
- 在服务中用
init容器或command前置执行:
image: python:3.9-slim
command: sh -c "until curl -f http://redis:6379/ping 2>/dev/null; do echo 'waiting for redis'; sleep 2; done && exec python main.py"
depends_on:
- redis
- 这种方式比单纯依赖
depends_on更可靠,失败时容器直接退出,状态一目了然
一键诊断脚本:封装高频排查命令
把常用诊断操作固化成脚本,降低人工操作门槛,也避免遗漏步骤。
- 在项目根目录建
diag.sh:
echo "=== 容器状态 ==="
docker compose ps
echo -e "\n=== 异常退出服务日志 ==="
docker compose ps --status=exited --format "{{.Name}}" | xargs -I {} docker compose logs --tail=20 {} 2>/dev/null | head -n 20
echo -e "\n=== 网络连通性测试 ==="
docker compose run --rm netshoot sh -c "nslookup db && telnet db 3306"
- 配合
netshoot镜像(见知识库),无需进入容器手动安装工具 - 团队成员执行
./diag.sh就能快速获得关键现场信息











