Ryan

Docker映像优化:Dockerfile指令之HEALTHCHECK 健康检查
为什么使用HEALTHCHECK在没有 HEALTHCHECK 指令前,Docker 引擎只可以通过容器内主进程是...
扫描右侧二维码阅读全文
29
2019/07

Docker映像优化:Dockerfile指令之HEALTHCHECK 健康检查

为什么使用HEALTHCHECK

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

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

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

格式:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

使用HEALTHCHECK

以博主维护的Transmission映像为例,详细Dockerfile请查看:https://github.com/benzBrake/Docker-Transmission-With-New-UI/blob/master/Dockerfile

# Transmission image with trackers add script.
FROM benzbrake/alpine:3.9
MAINTAINER Ryan Lieu <github-benzBrake@woai.ru>
...
HEALTHCHECK --interval=5s --timeout=3s \
    CMD /data/healthchek.sh
...

其中的--interval=5s为检查间隔,--timeout=3s为检查超时时间,/data/healthchek.sh,是检查指令,建议写到一个shell脚本中,指令写起来方便,且方便增加额外指令。
healthcheck.sh内容如下

#!/bin/sh
#利用HEALTHCHECK自动重启计划任务进程
ps -ef | grep crond > /dev/null
if [[ $? -ne 0 ]]; then
    crond
fi
#检查transmission进程
curl localhost:9091 || exit 1
exit 0

增加了healthcheck的docker容器会有健康提示

# docker ps | grep transmission                         
3cd3f588af6c        benzbrake/transmission:latest   "/data/entrypoint...."   14 minutes ago      Up 14 minutes (healthy)   0.0.0.0:9091->9091/tcp, 0.0.0.0:51413->51413/tcp, 0.0.0.0:51413->51413/udp                         transmission-1
搬瓦工年付$187机房套餐补货了,电信联通优化,512M内存/500G流量/1G带宽,建站稳定,优惠码:BWH1ZBPVK,【点击购买】!
搬瓦工年付$28CN2高速线路,512M内存/500G流量/1G带宽,电信联通优化,延迟低,速度快,建站稳定,优惠码同上,【点击购买】!
Last modification:July 29th, 2019 at 12:31 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment