Dockerfile(12) - HEALTHCHECK 指令详解

简介: Dockerfile(12) - HEALTHCHECK 指令详解

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 支持的选项


  • --interval=<间隔> :两次健康检查的间隔,默认为 30 秒;
  • --timeout=<时长> :健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
  • --retries=<次数> :当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3

 

实际小栗子


假设有个镜像是个最简单的 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

image.png

  • 刚启动时的状态是 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"
}
相关文章
|
Java Linux 网络安全
【Linux环境】Centos 7启动jar包的详细步骤
【Linux环境】Centos 7启动jar包的详细步骤
679 0
|
前端开发 Java 关系型数据库
最好用的七大顶级 API 接口测试工具
现在 API 接口已经成为软件开发重要的组成部分,由于 API 并没有 GUI 图形界面,无法直观的对接口进行测试,所以对于前后端开发来说,找到一套趁手的工具对 API 接口进行测试,了解开发的程序是否符合预期十分重要。面对批量的 API,手动测试变得非常低效,自动化 API 接口测试工具,帮我们提高测试效率的同时,更能帮我们保证程序的稳定和安全性。
4152 0
最好用的七大顶级 API 接口测试工具
|
10月前
|
人工智能 搜索推荐 算法
解决方案评测|主动式智能导购AI助手构建
阿里云的主动式智能导购AI助手是电商商家提升用户体验和销量的利器。它能实时分析用户行为,提供个性化推荐,支持多渠道无缝对接,并具备语音和文本交互功能。通过注册阿里云账号、开通服务、配置项目、设置推荐策略、集成到平台并测试优化,商家可以轻松部署这一工具。关键代码示例帮助理解API对接和数据处理。建议增强个性化推荐算法、优化交互体验并增加自定义选项,以进一步提升效果。
678 11
|
算法 Java 数据处理
Java中MD5加密算法的实现
Java中MD5加密算法的实现
|
Prometheus 监控 Cloud Native
基于Docker安装Grafana和Prometheus
Grafana 是一款用 Go 语言开发的开源数据可视化工具,支持数据监控和统计,并具备告警功能。通过 Docker 部署 Grafana 和 Prometheus,可实现系统数据的采集、展示和告警。默认登录用户名和密码均为 admin。配置 Prometheus 数据源后,可导入主机监控模板(ID 8919)进行数据展示。
658 2
playwright Test 录制视频
playwright Test 录制视频
314 3
|
存储 JSON JavaScript
|
关系型数据库 BI 数据处理
|
缓存 监控 druid
对比各大数据库连接池技术-Jdbc-Dbcp-C3p0-Druid-Hikaricp
对比各大数据库连接池技术-Jdbc-Dbcp-C3p0-Druid-Hikaricp
411 0
|
算法 数据安全/隐私保护
RSA原理理解以及攻防世界(初识RSA)解题思路-0基础理解
RSA原理理解以及攻防世界(初识RSA)解题思路-0基础理解