如果你熟悉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
[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/
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏