发行说明: 1.12.0(2016-07-28)

Docker 1.12.0 版本, Dockerfile 引入了新的 HEALTHCHECK 指令,添加对用户定义的健康检查的支持,便于监视容器的状态。

可以通过以下方式添加健康检查

  1. 在Dockerfile中添加健康检查
  2. 在容器创建启动的时候设置健康检查

一.在Dockerfile中添加健康检查

参考: HEALTHCHECK

HEALTHCHECK 指令格式:

  • HEALTHCHECK [选项] CMD <命令>:通过在容器内运行命令来检查容器健康状况
  • HEALTHCHECK NONE :禁用从基础镜像继承的任何健康检查

HEALTHCHECK指令告诉 Docker 如何测试容器是否仍在运行。这可以检测出诸如 Web 服务器陷入无限循环、无法处理新连接等情况,即使服务器进程仍在运行。

HEALTHCHECK 支持下列选项:

  • --interval=<间隔>:两次健康检查的间隔,默认为 30 秒。
  • --timeout=<间隔>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒。
  • --retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
  • --start-period=<间隔>: 应用的启动的初始化时间,在启动过程中的健康检查失效不会计入,默认 0 秒。

Dockerfile 中只能有一条HEALTHCHECK指令。如果列出多条指令,则只有最后一条HEALTHCHECK指令生效。

HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 和 exec 格式。命令的返回值决定了该次健康检查的成功与否:

  • 0:成功 - 容器健康且可供使用
  • 1:失败 - 容器无法正常工作
  • 2:保留值,不要使用此退出代码

容器启动之后,初始状态会为 starting (启动中)。Docker Engine 会等待 interval 时间,开始执行健康检查命令,并周期性执行。如果单次检查返回值非 0 或者运行需要比指定 timeout 时间还长,则本次检查被认为失败。如果健康检查连续失败超过了 retries 重试次数,状态就会变为 unhealthy (不健康)。

  • 一旦有一次健康检查成功,Docker 会将容器置回 healthy (健康)状态。
  • 当容器的健康状态发生变化时,Docker Engine 会发出一个 health_status 事件。

例如,每五分钟左右检查一次 Web 服务器是否能够在三秒内提供网站主页:

HEALTHCHECK --interval=5m --timeout=3s \
  CMD curl -f http://localhost/ || exit 1

为了帮助调试失败的探测,该命令在 stdout 或 stderr 上写入的任何输出文本(UTF-8 编码)都将存储在健康状态中,并可通过 docker inspect 查询。此类输出应保持简短(目前仅存储前 4096 个字节)。

查看健康检查结果

docker inspect --format='{{json .State.Health}}' container

docker inspect container | jq ".[].State.Health"

二.在容器创建启动的时候设置健康检查

docker run 创建启动容器的时候,健康检查相关选项

选项描述
--health-cmd运行检查健康状况的命令
--health-interval运行检查之间的时间 `(mssmh) (default 0s)`
--health-retries需要连续失败才能报告不健康
--health-timeout允许运行一次检查的最长时间 `(mssmh) (default 0s)`
--health-start-intervalAPI 1.44+ 启动期间运行检查的间隔时间`(mssmh) (default 0s)`
--health-start-periodAPI 1.29+ 在开始健康重试倒计时之前,容器初始化的起始时间`(mssmh) (default 0s)`

如果使用--health-cmd,Docker 会忽略镜像中 Dockerfile 定义的 HEALTHCHECK,而使用你在运行时指定的新健康检查命令。

示例

docker run --name mycontainer \
  --health-cmd="pgrep nginx" \
  --health-interval=10s \
  --health-retries=3 \
  myimage

注意

虽然docker支持容器的健康检查,但是并不会自动重启不健康的容器。

可以通过: docker-autoheal 实现自动重启不健康的容器

标签: Docker

添加新评论