自 1.12 版本之后,Docker 引入了原生的健康检查实现。对于容器而言,最简单的健康检查是进程级的健康检查,即检验进程是否存活。Docker Daemon会自动监控容器中的PID 1进程,如果docker run命令中指明了restart policy,可以根据策略自动重启已结束的容器。在很多实际场景下,仅使用进程级健康检查机制还远远不够。比如,容器进程虽然依旧运行却由于应用死锁无法继续响应用户请求,这样的问题是无法通过进程监控发现的。
当一个容器有指定健康检查 (HEALTHCHECK) 时,它除了普通的容器状态之外,还有以下几种状态:
- starting:容器仍在启动时的初始状态
- healthy:如果命令成功,则容器是健康的
- unhealthy:如果单次运行时间超过指定的超时时间,则认为它不健康。如果运行状况检查失败,则将运行重试次数,如果仍然失败,将被宣布为不健康。
容器启动之后,初始状态会为 starting (启动中)。Docker Engine会等待 interval 时间,开始执行健康检查命令,并周期性执行。如果单次检查返回值非0或者运行需要比指定 timeout 时间还长,则本次检查被认为失败。如果健康检查连续失败超过了 retries 重试次数,状态就会变为 unhealthy (不健康)。
注:
一旦有一次健康检查成功,Docker会将容器置回 healthy (健康)状态
当容器的健康状态发生变化时,Docker Engine会发出一个 health_status 事件。通过检查容器监控状态有以下两种方式:
1. Dockerfile 方式
可以在