前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dockerfile(12) - HEALTHCHECK 指令详解

Dockerfile(12) - HEALTHCHECK 指令详解

作者头像
小菠萝测试笔记
发布2021-11-02 16:19:04
1.8K0
发布2021-11-02 16:19:04
举报

HEALTHCHECK

作用
  • 健康检查
  • 当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting,在 HEALTHCHECK 指令检查成功后变为 healthy,如果连续一定次数失败,则会变为 unhealthy
格式
# 设置检查容器健康状况的命令
HEALTHCHECK [选项] CMD <命令>

# 如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK NONE

记住选项后面是接 CMD 哦

注意

和 CMD, ENTRYPOINT 一样,HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效

HEALTHCHECK 返回值

决定了该次健康检查的成功与否:0:成功;1:失败;2:保留(不要使用这个值)

为啥要用 HEALTHCHECK

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

HEALTHCHECK 支持的选项

  • :两次健康检查的间隔,默认为 30 秒;

--interval=<间隔>

  • :健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;

--timeout=<时长>

  • :当连续失败指定次数后,则将容器状态视为 unhealthy ,默认 3 次

--retries=<次数>

实际小栗子

假设有个镜像是个最简单的 Web 服务,希望增加健康检查来判断其 Web 服务是否在正常工作,可以用 curl 来帮助判断其

dockerfile
FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=5s --timeout=3s \
  CMD curl -fs http://localhost/ || exit 1

如果返回 1 则退出

执行 docker build
$ docker build -f HEALTHCHEK.dockerifle -t myweb .
执行 docker run
docker run -d --name web -p 80:80 myweb
查看容器状态
docker ps
  • 刚启动时的状态是 health:starting,过多几秒后就变成 healthy 了
  • 如果健康检查连续失败超过了重试次数,状态就会变为 unhealthy
查看容器健康检查信息

为了帮助排障,健康检查命令的输出(包括 stdout 以及 stderr)都会被存储于健康状态里,可以用 docker inspect 来查看

> docker inspect --format '{{json .State.Health}}' web | python -m json.tool
{
    "FailingStreak": 0,
    "Log": [
        {
            "End": "2021-10-31T04:43:58.8446416Z",
            "ExitCode": 0,
            "Output": "<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\nhtml { color-scheme: light dark; }\nbody { width: 35em; margin: 0 auto;\nfont-family: Tahoma, Verdana, Arial, sans-serif; }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n",
            "Start": "2021-10-31T04:43:58.7591924Z"
        }
    ],
    "Status": "healthy"
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-10-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HEALTHCHECK
    • 作用
      • 格式
        • 注意
          • HEALTHCHECK 返回值
          • 为啥要用 HEALTHCHECK
          • HEALTHCHECK 支持的选项
          • 实际小栗子
            • dockerfile
              • 执行 docker build
                • 执行 docker run
                  • 查看容器状态
                    • 查看容器健康检查信息
                    相关产品与服务
                    容器服务
                    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档