在Docker容器中自动启动服务

12

我正在使用Docker进行一些初始测试。目前我有我的镜像,并且可以运行一些容器,命令为:

I'm doing some initial tests with docker. At moment i have my images and I can put some containers running, with:


docker ps

我使用docker attach container_id命令并启动apache2服务。

然后,我从主控制台将容器提交到镜像。

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

如何创建或重新启动一个已启动服务(例如Apache)的容器?

5个回答

28

编辑:

自从最初发布此答案以来,我了解了很多有关Docker的知识。在Docker中,“自动启动服务”不是一个好的使用模式。相反,可以使用像fleetKubernetes或者甚至是Monit/SystemD/Upstart/Init.d/Cron这样的工具来自动启动在Docker容器中执行的服务。

原始回答:

如果您使用命令/bin/bash启动容器,则可以按照https://dev59.com/bGQm5IYBdhLWcg3w6CWr#19872810中所述的方式完成此操作。

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

保存更改并使用docker run -i -t IMAGE /bin/bash重新启动它,您会发现连接时Apache2正在运行。


6
/etc/bash.bashrc 会在每次 bash 启动时执行,这可能会导致问题,如果你以后想要与容器进行交互(例如执行 docker exec -ti ID bash)... 我认为这不是放置诸如 apache2 等服务的启动脚本的正确位置。 - Petr Peller
同意Petr。自从我发布这个答案以来,我了解了Docker,虽然它可以工作,但它并不是我们在现实生活中实际使用Docker的方式。 - damick
为什么不使用 docker run -i -t IMAGE /usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf,需要 bash 干什么? - vbence
vbence,看起来你没有读到在你和我之前的评论以及我对答案的EDIT?是的,你提到的方法更加合适,但是这个答案是在我学习了有关容器化和进程初始化的更多知识之前给出的,正如我的EDIT所证明的那样。这也是在Docker添加了“docker exec …”进程注入之前,我们几乎没有办法与或排除容器故障而不运行bash。 - damick
说“现在我们如何在实际生活中使用Docker”似乎有些愚蠢。将依赖项打包到Docker中,用于构建或其他非生产环境的临时应用程序是完全可以接受的。如果您以这种方式使用Docker,请不要感到难过。 - sclarson

6

4
我猜你做不到。你可以使用Dockerfile创建一个图像,并在其中定义一个CMD,当容器启动时将执行该命令。请参阅构建器文档以了解基础知识(https://docs.docker.com/reference/builder/),并查看在docker容器中自动运行服务以获取有关保持服务运行的信息。
您无需使用Dockerfile自动化此过程。您还可以通过手动提交来创建镜像,并在命令行上运行它。然后,您提供应该运行的命令(这正是Dockerfile CMD实际执行的操作)。您也可以以这种方式覆盖Dockerfile CMD:只有最新的CMD将被执行,如果您使用一个命令行命令启动容器,则为命令行命令。文档中基本的docker run -i -t base /bin/bash命令就是一个例子。如果您的命令变得太长,您当然可以创建一个方便的脚本。

2

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

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

参考文献:https://docs.docker.com/engine/reference/run/#detached-vs-foreground 本文介绍了Docker中"detached"和"foreground"两种启动容器的方式。在"detached"模式下,容器会在后台运行,而在"foreground"模式下,容器则会在前台运行。其中详细介绍了这两种模式的使用方法及其差异点。

1
尝试在Dockerfile的entrypoint中添加启动脚本,如下所示:
ENTRYPOINT service apache2 restart && bash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接