我正在用docker做一些初步测试。目前我有我的图像,我可以运行一些容器,用:
docker ps
我做docker attach container_id
并启动apache2服务。
然后从主控制台我将容器提交给图像。
退出容器后,如果我尝试启动容器或尝试从提交的映像运行一个新容器,则服务始终停止。
如何使用已启动的服务创建或重新启动一个容器,例如apache?
答案 0 :(得分:27)
编辑: 自从最初发布这个答案以来,我已经学到了很多关于Docker的知识。 “在Docker容器中自动启动服务”对于Docker来说不是一个好的使用模式。相反,使用fleet,Kubernetes甚至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正在运行。
答案 1 :(得分:5)
您可以使用的选项是使用Supervisord等流程管理器来运行多个流程。有人用sshd和mongodb完成了这个:https://github.com/justone/docker-mongodb
答案 2 :(得分:4)
我想你不能。你可以做的是使用Dockerfile创建一个图像并在其中定义一个CMD,它将在容器启动时执行。有关基本知识(https://docs.docker.com/reference/builder/)的信息,请参阅构建器文档,有关保持服务正常运行的信息,请参阅Run a service automatically in a docker container。
您无需使用Dockerfile自动执行此操作。您也可以像手动提交一样创建映像,然后运行命令行。然后,您提供它应该运行的命令(这正是Dockerfile CMD实际执行的操作)。您也可以通过以下方式覆盖Dockerfiles CMD:仅执行最新的CMD,如果使用一个CMD启动容器,则命令行命令。文档中的基本docker run -i -t base /bin/bash
命令就是一个例子。如果您的命令变得太长,您当然可以创建一个便利脚本。
答案 3 :(得分:2)
按照设计,当用于运行容器的根进程退出时,以分离模式启动的容器将退出。 您需要以FOREGROUND模式启动Apache服务。
docker run -p 8080:80 -d ubuntu/apache apachectl -D FOREGROUND
参考:https://docs.docker.com/engine/reference/run/#detached-vs-foreground
答案 4 :(得分:1)
尝试像这样将启动脚本添加到dockerfile中的入口点;
ENTRYPOINT service apache2 restart && bash