对于容器而言,最简单的健康检查是进程级的健康检查,即检验进程是否存活。Docker Daemon会自动监控容器中的PID1进程,如果docker run命令中指明了restart policy,可以根据策略自动重启已结束的容器。在很多实际场景下,仅使用进程级健康检查机制还远远不够。比如,容器进程虽然依旧运行却由于应用死锁无法继续响应用户请求,这样的问题是无法通过进程监控发现的。
通常我们为了防止容器断电或异常关闭后不能自动开机,我们可以加上
--restart=always
例如
[root@aliyun ~]# docker run --restart=always -d --name blog -d -v /www:/www -v /wwwlogs:/var/log/wwwlogs -p 65423:65422 -p 80:80 -p 443:443 677 7714a84063ee6d405c80b891254bba0e5930f5d271c5ad76cfd6e2f0058d8056
这样容器就可以自动重启,但是有时候程序进入死锁状态,或者死循环状态,应用进程并不退出,但是该容器已经无法提供服务了。在 1.12 以前,Docker 不会检测到容器的这种状态,从而不会重新调度,导致可能会有部分容器已经无法提供服务了却还在接受用户请求。
而自 1.12 之后,Docker 提供了 HEALTHCHECK 指令,通过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态。
当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting,在 HEALTHCHECK 指令检查成功后变为 healthy,如果连续一定次数失败,则会变为 unhealthy。
HEALTHCHECK 支持下列选项:
- –interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
- –timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
- –retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。和 CMD, ENTRYPOINT 一样,HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效。
在 HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 格式,和 exec 格式。命令的返回值决定了该次健康检查的成功与否:0:成功;1:失败;2:保留,不要使用这个值。
下面我们看下这个 dockerfile 文件
FROM centos LABEL maintainer "awen Email: <hi@awen.me>" WORKDIR /opt/ COPY CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo COPY nginx /etc/init.d/nginx ENV NGINX_V=1.13.5 OPENSSL_V=1.0.2l PCRE_V=8.41 ZLIB_V=1.2.11 RUN yum -y update && yum -y install openssh-server openssl gcc gcc-c++ pcre-devel openssl-devel zlib-devel wget make perl tar net-tools && wget -c -4 https://nginx.org/download/nginx-$NGINX_V.tar.gz && wget -c -4 https://www.openssl.org/source/openssl-$OPENSSL_V.tar.gz && wget -c -4 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-$PCRE_V.tar.gz && wget -c -4 http://zlib.net/zlib-$ZLIB_V.tar.gz && groupadd -r www && useradd -r -g www www && tar zxvf zlib-$ZLIB_V.tar.gz && cd zlib-$ZLIB_V && ./configure && make && make install && cd /opt && tar zxvf pcre-$PCRE_V.tar.gz && cd pcre-$PCRE_V && ./configure && make && make install && cd /opt && tar zxvf openssl-$OPENSSL_V.tar.gz && tar zxvf nginx-$NGINX_V.tar.gz && cd nginx-$NGINX_V && ./configure --prefix=/usr/local/nginx --user=www --group=www --with-pcre=/opt/pcre-$PCRE_V --with-http_ssl_module --with-zlib=/opt/zlib-$ZLIB_V --with-openssl=/opt/openssl-$OPENSSL_V --with-http_v2_module --with-http_ssl_module && make && make install && rm -rf /opt/* && mkdir -p /usr/local/nginx/ssl && mkdir -p /usr/local/nginx/conf/vhost && mkdir -p /var/log/wwwlogs/ && mkdir -p /www/ && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N '' && ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N '' && echo "RSAAuthentication yes" /etc/ssh/sshd_config && echo "PubkeyAuthentication yes" /etc/ssh/sshd_config && sed -i "s/PasswordAuthentication yes/PasswordAuthentication no/g" /etc/ssh/sshd_config && sed -i "s/UsePAM yes/UsePAM no/g" /etc/ssh/sshd_config && sed -i "s/#Port 22/Port 65422/g" /etc/ssh/sshd_config && yum clean all && mkdir /var/run/sshd && chmod +x /etc/init.d/nginx && rm -rf /root/*.cfg && echo "Asia/Shanghai" > /etc/localtime COPY ssl/* /usr/local/nginx/ssl/ COPY vhost/* /usr/local/nginx/conf/vhost/ COPY nginx.conf /usr/local/nginx/conf/ COPY ssh/* /root/.ssh/ VOLUME ["/www","/var/log/wwwlogs","/usr/local/nginx/ssl","/usr/local/nginx/conf/vhost"] EXPOSE 65422 80 443 HEALTHCHECK CMD curl -fs http://localhost/ || exit 1 ENTRYPOINT /etc/init.d/nginx start && chown -R www:www /var/log/wwwlogs/ && /usr/sbin/sshd -D
其中
HEALTHCHECK CMD curl -fs http://localhost/ || exit 1
就是增加的健康监测配置,然后编译后启动,查看进程会发现其状态是 starting
[root@aliyun ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7714a84063ee 677 "/bin/sh -c '/etc/ini" 3 seconds ago Up 2 seconds (health: starting) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:65423->65422/tcp blog
稍等查看,会发现其状态为 healthy
[root@aliyun ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7714a84063ee 677 "/bin/sh -c '/etc/ini" About a minute ago Up About a minute (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:65423->65422/tcp blog
我们可以通过 inspect 查看 最近3次的状态
[root@aliyun ~]# docker inspect --format '{{json .State.Health}}' blog | python -m json.tool { "FailingStreak": 0, "Log": [ { "End": "2017-10-11T11:15:27.516562686+08:00", "ExitCode": 0, "Output": "<html>\r\n<head><title>301 Moved Permanently</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 Moved Permanently</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n", "Start": "2017-10-11T11:15:27.470554485+08:00" }, { "End": "2017-10-11T11:15:57.563377729+08:00", "ExitCode": 0, "Output": "<html>\r\n<head><title>301 Moved Permanently</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 Moved Permanently</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n", "Start": "2017-10-11T11:15:57.516690754+08:00" }, { "End": "2017-10-11T11:16:27.609685416+08:00", "ExitCode": 0, "Output": "<html>\r\n<head><title>301 Moved Permanently</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 Moved Permanently</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n", "Start": "2017-10-11T11:16:27.563533362+08:00" }, { "End": "2017-10-11T11:16:57.654441173+08:00", "ExitCode": 0, "Output": "<html>\r\n<head><title>301 Moved Permanently</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 Moved Permanently</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n", "Start": "2017-10-11T11:16:57.609810588+08:00" }, { "End": "2017-10-11T11:17:27.701113019+08:00", "ExitCode": 0, "Output": "<html>\r\n<head><title>301 Moved Permanently</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 Moved Permanently</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n", "Start": "2017-10-11T11:17:27.654580727+08:00" } ], "Status": "healthy" }
如果健康检查连续失败超过了重试次数,状态就会变为 (unhealthy)。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
Docker,健康检测
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]