确保给定的docker容器正在运行

确保给定的docker容器正在运行,docker,Docker,我现在在相当多的服务器上使用docker,但有时我使用的一些容器会因为重载而崩溃。我曾考虑添加一个cron来检查容器是否每分钟都在运行,但我没有找到任何令人满意的方法 我用一个保存正在运行的容器id的cidfile启动容器。如果容器崩溃,cidfile会留在那里,id在里面,我只是想知道你们如何确保容器正在运行或者没有运行,并且在它崩溃的情况下重新启动它。我应该只解析docker ps-a的输出,还是有更优雅的解决方案?答案有些深奥,但我找到了多种方法,从最优雅的开始: 在运行容器时为其命名,以

我现在在相当多的服务器上使用docker,但有时我使用的一些容器会因为重载而崩溃。我曾考虑添加一个cron来检查容器是否每分钟都在运行,但我没有找到任何令人满意的方法


我用一个保存正在运行的容器id的cidfile启动容器。如果容器崩溃,cidfile会留在那里,id在里面,我只是想知道你们如何确保容器正在运行或者没有运行,并且在它崩溃的情况下重新启动它。我应该只解析docker ps-a的输出,还是有更优雅的解决方案?

答案有些深奥,但我找到了多种方法,从最优雅的开始:

  • 在运行容器时为其命名,以便可以附加到其进程日志,并将其与进程监视器(如upstart/systemd/supervisord)耦合

    docker run-itd--name=testubuntu

    upstart示例(
    /etc/init/test.conf
    ):

    说明“我的测试容器”
    启动文件系统并启动docker
    在运行级别停止[!2345]
    重生
    剧本
    /usr/bin/docker启动-测试
    结束脚本
    

  • 不那么优雅:注意cidfile内容的变化

    docker run-itd--name=test--cidfile=/tmp/cidfile\u路径ubuntu

    一个小时一次的老太婆也许

    #!/bin/bash
    
    RUNNING=$(docker ps -a --no-trunc | awk '/test/ && /Up/' | awk '{print $1}')
    CIDFILE=$(cat /tmp/cidfile_path)
    
    if [ "$RUNNING" != "$CIDFILE" ]
    then
       # do something wise
    fi
    
  • 与上面类似,您可以看到给定的容器是否在循环/cron/中运行

    #!/bin/bash
    RUNNING=$(docker inspect --format '{{.State.Running}}' test)
    
    if [ "$RUNNING" == false ]
    then
       # do something wise
    fi
    

  • 您可以组合命令来执行任何您喜欢的检查脚本,我选择了
    upstart
    ,因为它适合我的情况,但是如果您需要更多的控制,这些示例可以用于所有可能的场景。

    自docker 1.2.0版以来,有一个名为
    --restart
    run
    命令的新开关,它会使任何外部工具或监控过时。由于编写本文时文档没有正确解释该功能,请阅读以了解详细信息。

    您知道是容器崩溃还是容器内启动的命令崩溃吗?如果是进程,您可以尝试通过supervisord启动它,这样它就会重新启动。内部的进程是通过supervisord启动的,但我相当确定这是容器崩溃,因为我必须在主机上重新启动整个docker守护进程,以便能够再次启动容器…啊!那看起来像个码头工人的臭虫。我会确保您运行最新的docker守护程序版本,并在github项目上打开一个问题,现在也得到了更新。