docker容器健康状态检查

为什么要监控容器的健康状态

在docker早期,要检查容器的健康状态,只能通过容器内的进程的退出状态,如果进程退出了并且返回了非0的状态,那么docker就认为这个容器是不健康的。但是某些容器,虽然已经退出,但是内部已经死锁了,程序阻塞,已经无法完整正常的功能了,这个时候程序实际上已经是不正常的状态了。但是,这种情况在早期是无法被检查出来的,所以请求还是会分配给这个容器。在1.12版本以后加入了HEALTHCHECK指令,允许在编写Dockerfile的时候设置一个检查将康状态的指令,如果指令返回0,则说说明容器是监看的,反之,容器连续返回非0,则说明容器不监看。

怎么监控容器的健康状态

监控容器的健康状态,有三种设置方式:

  • 在Dockerfile中用HEALTHCHECK指令设置检查方式
  • docker run命令使用--health-cmd等选项
  • 在docker compose的配置文件中使用healthcheck指令
    我们大部分时候都是在Dockerfile中指定HEALTHCHECK [option] CMD [command],当然,如果想要取消基础镜像中的health check,使用HEALTHCHECK NONE配置即可。

对于web服务,我们通常使用curl来检查容器的健康,例如:

1
2
3
4
5
6
7
FROM alpine:3.7

ADD web /bin/
RUN echo "http://mirrors.aliyun.com/alpine/v3.7/main/" > /etc/apk/repositories
RUN apk update && apk add curl
HEALTHCHECK --interval=5s --timeout=3s CMD curl --fail http://localhost:8080/ping || exit 1
CMD /bin/web

version: ‘3’
services:
web:
image: web
container_name: web
ports:

  - 8080:8080
healthcheck:
  test: ["CMD","curl","--fail"," http://localhost:8080/ping"]
  interval: 5s
  timeout: 4s
  retries: 60

`
当然,docker compose中的健康检查配置会负责dockerfile中的默认配置。

有什么需要注意的地方

看着上面的配置,有一个需要注意的地方,比如:你是使用curl检查容器的时候,需要考虑该容器中是否安装了curl依赖,如果没有,需要自己手动安装。有一个更加复杂的容器可能还需你自己编写检查工具来检查容器的监控状态。