繁体   English   中英

在 Docker 容器中自动启动服务

[英]Automatically Start Services in Docker Container

我正在用 docker 做一些初步测试。 目前我有我的图像,我可以运行一些容器,使用:

docker ps

我做docker attach container_id并启动 apache2 服务。

然后从主控制台将容器提交到图像。

退出容器后,如果我尝试启动容器或尝试从提交的映像运行一个新容器,该服务总是停止。

如何在服务启动的情况下创建或重新启动一个容器,例如 apache?

编辑:自从最初发布这个答案以来,我已经学到了很多关于 Docker 的知识。 “在 Docker 容器中自动启动服务”对于 Docker 来说不是一个好的使用模式。 相反,使用诸如fleetKubernetes甚至Monit /SystemD/Upstart/Init.d/Cron 之类的东西来自动启动在Docker 容器内执行的服务。

原始答案:如果您使用命令/bin/bash启动容器,那么您可以按照此处概述的方式完成此操作: https : //stackoverflow.com/a/19872810/2971199

因此,如果您使用docker run -i -t IMAGE /bin/bash启动容器,并且希望在容器启动时自动启动 apache2,请在容器中编辑/etc/bash.bashrc并添加/usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf (或任何您的 apache2 start 命令)到文件末尾的换行符。

保存对图像的更改并使用docker run -i -t IMAGE /bin/bash重新启动它,您会在附加时发现 apache2 正在运行。

您可以使用的一个选项是使用诸如 Supervisord 之类的进程管理器来运行多个进程。 有人用 sshd 和 mongodb 完成了这个: https : //github.com/justone/docker-mongodb

我想你不能。 您可以做的是使用 Dockerfile 创建一个镜像并在其中定义一个 CMD,它将在容器启动时执行。 有关基础知识,请参阅构建器文档 ( https://docs.docker.com/reference/builder/ ),并参阅在 docker 容器中自动运行服务以获取有关保持服务运行的信息。

您不需要使用 Dockerfile 自动执行此操作。 您还可以通过手动提交创建映像,然后在命令行中运行它。 然后,您提供它应该运行的命令(这正是 Dockerfile CMD 实际执行的操作)。 您还可以通过这种方式覆盖 Dockerfiles CMD:只会执行最新的 CMD,如果您使用一个来启动容器,这就是命令行命令。 文档中的基本docker run -i -t base /bin/bash命令就是一个示例。 如果您的命令变得太长,您当然可以创建一个方便的脚本。

按照设计,当用于运行容器的根进程退出时,容器以分离模式启动。 您需要在 FOREGROUND 模式下启动 Apache 服务。

docker run -p 8080:80 -d ubuntu/apache apachectl -D FOREGROUND

参考: https : //docs.docker.com/engine/reference/run/#detached-vs-foreground

尝试像这样将启动脚本添加到 dockerfile 中的入口点;

ENTRYPOINT service apache2 restart && bash

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM