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

时间:2014-06-27 21:01:02

标签: docker

我现在在很多服务器上使用docker,但有时我使用的一些容器由于负载过重而崩溃。我正在考虑添加一个检查容器运行与否的每一分钟的cron,但我没有找到任何令人满意的方法。

我使用保存正在运行的容器的id的cidfile启动容器。如果容器崩溃,cidfile会留在那里,里面有id,我只是想知道你们怎么确定容器是否正在运行并重新生成它以防它掉下来。我应该只解析docker ps -a的输出还是更优雅的解决方案?

2 个答案:

答案 0 :(得分:4)

自docker版本1.2.0起,有一个名为run的{​​{1}}命令的新开关,它应该使任何外部工具或监视过时。由于文档在撰写本文时没有正确解释该功能,请阅读announcing blog post了解详细信息。

答案 1 :(得分:1)

答案有点埋没,但我发现有多种方式从最优雅的方式开始:

  1. 在运行它时为容器命名,以便您可以附加到它的进程日志记录,并将其与进程监视器(如upstart / systemd / supervisord)结合使用

    docker run -itd --name=test ubuntu

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

    description "My test container" start on filesystem and started docker stop on runlevel [!2345] respawn script /usr/bin/docker start -a test end script

  2. 不太优雅:注意cidfile内容的变化

    docker run -itd --name=test --cidfile=/tmp/cidfile_path 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
    
  3. 与上面类似,你可以看到一个给定的容器是否正在运行...在一个循环/ cron /中

    #!/bin/bash
    RUNNING=$(docker inspect --format '{{.State.Running}}' test)
    
    if [ "$RUNNING" == false ]
    then
       # do something wise
    fi
    
  4. 您可以组合命令来执行您喜欢的任何检查脚本,我选择upstart,因为它适合我的情况,但如果您需要更多控制,这些示例可用于所有可能的场景。