我应该为我的networking应用程序使用单独的Docker容器吗?

我是否需要为复杂的Web应用程序使用单独的Docker容器,或者我可以将所有必需的服务放在一个容器中? 任何人都可以解释我为什么我应该把我的应用程序分为许多容器(例如php-fpm容器, mysql容器, mongo容器),当我有能力安装和启动所有东西在一个容器?

在使用Docker时需要考虑的一点是它是如何工作的。 Docker用您在ENTRYPOINT中的CMD (和ENTRYPOINT ,稍微复杂一点)指令中指定的命令replace您的PID 1。 PID 1通常是你的初始化系统所在的地方(sysvinit,runit,systemd等等)。 您的集装箱生活和死亡,无论从那里开始的任何过程。 当过程死亡,你的容器死亡。 当你inputdocker logs myContainer时,容器中stdout和stderr是你在主机上给出的。 顺便说一句,这就是为什么你需要跳过箍来启动服务并运行cronjobs(通常由init系统完成的事情)。 这对于理解以某种方式做事的动机非常重要。

现在,你可以做任何你想做的事情。 关于“正确”的做法,有许多意见,但你可以扔掉所有的东西,做你想做的事情。 所以你可以弄清楚如何在一个容器中运行所有这些服务。 但是现在你知道ENTRYPOINT如何用你在ENTRYPOINT中的CMD (和ENTRYPOINT )中指定的任何命令replacePID 1,你可能会认为谨慎的做法是保持你的应用程序运行在它们自己的容器中,并让它们相互工作通过容器链接 。 ( 更新 – 2017年4月27日:容器链接已被弃用,有利于正常的ole 容器networking ,这是更健壮,这个想法是,你只需join你的单独的应用程序容器到相同的networking,使他们可以相互交谈) 。

如果你需要一些帮助决定,我可以从我自己的经验告诉你,当你的应用程序分成单独的容器,然后将它们连接在一起时,它会变得更清洁和更容易维护。 刚才我正在build立HHVM的Wordpress安装,我正在安装Nginx和HHVM / php-fpm,Wordpress安装在一个容器中,而MariaDB的东西放在另一个容器中。 将来,这将使我可以直接在我的MariaDB数据前放置replace的Wordpress安装,几乎没有麻烦。 每个应用程序装箱一次是值得的。 祝你好运!

将Web应用程序划分为多个容器时,在部署应用程序时不需要重新启动所有服务。 像传统上,当你更新你的web图层时,你不会重新启动你的mysql服务器。

另外,如果您想扩展您的应用程序,那么如果您的应用程序将不同的容器分开,则更容易。 然后,您可以缩放应用程序中需要解决瓶颈的部分。

有些人会告诉你,每个容器只能运行一个进程。 其他人会说每个容器1个应用程序。 这些build议是基于微服务的原则。

我不认为微服务是所有情况下的正确解决scheme,所以我不会盲目地遵循这些build议。 如果你的情况在一个容器中有多个进程是有意义的,那就这样做。 (关于这个问题,请参见主pipe和Phusion基础图像 )

但是还有另外一个理由来分开容器:在大多数情况下,你做的工作就less了。

在Docker Hub上 ,有很多准备好使用Docker镜像。 只要拉你需要的。

那么剩下的事情是:

  • 阅读那些docker图像的文档(设置什么环境variables等)
  • 创build一个docker-compose.yml文件来简化操作这些容器

将Web应用程序放在单个容器中,并将支持服务(如数据库等)放在单独的容器中可能会更好。 通过这样做,如果您需要执行滚动更新或重新启动,您可以保持数据库联机,同时您的应用程序节点正在执行单独的重新启动,因此您不会遇到停机时间。 如果你有像Redis这样的caching,这也是有用的,同样的原因。 它也将允许你更容易地添加节点以松散耦合的方式进行缩放。 它也将允许您以更适合特定目的的方式pipe理集装箱。 对于您所描述的应用程序types,我发现在单个容器上运行所有服务的参数很less。

这取决于您的应用程序的视觉和路线图。 将一个应用程序的所有组件放在一个层中,就像将所有的蛋放在一个篮子里一样。

无论何时您的应用程序需要安全性,性能相关的问题,然后将这三个组件分别放在它们自己的容器中将是理想的解决方 不用说,集装箱之间的这种分工将需要一定的成本,而且这些分工与将这些集装箱连接起来以实现通信和安全等等有关。