Featured image of post Docker 健康检查和容器监控最佳实践Featured image of post Docker 健康检查和容器监控最佳实践

Docker 健康检查和容器监控最佳实践

Docker 运行状况检查的综合指南,包括 HEALTHCHECK 指令、curl 与 TCP 检查、启动探针、docker-compose 配置、监控集成和零停机模式。

Docker 健康检查对于构建自我修复的容器基础设施至关重要。它们支持自动检测应用程序故障并触发容器重新启动,确保您的服务保持可用。本指南涵盖了从基本 HEALTHCHECK 实现到高级生产模式的所有内容。

健康检查指令

Dockerfile 中的 HEALTHCHECK 指令告诉 Docker 如何测试容器是否仍然正常工作:

HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1

Docker 跟踪三种状态:starting(在启动期间)、healthy(检查通过)和 unhealthy(重试后检查失败)。 --start-period 对于启动时间较慢的应用程序至关重要——它可以抑制初始化期间的失败。

选项默认描述
占位符_030 多岁检查之间的时间
占位符_030 多岁每次检查超时
占位符_00 秒启动时的宽限期
占位符_03不健康之前连续失败

Curl、TCP 与自定义检查

检查方法的选择取决于您的应用程序类型:

# HTTP check (most common)
HEALTHCHECK CMD curl -f http://localhost:8080/api/health || exit 1

# TCP socket check (lightweight)
HEALTHCHECK CMD nc -z localhost 5432 || exit 1

# Custom script (complex logic)
HEALTHCHECK CMD /usr/local/bin/healthcheck.sh

HTTP 检查验证状态代码和响应正文。 TCP 检查与协议无关并且是轻量级的。自定义脚本支持特定于应用程序的逻辑——验证数据库连接、缓存响应能力或队列深度。

启动探针 vs 就绪探针 vs 活跃探针

Docker Compose 和 Swarm 支持受 Kubernetes 启发的三探针模型:

services:
  app:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/ready"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 60s

启动探针处理缓慢的初始化,就绪探针控制流量是否路由到容器,活动探针在失败时触发重新启动。在许多情况下,Docker Compose 中的 start_period 字段取代了对单独启动探针的需要。


Docker Compose 健康检查配置

健康检查与 docker-compose.yml 中的服务编排自然集成:

services:
  db:
    image: postgres:16
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 3s
      retries: 5

  app:
    image: myapp:latest
    depends_on:
      db:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]

depends_oncondition: service_healthy 确保应用程序容器仅在数据库通过运行状况检查后启动,从而防止启动时出现连接错误。

监控和警报集成

工具目的整合
普罗米修斯指标集合通过 cAdvisor 的容器指标
格拉法纳可视化健康仪表板
Docker 事件 API实时警报容器状态流
顾问资源监控公开的指标端点

使用 docker events --filter event=health_status 来传输健康变化。对于生产,将健康状态发送到警报系统,当容器变得不健康时通知您的团队。


常见陷阱

配置错误的间隔会导致错误警报 - 过于激进地设置 --interval 可能会耗尽资源。容器内的 DNS 解析失败可能会破坏基于 curl 的检查。注意服务 A 的运行状况检查依赖于服务 B 的死锁场景,而服务 B 也依赖于 A。使用 docker inspect --format='{{json .State.Health}}' 调试运行状况检查状态。

高级模式

复合运行状况检查将多个子系统状态聚合为一个结果。自愈容器使用自动重启策略与指数退避相结合。在 Docker Swarm 中,分布式健康检查协调可确保不健康的容器自动从负载均衡器池中删除。

结论

正确的运行状况检查配置是可靠 Docker 部署的基础。通过将 HEALTHCHECK 与依赖项感知的编排和监控集成相结合,您可以构建自动检测故障并从故障中恢复的系统,从而最大限度地减少停机时间和运营开销。