我正在用docker做一些初始测试。在那一刻,我有我的图片,我可以把运行,一些集装箱:在Docker容器中自动启动服务
docker ps
我做docker attach container_id
和启动Apache2服务。
然后从主控制台将容器提交到图像。
退出容器后,如果尝试启动容器或尝试从提交的映像运行一个新容器,则该服务将始终停止。
如何创建或重新启动一个容器与启动的服务,例如apache?
我正在用docker做一些初始测试。在那一刻,我有我的图片,我可以把运行,一些集装箱:在Docker容器中自动启动服务
docker ps
我做docker attach container_id
和启动Apache2服务。
然后从主控制台将容器提交到图像。
退出容器后,如果尝试启动容器或尝试从提交的映像运行一个新容器,则该服务将始终停止。
如何创建或重新启动一个容器与启动的服务,例如apache?
编辑: 自从最初发布这个答案以来,我学到了很多关于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启动命令)添加到文件末尾的换行符中。
保存对图像所做的更改并使用docker run -i -t IMAGE /bin/bash
重新启动它,并且在附加时会发现apache2正在运行。
我猜你不行。你可以做的是使用Dockerfile创建一个图像,并在其中定义一个CMD,当容器启动时将执行该CMD。有关保持服务运行的信息,请参阅基础知识的构建器文档(https://docs.docker.com/reference/builder/)并参阅Run a service automatically in a docker container。
您不需要使用Dockerfile自动执行此操作。您也可以通过手动提交来创建映像,然后运行命令行。然后,您提供它应该运行的命令(这正是Dockerfile CMD实际所做的)。您也可以用这种方式覆盖Dockerfiles CMD:只有最新的CMD才会被执行,如果您使用一个容器启动容器,那么它就是命令行命令。文档中的基本命令docker run -i -t base /bin/bash
就是一个例子。如果你的命令太长,你当然可以创建一个便利的脚本。
您可以使用的选项将使用像Supervisord这样的进程管理器来运行多个进程。有人用sshd和mongodb完成了这个工作:https://github.com/justone/docker-mongodb
按照设计,当用于运行容器的根进程退出时,容器以分离模式退出。 您需要在FOREGROUND模式下启动Apache服务。
docker run -p 8080:80 -d ubuntu/apache apachectl -D FOREGROUND
参考:https://docs.docker.com/engine/reference/run/#detached-vs-foreground
好点/etc/bash.bashrc –
'的/ etc/bash的。bashrc'会在每个bash启动时执行,如果你稍后想与容器交互(例如执行'docker exec -ti ID bash'),可能会导致问题......我认为这不是放置启动脚本的正确位置像apache2 –
Agreed Petr。自从我发布这个答案以来,我已经了解了Docker,并且在它工作的时候,我们实际上并没有真正使用Docker。 – damick