【问题标题】:unhealthy docker container not restarted by docker native health check不健康的 docker 容器未由 docker 本机运行状况检查重新启动
【发布时间】:2019-08-18 13:59:26
【问题描述】:

我已经通过在 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)"

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

【问题讨论】:

  • 您的docker run 命令似乎无效。 net 选项需要--net 而不是-net,并且主机网络与发布端口不兼容。

标签: docker dockerfile docker-engine


【解决方案1】:

目前没有针对不健康容器的自动重启机制,请参阅this,但您可以按照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域套接字添加到monitor容器,然后它可以监控所有不健康的容器,如果其他容器不健康,它会为你重新启动它。

【讨论】:

    【解决方案2】:

    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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2019-05-11
      • 2016-10-13
      • 2021-04-20
      • 2016-04-23
      • 2021-11-08
      相关资源
      最近更新 更多