首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用容器自动删除自动重新启动Docker容器?

如何使用容器自动删除自动重新启动Docker容器?
EN

Server Fault用户
提问于 2018-04-04 15:17:22
回答 1查看 11.2K关注 0票数 6

我有一个通用的VPS,并且正在对其上的应用程序进行文档化。它上将有大约5-6个容器,而且很少有其他容器,因此这个盒子可以根据需要进行小规模的重建。

对于每个应用程序,我都有一个开始脚本。WordPress容器如下所示:

代码语言:javascript
复制
#!/bin/bash

# Get the host IP address
export DOCKER_HOSTIP=`ifconfig docker0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1`
echo "Connecting to database on Docker host ${DOCKER_HOSTIP}"

docker run \
    --add-host=docker:${DOCKER_HOSTIP} \
    --network dockernet \
    --network-alias jonblog \
    --detach \
    --restart always \
    --rm \
    jonblog

但是,这将返回一个错误:

相互冲突的选项:-重新启动和--rm

有几张码头船票说这是明智的,但我不明白。我认为我的意思很明确:如果一个容器没有运行(例如在启动时),那么我想启动它。如果它死了,那么我希望容器被移除,并从基本映像中创建一个新的新容器。无论如何,容器应该是不可变的--我希望保留的任何状态,比如媒体文件和日志,都将写入卷中。

因此,我认为我应该删除--restart标志,然后使用流程管理器停止并启动Docker容器。我能用一下莫尼特吗?我希望能做这样的事情:

代码语言:javascript
复制
CHECK PROCESS jonblog MATCHING jonblog
  START PROGRAM = "/root/docker/jonblog/host-start.sh"
  STOP PROGRAM = "docker stop jon-blog"

但是,这会检查系统处理表,而不是docker ps,因此它将找不到与指定字符串匹配的内容。我能让它定期执行docker ps并在输出中匹配行吗?

如果事实证明它是可靠的,我很乐意使用另一种工具。例如,我发现主管有点重量级,但如果这更能与Docker一起工作,我愿意使用它。

澄清--rm

我之所以需要--rm,是因为在文档化过程中,我停止了当前正在运行的容器,load是映像的一个新版本,然后重新运行上面的脚本。这意味着正在通知Docker每个容器的restart策略。我发现在重新启动这个程序之后,我会有大约15个不同版本的应用程序同时运行,这并不是我的意图。

我想我可以在旧的容器上使用docker update --restart never来防止这种情况的发生,但是当我的容器停止时,我会把它扔在周围,我希望它能自动删除。我可以定期使用某种cron工作来清理旧的,但考虑到码头工人可以为我做这件事,我觉得有点烦躁。

寻找一系列答案

一个非常有帮助的评论建议我应该去看看Minikube,这显然简化了Kubernetes的设置,甚至到了一个技术熟练的人在五分钟内就能启动和运行的程度。

我仍然很想看到更多的轻量级解决方案提出,所以我有一系列的答案可供选择。如前所述,我想找出像Monit这样的过程主管是否会工作的答案。

在我的头上,我可以写一个shell循环,每5秒将docker ps写到文件中一分钟,然后在Cron上每分钟运行一次。然后,我可以使用grep和Monit CHECK PROGRAM系统检查扫描该文件。这有点麻烦,但如果有问题的话,我很容易理解。对这个建议有什么进展吗?

EN

回答 1

Server Fault用户

回答已采纳

发布于 2018-04-11 13:05:24

我有一个适合我目前对码头工人的理解的答案。在评论中,我被建议尝试Minikube,虽然毫无疑问,这可以很快完成,但我担心这将是一个兔子洞的学习,将使我陷入焦油数周。我的工程原则之一是知道何时达到了填充新信息的认知极限!

因此,我开始以一种简单的方式解决这个问题。我有两个选择:

  1. 使用Docker中的容器自动删除功能,并设置我自己的重新启动系统。
  2. 使用Docker重新启动策略,并设置我自己的容器删除系统

首先,我认为过程主管Monit会很好地使用,部分是因为它是轻量级的,部分是因为我对它很熟悉。但是,它开始感觉到了错误的解决方案,因为我要解决的核心问题是它无法干净地获得一个Docker容器处理列表。

事实上,第二种选择要干净得多,这是因为停止集装箱清理实际上并不是一个优先事项--这只是为了保持物品的整洁。当然,我使用了Docker;下面是Dockerfile

代码语言:javascript
复制
# Docker build script for Docker Tidy

FROM alpine:3.6

RUN apk update
RUN apk add docker

# See this for BusyBox cron schedules
# https://gist.github.com/andyshinn/3ae01fa13cb64c9d36e7
COPY bin/docker-tidy.sh /etc/periodic/daily/
RUN chmod +x /etc/periodic/daily/docker-tidy.sh

# Start Cron in the foreground
ENTRYPOINT ["crond", "-l", "2", "-f"]

下面是bin/docker-tidy.sh

代码语言:javascript
复制
#!/bin/sh
#
# With thanks to:
# http://www.doublecloud.org/2015/05/simple-script-to-list-and-remove-all-stopped-docker-containers/

docker rm -v $(docker ps -a -q -f status=exited)

最后,我的解决方案的一个缺点是,如果主机在停止的容器清理之前重新启动,那么这些容器似乎也会重新启动。因此,在启动新容器之前,我重新设置这些容器的重新启动策略。

例如,下面是如何在主机上启动Docker容器本身。实际上,我已经将策略更改代码整理成了自己的脚本,但这将给出一般的想法:

代码语言:javascript
复制
#!/bin/bash

# Removes the restart policy from previous containers
CONTAINER_LABEL=docker-tidy-instance
docker ps --all --filter label=$CONTAINER_LABEL --quiet | xargs --no-run-if-empty docker update --restart no

docker run \
    --label $CONTAINER_LABEL \
    --volume /var/run/docker.sock:/var/run/docker.sock \
    --detach \
    --restart always \
    docker-tidy
票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/905988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档