Docker Compose 中的健康检查(Healthcheck)

18 min read

在 Docker Compose 中,healthcheck 是一个用于检测服务健康状态的配置项。通过配置健康检查,可以确保服务在运行时处于健康状态,并在服务出现问题时及时进行处理。

配置示例

version: '3.8'

services:
  web:
    image: nginx
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

配置参数

  • test: 指定用于检查健康状态的命令。例如,curl -f http://localhost 检查 nginx 服务是否正常响应 HTTP 请求。
  • interval: 两次健康检查之间的间隔时间,默认是 30s
  • timeout: 每次健康检查的超时时间,默认是 10s
  • retries: 在标记服务为不健康之前,健康检查失败的重试次数,默认是 3
  • start_period: 服务启动后的初始宽限期,在此期间健康检查结果不会影响服务的健康状态,默认是 40s

不健康状态处理

如果服务被标记为不健康,Docker 会执行以下操作:

  1. 容器状态: 使用 docker ps 可以查看服务的健康状态。状态为 unhealthy 表示服务不健康。
  2. 编排工具: Docker Swarm 或 Kubernetes 等编排工具可以根据服务的健康状态做出反应,例如重新启动不健康的容器或将流量切换到健康实例。
  3. 依赖服务: 依赖此服务的其他服务可能受到影响。

检查健康状态命令

  • 查看容器状态:
    docker ps
    
    示例输出:
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                       PORTS      NAMES
    1234567890ab   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes (unhealthy)   80/tcp     myproject_web_1
    
  • 查看详细健康状态信息:
    docker inspect --format='{{json .State.Health}}' <container_id>
    
    示例输出:
    {
      "Status": "unhealthy",
      "FailingStreak": 3,
      "Log": [
        {
          "Start": "2024-06-21T12:00:00.000000000Z",
          "End": "2024-06-21T12:00:10.000000000Z",
          "ExitCode": 1,
          "Output": "..."
        },
        ...
      ]
    }
    

通过合理配置 healthcheck,可以确保服务始终处于健康状态,并在发现问题时及时处理,提高应用的高可用性和稳定性。