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

3
我目前在很多服务器上使用Docker,但是有时候我使用的一些容器由于负载过重而崩溃。我想添加一个cron定时任务,每分钟检查容器是否正在运行,但我没有找到任何令人满意的方法来实现这一点。
我使用cidfile启动容器,该文件保存正在运行容器的ID。如果容器崩溃,则cidfile将保留包含ID的文件。我想知道你们如何确保容器正在运行并在其关闭时重新启动它。我应该只解析“docker ps -a”的输出,还是有更优雅的解决方案?

你知道是容器崩溃了还是其中运行的命令崩溃了吗?如果是进程出现问题,你可以尝试通过supervisord启动它,这样就可以重新启动了。 - Abel Muiño
进程是由supervisord启动的,但我相当确定是容器崩溃了,因为我必须重新启动主机上的整个docker守护进程才能再次启动容器... - Romeo Mihalcea
哎呀!那看起来像是 Docker 的一个 bug。我建议你确保运行最新的 Docker 守护程序版本,并在 Github 项目上开一个 issue。 - Abel Muiño
2个回答

4
自 Docker 版本 1.2.0 起,run 命令有一个名为 --restart 的新开关,它可以使任何外部工具或监控变得过时。由于文档在撰写本文时没有很好地解释该功能,请阅读官方博客文章以了解详情。

文档现在也得到了更新,详见[https://docs.docker.com/reference/commandline/cli/#restart-policies]。 - pitty.platsch

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

    可能是每小时一次的cron...

    #!/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
    
你可以组合命令来完成任何你想要的检查脚本,我选择了upstart因为它适合我的情况,但这些示例可用于所有可能的情况,如果需要更多控制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接