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

前端之家收集整理的这篇文章主要介绍了如何使用容器自动删除自动重启Docker容器?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个通用的VPS,并在其上使用Dockerising应用程序.它上面会有大约5-6个容器,而其他的很少,所以可以根据需要轻松地重建盒子.

对于每个应用程序,我有一个启动脚本. wordpress容器看起来像这样:

#!/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

但是,这会返回错误

Conflicting options: –restart and –rm

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

所以,我认为我应该删除–restart标志,然后使用进程管理器来停止和启动Docker容器.我可以在这里使用Monit吗?我希望能够做到这样的事情:

CHECK PROCESS jonblog MATCHING jonblog
  START PROGRAM = "/root/docker/jonblog/host-start.sh"
  STOP PROGRAM = "docker stop jon-blog"

但是,它会检查系统进程表,而不是docker ps,因此它不会找到与指定字符串匹配的内容.我可以定期执行docker ps,并匹配输出中的行吗?

我很乐意使用其他工具,如果它证明是健壮的.例如,我发现Supervisor有点重量级,但如果能够更好地使用Docker,我愿意使用它.

关于–rm的澄清

我想–rm的原因是在Dockerisation过程中,我停止当前运行的容器,加载新版本的映像,然后重新运行上面的脚本.这意味着Docker会收到有关每个容器的重启策略的通知.我发现在重启盒子之后,我会同时运行15个左右略有不同版本的应用程序,这不是意图.

我想我可以使用docker update –restart从不在旧容器上来防止这种情况发生,但是当我的容器停止时,我只是躺着它,我很快就会自动删除它.我可以使用某种cron作业定期清理旧版本,但考虑到Docker可以为我做这件事,这感觉有些笨拙.

寻求一系列答案

一个非常有用的评论建议我应该研究Minikube,它显然简化了Kubernetes的设置,甚至达到了一个技术熟练的人可以在五分钟内启动和运行的程度.

我仍然希望看到更多轻量级解决方案,所以我有一系列的答案可供选择.如上所述,我想找出像Monit这样的流程主管是否有效的答案.

脱离我的头顶,我可以编写一个shell循环来将docker ps写入文件,每隔五秒钟写一个文件,然后每分钟在Cron上运行一次.然后我可以使用grep和Monit CHECK PROGRAM系统检查来扫描该文件.这有点笨拙,但如果有问题,我可以轻松理解.有关该建议的任何进展?

最佳答案
我有一个适合我目前对Docker的理解的答案.我在评论中被告知尝试使用Minikube,虽然毫无疑问这可以快速旋转,但我担心这将是一个学习的兔子洞,这会让我在焦油中停留数周.我的工程原理之一是知道什么时候已经达到了填充新信息的认知极限!

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

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

我从第一个开始,认为流程主管Monit会很好用,部分原因是它很轻,部分原因是因为我熟悉它.然而,它开始感觉是错误解决方案,因为我将解决核心问题,它无法干净地获得Docker容器进程列表.

事实上,第二种选择更加清洁,而且停止的容器清理实际上并不是优先考虑事实,这只是为了保持整洁.当然,我为此使用了Docker;这是Dockerfile:

# 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:

#!/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 Tidy容器本身.在实践中,我已将策略更改代码整理到自己的脚本中,但这将给出一般的想法:

#!/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

猜你在找的Docker相关文章