我现在在很多服务器上使用docker,但有时我使用的一些容器由于负载过重而崩溃。我正在考虑添加一个检查容器运行与否的每一分钟的cron,但我没有找到任何令人满意的方法。
我使用保存正在运行的容器的id的cidfile启动容器。如果容器崩溃,cidfile会留在那里,里面有id,我只是想知道你们怎么确定容器是否正在运行并重新生成它以防它掉下来。我应该只解析docker ps -a
的输出还是更优雅的解决方案?
答案 0 :(得分:4)
自docker版本1.2.0起,有一个名为run
的{{1}}命令的新开关,它应该使任何外部工具或监视过时。由于文档在撰写本文时没有正确解释该功能,请阅读announcing blog post了解详细信息。
答案 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
不太优雅:注意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
与上面类似,你可以看到一个给定的容器是否正在运行...在一个循环/ cron /中
#!/bin/bash
RUNNING=$(docker inspect --format '{{.State.Running}}' test)
if [ "$RUNNING" == false ]
then
# do something wise
fi
您可以组合命令来执行您喜欢的任何检查脚本,我选择upstart
,因为它适合我的情况,但如果您需要更多控制,这些示例可用于所有可能的场景。