Docker 容器的健康检查
Docker 容器的健康检查
健康检查 (HEALTHCHECK
) 指令简介
健康检查 (HEALTHCHECK
) 指令告诉 Docker 如何检查容器是否仍在工作。 它能够监测类似一个服务器虽然服务进程仍在运行, 但是陷入了死循环, 不能响应新的请求的情况。
当一个容器有指定健康检查 (HEALTHCHECK
) 时, 它除了普通状态之外, 还有健康状态 (health status) 。 健康状态的初始状态是正在启动 (starting
) , 一旦通过了一个健康检查, 它将变成健康 (healthy
) (不管之前的状态是什么), 经过一定数量的连续失败之后, 它将变成不健康 (unhealthy
) 。
健康检查 (HEALTHCHECK
) 指令有两种形式:
-
HEALTHCHECK [OPTIONS] CMD command
通过运行容器内的一个指令来检查容器的健康情况; -
HEALTHCHECK NONE
禁用任何(包括基层至父镜像)健康检查指令。
可以出现在 CMD
之前的选项有:
-
--interval=DURATION
间隔时间, 默认30s
(30秒); -
--timeout=DURATION
超时时间, 默认30s
(30秒); -
--start-period=DURATION
启动时间, 默认 0s, 如果指定这个参数, 则必须大于 0s ; -
--retries=N
重试次数, 默认 3 ;
健康检查会在容器启动后的间隔时间内运行, 在上一次检查完成之后, 按照指定的间隔时间再次运行。
如果单次健康检查的时间超过了指定的超时时间, 则认为是失败的。
如果连续失败次数超过了指定的重试次数, 则容器的健康状态将被视为不健康 (unhealthy) 。
start-period
为需要启动的容器提供了初始化的时间段, 在这个时间段内如果检查失败, 则不会记录失败次数。 如果在启动时间内成功执行了健康检查, 则容器将被视为已经启动, 如果在启动时间内再次出现检查失败, 则会记录失败次数。
一个 Dockerfile 中只能有一个健康检查 (HEALTHCHECK
) 指令生效, 如果出现了多个, 则只有最后一个有效。
在 CMD
关键字之后的 command
可以是一个 shell 命令(例如: HEALTHCHECK CMD /bin/check-running
)或者一个 exec 数组(与其它 Dockerfile 命令相同, 参考 [ENTRYPOINT])。
该命令的返回值说明了容器的状态, 可能是值为:
- 0: healthy - 容器健康, 可以使用;
- 1: unhealthy - 容器工作不正常, 需要诊断;
- 2: reserved - 保留, 不要使用这个返回值;
例如, 每隔 5 分钟检查一个网络服务器能够在 3 秒内响应主页的请求:
HEALTHCHECK --interval=5m --timeout=3s
CMD curl -f http://localhost/ || exit 1
为了帮助调试失败信息, 任何向 stdout 或者 stderr 的文本输出会被记录下来(使用 UTF-8 编码), 并保存在容器的健康状态中, 可以使用 docker inspect
命令查询。 健康健康检查的错误输出应该尽可能的简短, 目前只保存前面的 4k 字符。
当容器的健康状态发生变化时, 将会产生一个 health_status
事件, 这个时间将会携带新的状态。
健康检查 (HEALTHCHECK
) 指令在 Docker 的 1.12 版本之后可用。
健康检查 (HEALTHCHECK
) 指令使用示例
如果没有为容器指定健康检查 (HEALTHCHECK
) 指令, 则使用 docker ps
时, 返回列表如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72d9db1c503d beginor/jexus:5.8.3.0 "docker-entrypoint.s…" 9 days ago Up 7 days 0.0.0.0:8088->80/tcp jexus
在 status 那一列只能显示 Up 7 days
, 表示 7 天前启动, 不能显示容器的健康状况。
如果指定了容器指定健康检查 (HEALTHCHECK
) 指令, 则输出为:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10ec32c21b2e beginor/jexus:5.8.3.1 "docker-entrypoint.s…" 2 weeks ago Up 1 days (healthy) 0.0.0.0:8088->80/tcp jexus
可以看到, 在 status 那一列显示为 Up 1 days (healthy)
。
由此可见, 健康检查 (HEALTHCHECK
) 指令在容器的管理中是非常重要的, 因此需要为每一个容器添加这个指令。
- svg矢量图绘制以及转换为Android可用的VectorDrawable资源
- CListCtrl控件使用方法总结
- JavaScript基础考核真题——你能全做对吗?
- 拉手网面试题,不一样的难度
- Html 5 video/audio 格式转换 ogg
- ASP.NET MVC 开源项目Kigg解读(1)
- 一个setInterval的小问题
- scrollLeft等属性介绍
- ASP.NET MVC 开源项目Kigg解读(2)——Kigg.Core第一部分
- JavaScript 实现接口 (Interfaces In JavaScript)
- JavaScript 中的单例模式 (singleton in Javascript)
- asp.net MVC 权限设计
- Mediawiki 生成google sitemap
- Meidawiki 配置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法