3

我已经通过在 Docker 文件中添加 HEALTHCHECK 命令来实现 docker 原生健康检查,如下所示,

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

设置容器的入口点

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

执行 docker run 命令如下图,

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 和操作系统的详细信息:

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

操作系统版本

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

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

4

2 回答 2

3

目前没有针对不健康容器的自动重启机制,请参阅此,但您可以按照此处提到的解决方法:

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 域套接字添加到监控容器,然后它可以监控所有不健康的容器,如果其他容器不健康,它会为您重新启动它。

于 2019-08-17T10:09:30.950 回答
3

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

docker swarm init

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

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

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

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

于 2019-08-17T10:40:07.267 回答