AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 905988
Accepted
halfer
halfer
Asked: 2018-04-05 07:17:22 +0800 CST2018-04-05 07:17:22 +0800 CST 2018-04-05 07:17:22 +0800 CST

如何使用容器自动删除功能自动重启我的 Docker 容器?

  • 772

我有一个通用 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

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

冲突的选项:--restart 和--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过程中,我停止了当前运行的容器,load一个新版本的镜像,重新运行上面的脚本。这意味着 Docker 会被通知restart每个容器的策略。我发现重启机器后,我会同时运行 15 个左右略有不同的应用程序版本,这不是本意。

我想我可以docker update --restart never在旧容器上使用来防止这种情况发生,但是当我的容器停止时,我把它留在周围,我会尽快让它自动删除。我可以使用某种 cron 作业定期清理旧的,但考虑到 Docker 可以为我做这件事,这感觉有点笨拙。

寻求一系列答案

一个非常有帮助的评论建议我应该研究 Minikube,它显然简化了 Kubernetes 的设置,即使在某种程度上熟练的个人可以在五分钟内启动并运行。

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

从头到尾,我可以编写一个 shell 循环,docker ps每五秒写入一个文件,持续一分钟,然后每分钟在 Cron 上运行它。grep然后我可以使用MonitCHECK PROGRAM系统检查来扫描该文件。这有点骇人听闻,但如果它有问题,我可以很容易地理解它。这个建议有什么进展吗?

docker
  • 1 1 个回答
  • 10394 Views

1 个回答

  • Voted
  1. Best Answer
    halfer
    2018-04-12T05:05:24+08:002018-04-12T05:05:24+08:00

    我有一个适合我目前对 Docker 理解的答案。评论中建议我尝试 Minikube,尽管毫无疑问这可以快速启动,但我担心这将是一个学习的兔子洞,会让我在 tar 中困住数周。我的工程原理之一是知道一个人何时达到了填充新信息的认知极限!

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

    1. 使用 Docker 中的容器自动删除功能,并设置我自己的重启系统
    2. 使用 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
    
    • 1

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve