我应该在多个链接的Docker容器中分割一个应用程序,还是将它们合并为一个?

背景

我目前正在构build一个我想要部署到Docker容器的应用程序。

容器将运行在我的服务器上。 我希望能够在同一台服务器上运行其他应用程序,而不会增加运行的Docker映像的数量。

到目前为止,不同的零件/容器是:

  • Nginx(反向代理,静态资源)
  • 节点(应用程序前端)
  • 节点(应用程序后端/ API)
  • Mongo(数据库)

思考

我的一般想法是,每个不同的部分应该作为容器来运行。 我担心的是,如果我要在同一台机器上运行另一个应用程序,那么最终会使用不可处理的链接图像数量来增加它。

这可以通过为每个应用程序制作一个图像来解决。 因此,上述服务将成为一个形象的一部分。 这是否与Docker的整体安全性或目的冲突?

澄清

在一个Docker镜像中有多个服务是否与Docker的目的冲突?

从一个映像运行服务时,容器的整体安全优势是否会被删除?

Docker自己明确表示:您需要为每个容器运行一个进程 。

但是,他们处理连接集装箱的工具还有很多不足之处。 他们确实提供docker合成(以前称为无花果),但我的开发商报告说,它是挑剔的,偶尔失去跟踪链接容器。 它也不能很好地扩展,只适用于非常小的项目。

现在我认为最好的解决scheme是Google项目Kubernetes 。 Kubernetes也是最新版本的Openshift Origin ,PaaS平台以及Google Container Engine的基础,现在可能还有其他的东西。 如果您使用的是Kubernetes,则可以轻松部署到此类平台。

Docker确实明确表示,他们认为每个容器的一个进程是“正确的”方式,但从来没有真正给出正确的理由。 我的答案是,这取决于。 在这个特殊情况下,我会分解它们,并使用Kubernetes或OpenShift进行pipe理,因为它是微不足道的,它将使您能够独立扩展每个应用程序。

我不会说这是你必须分开你的应用程序的规则。 运行容器本质上是clone()系统调用,cgroups和selinux,这意味着您可以绝对运行每个容器的多个进程。 Docker,LXC,本地运行真的没关系。 LXC鼓励每个容器有多个过程,所以我认为“每个容器一个过程”是哲学而不是工程学

http://rhelblog.redhat.com/2016/03/16/container-tidbits-when-should-i-break-my-application-into-multiple-containers/