Docker容器的健康检测和自动重启

容器的健康检测

如果在Dockerfile或者docker run命令里进行了健康检测,容器启动后查看状态会多出一个信息:healthy或者unhealthy。

1
2
3
# docker ps
... STATUS
... Up 19 minutes (healthy)

在Dockerfile里配置健康检测

Dockerfile
1
HEALTHCHECK --interval=10s --timeout=2s --start-period=30s --retries=3 CMD curl --silent --fail http://localhost:7015/actuator/health || exit 1

在容器启动时指定健康检测参数

1
2
3
4
5
6
7
8
docker run ...
--health-interval=10s \
--health-timeout=2s \
--health-start-period=30s \
--health-retries=3 \
--health-cmd="curl --silent --fail http://localhost:7017/actuator/health || exit 1" \
--restart on-failure \
...

自动重启unhealthy的容器

参考Github项目: Autoheal
大致是说本来docker run有一个issue,或者说应该有那么一个功能,参数--exit-on-unhealthy,默认值true,在容器unhealthy时就退出。再配合--restart=on-failure,来实现容器的自动重启。在exit-on-unhealthy没实现之前,就用这个Autoheal来实现这个功能。

1
2
3
4
5
6
docker run -d \
--name autoheal \
--restart=unless-stopped \
-e AUTOHEAL_CONTAINER_LABEL=all \
-v /var/run/docker.sock:/var/run/docker.sock \
willfarrell/autoheal
  • AUTOHEAL_CONTAINER_LABEL的默认值是autoheal,表示Autoheal会监视带有标签--label autoheal=true的容器。
  • 设置AUTOHEAL_CONTAINER_LABEL=all则是监视所有正在运行的容器。
  • 也可以自定义AUTOHEAL_CONTAINER_LABEL的值,比如AUTOHEAL_CONTAINER_LABEL=myapp,这会监视所有带myapp=true标签的容器。(说实话,官方的这句Set ENV AUTOHEAL_CONTAINER_LABEL to existing label name that has the value true.,最初让我懵了一下。)