同福

Docker健康检查HEALTHCHECK的使用方法【20210619】

介绍

介绍

福哥前面教给大家使用Dockerfile搭建TFLinux的运行环境的方法了,但是这里面有一个问题,就是Docker认为容器的ENTRYPOINT运行起来了就表示容器启动了,容器的ENTRYPOINT启动的进程没有退出就表示容器是可用的,可实际情况下这个判断方法并不是那么靠谱。

Docker在v1.12版本之后增加了healthcheck功能,该功能可以自定义容器健康状态的检测标准,通过healthcheck自定义一个检测容器是否可用的标准,这个弥补了Docker默认的判断方法的不精准的不足。

Dockerfile和docker-compose

Dockerfile

在Dockerfile里面定义镜像的healthcheck可以应用到基于这个镜像的所有容器。

# healthcheck
HEALTHCHECK --interval=5s --timeout=5s \
CMD curl -sS 'http://localhost:9200' || exit 1

这是一个Elasticsearch的健康状态检查,通过curl检查本地主机localhost上面的9200端口是否可以联通,如果无法联通就返回状态码1,因为返回非零状态码Docker就会认为当前容器的状态是不健康的。

docker-compose

在docker-compose里面定义服务的healthcheck可以真对当前服务对于的所有容器进行检测。

healthcheck:
  test: ["CMD-SHELL", "curl -sS 'http://localhost:9200' || exit 1"]
  interval: 5s
  timeout: 5s
  retries: 6

这段设置和上面的Dockerfile的设置效果是一样的,只不过它只会影响当前的服务对应的容器。

效果

home/topic/2021/0620/13/0bae473f7315407f491eb4d72e8ac6a9.png

因为es启动比较慢,还要装载数据到索引里面,所以即使容器起来了9200端口暂时也无法联通,这个时候的状态就是unhealthy的。

在timeout * retries的时间里都会是starting状态,超过这个时间还没有通过检查就会变成unhealthy状态,通过的话就是healthy状态。

home/topic/2021/0620/13/25ba5d82726402f3b267f84b6bde82b1.png

检测脚本 

检测healthy状态是通过shell脚本执行的,除了可以像上面的例子那样直接写出检测步骤的代码外,还可以编写一个检测的shell脚本,调用这个脚本去实现healthy状态的检查。

healthcheck.sh

脚本

#!/bin/bash

# argv

# functions

function _main
{
  curl -sS 'http://localhost:9200' > /dev/null
  [ $? -ne 0 ] && exit 1

  indexCount=`curl -sS 'http://localhost:9200/_cat/indices?pretty=true' | wc -l`
  [ $indexCount -eq 0 ] && exit 1

  exit 0
}

# main

_main "$@"

测试

放入到容器里面跑一下试试~~

home/topic/2021/0620/14/2e819eb78d8a576ded50f9a8f3d7e49c.png

Dockerfile

脚本

放入Dockerfile里面,使用它来检测健康状态。

# healthcheck
COPY healthcheck.sh /root/healthcheck.sh
HEALTHCHECK --interval=5s --timeout=5s --retries=6 \
CMD /bin/bash /root/healthcheck.sh

效果

home/topic/2021/0620/14/f3d49336b6173b2e81dadd56aff3886f.png

总结

今天福哥带着童鞋们学习了Docker的健康状态HEALTHCHECK的使用方法,福哥同时给出了Dockerfile里面使用HEALTHCHECK的方法,以及docker-compose里面使用healthcheck的方法。

福哥的建议是在Dockerfile里面写上基础的健康检测,在docker-compose里面写上最终的健康检测,这样可以确保万无一失,让我们的系统更加健壮~~