1. 概述

在使用 Docker 容器部署服务时,确保服务的健康状态是构建稳定系统的关键环节之一。Docker 提供了健康检查(health check)机制,帮助我们自动检测容器内服务是否正常运行。

本文将介绍如何在 docker-compose.yml 文件中配置健康检查,并演示两种查看健康检查日志的方法。为了简化示例,我们将使用 Nginx 服务作为演示对象。

2. 初始配置

在深入讲解查看日志的方法之前,我们先来配置一个简单的 docker-compose.yml 文件,其中包含对 Nginx 服务的健康检查配置:

version: '3'
services:
  my-web-server:
    image: nginx:latest
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3

这段配置中:

  • test:定义了健康检查使用的命令,这里是使用 curl 请求本地的 HTTP 服务。
  • interval:健康检查间隔时间为 1 分钟 30 秒。
  • timeout:每次检查超时时间为 10 秒。
  • retries:失败 3 次后标记为 unhealthy。

3. 查看健康检查日志

接下来我们介绍两种实用方法来查看容器的健康检查状态和日志。

3.1 使用 docker ps 查看容器状态

我们可以通过 docker ps 快速查看当前运行的容器状态,包括是否健康:

$ docker ps

输出示例:

CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS                    PORTS       NAMES
8f4038a0c9e7   nginx:latest   "/docker-entrypoint.…"   4 mins ago     Up 4 mins (unhealthy)     80/tcp      my-web-server

⚠️ 注意:STATUS 列中显示的 (unhealthy) 表示当前容器健康检查失败。

3.2 使用 docker inspect 查看详细健康日志

使用 docker inspect 可以获取容器的详细信息,包括健康检查的日志输出。结合 jq 工具可以更清晰地解析 JSON 格式的结果。

查看完整健康信息:

$ docker inspect --format "{{json .State.Health }}" my-web-server | jq

输出示例(服务未运行时):

{
  "Status": "unhealthy",
  "FailingStreak": 7239,
  "Log": [
    {
      "Start": "2024-04-26T23:34:54.794216092Z",
      "End": "2024-04-26T23:35:03.113734054Z",
      "ExitCode": 6,
      "Output": "curl: (6) Could not resolve host: localhost\n"
    }
  ]
}

✅ 说明:

  • Status:当前健康状态。
  • FailingStreak:连续失败次数。
  • Log:健康检查的执行日志,包含执行时间、退出码和输出内容。

仅查看日志输出内容:

$ docker inspect --format "{{json .State.Health }}" my-web-server | jq '.Log[].Output'

输出示例:

"curl: (6) Could not resolve host: localhost\n"

这可以帮助我们快速定位健康检查失败的原因,比如 DNS 解析失败、服务未响应等。

4. 总结

通过本文,我们学习了如何在 docker-compose.yml 中配置健康检查,并掌握了两种查看健康检查日志的方法:

  • docker ps:快速查看容器当前状态。
  • docker inspect + jq:深入查看健康检查的详细执行日志。

合理使用健康检查机制,不仅可以提升服务的稳定性,还能在服务异常时快速定位问题,是运维 Docker 容器化应用的重要手段之一。


原始标题:How to View docker-compose Health Check Logs?