我可以在Docker容器中运行多个程序吗?

我试图从部署一个旨在在桌面上运行的应用程序的angular度来围绕Docker。 我的应用程序只是一个瓶Web应用程序和mongo数据库。 通常我会安装在一个虚拟机,并转发一个主机端口到访客的Web应用程序。 我想给Docker一个尝试,但我不知道我是如何使用多个程序。 文件说,只能有入口,所以我怎么能有Mongo和我的烧瓶应用程序。 或者他们需要分开包含,在这种情况下,他们如何相互交stream,以及如何让分发应用变得容易?

只能有一个入口点,但是这个目标通常是一个启动尽可能多的程序的脚本。 您可以额外使用例如Supervisord或类似的服务来启动单个容器内的多个服务。 这是在单个容器中运行mysql,apache和wordpress的docker容器的一个例子 。

说,你有一个单一的Web应用程序使用的数据库。 那么在单个容器中运行它们可能更容易一些。

如果您拥有多个应用程序使用的共享数据库,则最好在自己的容器中运行数据库,并将应用程序分别放在自己的容器中。

当应用程序在不同的容器中运行时,至less有两种可能性:

  1. 使用暴露的IP端口并通过它们连接。
  2. 最近的docker版本支持链接 。

我有类似的要求运行LAMP堆栈,Mongo DB和我自己的服务

Docker是基于操作系统的虚拟化,这就是为什么它隔离它的容器围绕一个正在运行的进程,因此它只需要在FOREGROUND中运行至less一个进程。

因此,您提供了自己的启动脚本作为入口点,因此您的启动脚本将成为一个扩展的Docker映像脚本,您可以在其中堆叠任意数量的服务,只要至less一个前台服务已启动,即将结束

所以我的Docker镜像文件最后有两行:

COPY myStartupScript.sh /usr/local/myscripts/myStartupScript.sh CMD ["/bin/bash", "/usr/local/myscripts/myStartupScript.sh"] 

在我的脚本中,我运行所有的MySQL,MongoDB,Tomcat等。最后,我运行我的Apache作为前台线程。

 source /etc/apache2/envvars /usr/sbin/apache2 -DFOREGROUND 

这使我可以启动我的所有服务,并保持容器活着,最后一个服务开始在前台

希望它有帮助

更新 :自从我上次回答这个问题以来,像Docker组合这样的新东西已经出现,它可以帮助您在自己的容器上运行每个服务,但将所有这些服务绑定在一起作为这些服务之间的依赖关系,尝试了解更多关于docker-compose使用它,这是更优雅的方式,除非你的需要不符合它。

他们可以在不同的容器中,事实上,如果应用程序也打算在更大的环境中运行,他们可能会。

多容器系统需要更多的编排才能提供所有必需的依赖关系,尽pipe在Docker v0.6.5 +中,还有一个新的工具可以帮助Docker自身build立 – 链接 。 有了多机解决scheme,仍然需要从Docker环境以外的地方安排。

对于两个不同的容器,这两个部分仍然通过TCP / IP进行通信,但是除非端口被专门locking(不build议,否则将无法运行多个副本),您必须通过新的端口数据库已经暴露在应用程序中,以便它可以与Mongo通信。 这又是Linking可以提供的帮助。

对于一个简单的小型安装来说,所有的依赖关系都在同一个容器中,数据库和Python运行时都是由最初称为入口点的程序启动的。 这可以像shell脚本或其他一些进程控制器一样简单 – Supervisord非常stream行,公共Dockerfiles中存在大量示例。

我同意其他答案,使用两个容器是可取的,但如果你有心在一个容器中添加多个服务,你可以使用像supervisord这样的东西。

例如在Hipache中,包含的Dockerfile运行supervisord,而文件supervisord.conf指定要运行的hipache和redis-server。

Docker提供了一些关于如何去做的例子 。 轻量级选项是:

把所有的命令放在一个包装脚本中,并且包含testing和debugging信息。 运行包装脚本作为您的CMD 。 这是一个非常天真的例子。 首先,包装脚本:

 #!/bin/bash # Start the first process ./my_first_process -D status=$? if [ $status -ne 0 ]; then echo "Failed to start my_first_process: $status" exit $status fi # Start the second process ./my_second_process -D status=$? if [ $status -ne 0 ]; then echo "Failed to start my_second_process: $status" exit $status fi # Naive check runs checks once a minute to see if either of the processes exited. # This illustrates part of the heavy lifting you need to do if you want to run # more than one service in a container. The container will exit with an error # if it detects that either of the processes has exited. # Otherwise it will loop forever, waking up every 60 seconds while /bin/true; do ps aux |grep my_first_process |grep -q -v grep PROCESS_1_STATUS=$? ps aux |grep my_second_process |grep -q -v grep PROCESS_2_STATUS=$? # If the greps above find anything, they will exit with 0 status # If they are not both 0, then something is wrong if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then echo "One of the processes has already exited." exit -1 fi sleep 60 done 

接下来,Dockerfile:

 FROM ubuntu:latest COPY my_first_process my_first_process COPY my_second_process my_second_process COPY my_wrapper_script.sh my_wrapper_script.sh CMD ./my_wrapper_script.sh