不健康 docker 容器未通过 docker 本机健康检查重新启动

unhealthy docker container not restarted by docker native health check

我通过在 Docker 文件中添加 HEALTHCHECK 命令实现了 docker 本机健康检查,如下所示,

HEALTHCHECK --interval=60s --timeout=15s --retries=3 CMD ["/svc/app/healthcheck/healthCheck.sh"]

设置容器的入口点

CMD [".././run.sh"] 

执行docker 运行命令如下图,

docker run -d  --net=host --pid=host --publish-all=true -p 7000:7000/udp applicationname:temp

healthCheck.sh 以 1 退出,当我的应用程序未启动时,我可以看到容器状态不正常,但它没有重新启动。

STATUS

Up 45 minutes (unhealthy)

下面是 docker 和 OS 的详细信息:

[root@localhost log]# docker -v
Docker version 18.09.7, build 2d0083d

OS版本

NAME="CentOS Linux"
VERSION="7 (Core)"

如何在容器变得不健康时自动重启我的容器?

目前没有针对不健康容器的自动重启机制,参见this, but you can make a workaround as mentioned here:

docker run -d \
    --name autoheal \
    --restart=always \
    -e AUTOHEAL_CONTAINER_LABEL=all \
    -v /var/run/docker.sock:/var/run/docker.sock \
    willfarrell/autoheal

它将docker unix域套接字添加到监控容器,然后它可以监控所有不健康的容器并在其他容器不健康时为您重新启动它。

Docker 仅报告健康检查的状态。根据健康检查结果采取行动需要在 docker 之上添加一个额外的层 运行。 Swarm 模式提供此功能并随 docker 引擎一起提供。启用:

docker swarm init

然后,您可以使用 docker servicedocker stack 命令声明目标状态,而不是使用 docker run 管理单个容器,集群模式将管理容器以实现目标状态。

docker service create -d  --net=host applicationname:temp

请注意,主机网络和发布端口不兼容(它们放在一起没有逻辑意义),net 需要两个破折号才能成为有效标志,并且在 swarm 模式下不支持更改 pid 名称空间。许多其他功能应该类似于 docker run.

https://docs.docker.com/engine/reference/commandline/service_create/