我有一个通用 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 理解的答案。评论中建议我尝试 Minikube,尽管毫无疑问这可以快速启动,但我担心这将是一个学习的兔子洞,会让我在 tar 中困住数周。我的工程原理之一是知道一个人何时达到了填充新信息的认知极限!
因此,我着手以一种简单的方式解决这个问题。我有两个选择:
我从第一个开始,认为流程主管 Monit 会很好用,部分原因是它是轻量级的,部分原因是我熟悉它。但是,它开始感觉像是错误的解决方案,因为我要解决核心问题,即它无法干净地获取 Docker 容器进程列表。
事实上,第二个选项更清洁,并且由于停止容器清理实际上并不是优先事项而放大了这一点 - 它只是为了保持整洁。当然,我为此使用了 Docker;这是
Dockerfile
:这是
bin/docker-tidy.sh
:最后,我的解决方案的一个缺点是,如果在停止容器清理之前重新启动主机,这些容器似乎也会重新启动。因此,我在启动新容器之前重置了这些容器的重启策略。
例如,这是我在主机上启动 Docker Tidy 容器本身的方式。在实践中,我已将策略更改代码整理到自己的脚本中,但这将给出总体思路: