docker容器的健康检查

avatar 2022年5月30日18:18:55 评论 1,231 次浏览

如果你熟悉kubernetes,你就会知道健康检查,但是在docker容器里也是有健康检查的,可以根据容器的状态,或者根据容器里的服务,这个和kubernetes的原理都差不多。为了帮助不了解kubernetes的同学,这里就多说点,健康检查就是为了检查服务的状态或者说容器的状态,服务或者容器出现宕机,健康检查能够检测到并重新启动,减少人为的操作。下面看看docker的健康检查支持内容:

HEALTHCHECK 支持下列选项:
	–interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
	–timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
	--start-period=<时长>:容器启动后多长时间开始执行,默认是0s
	–retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
HEALTHCHECK NONE:禁用从基础镜像中继承任何健康检查

下面举个例子,看一下我的dockerfile

FROM nginx
MAINTAINER "lsy"
HEALTHCHECK --timeout=3s \
        CMD curl -f http://localhost/ || exit 1

我这里为了测试能够看到检查异常的状态,所以没有加服务自启动,正常我们需要加的,这里的健康检查是请求http://localhost/,返回1是失败,请求时间是3s,我们生成镜像,然后启动一个容器看看容器的状态。

[wolf@wulaoer.org🔥🔥🔥🔥 ~]# docker build -t nginx:v1 .
[wolf@wulaoer.org🔥🔥🔥🔥 ~]# docker run -itd --rm --name my-nginx nginx:v1 /bin/bash
4884f72bdbb41d127827981332f2baa655832739eb9abee5e2b01d317b528b43
[wolf@wulaoer.org🔥🔥🔥🔥 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS               NAMES
4884f72bdbb4        nginx:v1            "/bin/bash"              3 seconds ago       Up 2 seconds (health: starting)   80/tcp, 443/tcp     my-nginx

在启动的容器里可以看到STATUS的状态,在状态里可以看到健康检查是启动状态,说明这个容器已经加了健康检查,我们尝试着进入容器把nginx服务关闭,nginx关闭后在健康检查的时候就会请求不到80端口,所以健康检查就会出现unhealthy,看下面的docker状态

[wolf@wulaoer.org🔥🔥🔥🔥 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
4884f72bdbb4        nginx:v1            "/bin/bash"              3 minutes ago       Up 3 minutes (unhealthy)   80/tcp, 443/tcp     my-nginx

如果不手动启动nginx,容器的状态会一直是unhealthy状态,如果在dockerfile中添加服务启动命令,检查状态异常会自动重启镜像,镜像重启会自动启动服务,这样就能保证服务的状态一直是正常状态。以上是在dockerfile中做的基础健康检查。

如果拉取的镜像中有健康检查怎么办,多个健康检查,首先,只会使用最后一次的健康检查命令。如果使用的镜像中有健康检查,不想使用可以再dockerfile里添加HEALTHCHECK NONE,就会不使用健康检查了。docker compose是从2.1版本后才支持健康检查的,看下面的例子:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3
  start_period: 40s

health check的指令,只能是string或者一个list。如果是list,第一个参数只能是NONE, CMD or CMD-SHELL,如果不想使用镜像的healthcheck,也可以关闭:

healthcheck:
  disable: true

docker的健康检查用处还是比较多的,比如端口检查,url检查等等,防止服务宕机,或者服务假死等等,如果服务出现这种问题自动重启,会减少人为手动操作,减少人工干预。参考信息:https://docs.docker.com/engine/reference/builder/

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: