docker容器HEALTHCHECK 健康检查

docker容器的健康检测是在编写dockerfile时,将检测机制写入到dockerfile中,基于此docerfile生成的镜像,在运行容器时会有健康检测的功能。node

dockerfile中的格式:nginx

  • HEALTHCHECK [选项] CMD <命令>:设置检查容器健康情况的命令。
  • HEALTHCHECK NONE:若是基础镜像有健康检查指令,使用这行能够屏蔽掉其健康检查指令。

HEALTHCHECK 指令是告诉 Docker引擎应该如何进行判断容器的状态是否正常,这是 Docker 1.12 引入的指令。web

在没有 HEALTHCHECK 指令前,Docker 引擎只能够经过容器内主进程是否退出来判断容器是否状态异常。不少状况下这没问题,可是若是程序进入死锁状态,或者死循环状态,应用进程并不退出,可是该容器已经没法提供服务了。在 1.12 之前,Docker 不会检测到容器的这种状态,从而不会从新调度,致使可能会有部分容器已经没法提供服务了却还在接受用户请求。docker

而自 1.12 以后,Docker 提供了 HEALTHCHECK 指令,经过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态。shell

当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting,在 HEALTHCHECK 指令检查成功后变为 healthy,若是连续必定次数失败,则会变为 unhealthy。ide

HEALTHCHECK 支持下列选项:ui

  • --interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
  • --timeout=<时长>:健康检查命令运行超时时间,若是超过这个时间,本次健康检查就被视为失败,默认 30 秒;
  • --retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。

和 CMD, ENTRYPOINT 同样,HEALTHCHECK 只能够出现一次,若是写了多个,只有最后一个生效。code

在 HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 同样,分为 shell 格式,和 exec 格式。命令的返回值决定了该次健康检查的成功与否:0:成功;1:失败;2:保留,不要使用这个值。blog

用法举例:进程

[root@node02 test]# cat Dockerfile      #Dockerfile文件以下
FROM nginx:latest
COPY test.txt /test.txt
HEALTHCHECK --interval=5s --timeout=3s CMD cat /test.txt || exit 1

这里咱们设置了每 5 秒检查一次(这里为了试验因此间隔很是短,实际应该相对较长),若是健康检查命令超过 3 秒没响应就视为失败,而且使用CMD cat /test.txt || exit 1 做为健康检查命令。

构建镜像:

[root@node02 test]# docker build -t lzj:v6 .

启动一个容器:

[root@node02 test]# docker run -d --name web03 lzj:v6

当该容器运行后,就能够查看到该容器的运行状态,初始状态为(health: starting),当一次检测成功后,会转换为(healthy),以下:

docker容器HEALTHCHECK 健康检查

若是健康检查连续失败超过了重试次数,状态就会变为 (unhealthy)。我这里进入容器将其CMD执行的查看test.txt文件删除掉,状态就会为unhealthy,以下:

docker容器HEALTHCHECK 健康检查

为了帮助排障,健康检查命令的输出(包括 stdout 以及 stderr)都会被存储于健康状态里,能够用 docker inspect 来查看。

docker容器HEALTHCHECK 健康检查

———————— 本文至此结束,感谢阅读 ————————

相关文章
相关标签/搜索