介绍
介绍
福哥前面教给大家使用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的设置效果是一样的,只不过它只会影响当前的服务对应的容器。
效果
因为es启动比较慢,还要装载数据到索引里面,所以即使容器起来了9200端口暂时也无法联通,这个时候的状态就是unhealthy的。
在timeout * retries的时间里都会是starting状态,超过这个时间还没有通过检查就会变成unhealthy状态,通过的话就是healthy状态。
检测脚本
检测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 "$@"
测试
放入到容器里面跑一下试试~~
Dockerfile
脚本
放入Dockerfile里面,使用它来检测健康状态。
# healthcheck COPY healthcheck.sh /root/healthcheck.sh HEALTHCHECK --interval=5s --timeout=5s --retries=6 \ CMD /bin/bash /root/healthcheck.sh
效果
总结
今天福哥带着童鞋们学习了Docker的健康状态HEALTHCHECK的使用方法,福哥同时给出了Dockerfile里面使用HEALTHCHECK的方法,以及docker-compose里面使用healthcheck的方法。
福哥的建议是在Dockerfile里面写上基础的健康检测,在docker-compose里面写上最终的健康检测,这样可以确保万无一失,让我们的系统更加健壮~~