docker使用shell进行healthcheck

起因是公司要逐渐把wmware上tomcat部署的服务 迁移到docker,再到k8s。

现在由于资源紧张,docker服务器的内存不够,容器又不是以tomcat进程作为1号进程。原因是 需要通过启动脚本传参数进去,对tomcat内存进行限制。最近经常出现容器内tomcat崩掉了,但是容器还是up,需要手动排查是哪个服务的tomcat挂掉了。

创建健康检查的脚本health_check.sh

建议使用curl命令检查页面 因为很多容器里不带ss或者netstat命令 我这里没有统一健康检查页面就偷懒了 哈哈哈

#!/bin/bash
# 检测tomcat端口 细心的小伙伴可以在awk把最后一个:后面的端口取出来 会更准确
netstat -luntp |awk '{print $4}'  |grep 8080
if [ $? == 0 ]
then
    echo $?
    exit 0
else
    echo $?
    exit 1
fi
创建Dockerfile

我这里因为启动比较慢 所以设置了容器启动60s之后开始检测

FROM registry.cn-shanghai.aliyuncs.com/yjk-datag/tomcat:v1
MAINTAINER YJK Enterprise Container Images <[email protected]>
ENV LANG C.UTF-8
ENV PATH /usr/bin:$PATH
RUN    mv /srv/tomcat/tomcat8/  /srv/tomcat/tomcat-haozhuo-video
ADD ROOT.war  /srv/tomcat/tomcat-haozhuo-video/webapps/
ADD health_check.sh  /opt/
EXPOSE 8080 20920
HEALTHCHECK --start-period=60s  --interval=60s --timeout=5s --retries=3 CMD /bin/bash /opt/health_check.sh

docker使用shell进行healthcheck_第1张图片

构建镜像
docker build -t haozhuo-video:62 ./
启动容器
docker run -d -it --privileged -p 8820:8080 -p 20920:20920     --cpus=1 -m 2048m -e DUBBO_PORT_TO_REGISTRY=20920 -e DUBBO_IP_TO_REGISTRY=192.168.1.108 -h haozhuo-video --name haozhuo-video -v /data/tomcat-haozhuo-video:/srv/tomcat/tomcat-haozhuo-video/yjklogs/ haozhuo-video:62
查看容器状态 并 启动tomat 测试

tomcat 启动成功之后 容器status由starting变成healthy

docker使用shell进行healthcheck_第2张图片

HEALTHCHECK 支持下列选项:

  • --interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
  • --timeout=<间隔>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
  • --retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
  • --start-period=<间隔>: 应用的启动的初始化时间,在启动过程中的健康检查失效不会计入,默认 0 秒; (从17.05)引入

HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 格式,和 exec 格式。命令的返回值决定了该次健康检查的成功与否:

  • 0:成功;
  • 1:失败;
  • 2:保留值,不要使用

容器启动之后,初始状态会为 starting (启动中)。Docker Engine会等待 interval 时间,开始执行健康检查命令,并周期性执行。如果单次检查返回值非0或者运行需要比指定 timeout 时间还长,则本次检查被认为失败。如果健康检查连续失败超过了 retries 重试次数,状态就会变为 unhealthy (不健康)。

注:

  • 一旦有一次健康检查成功,Docker会将容器置回 healthy (健康)状态
  • 当容器的健康状态发生变化时,Docker Engine会发出一个 health_status 事件。

你可能感兴趣的:(容器)