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

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

背景

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

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

目前的不同部件/容器如下:

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

思考

我的想法是,每个不同的部分都应该作为一个容器运行。我担心的是,如果我在同一台机器上运行另一个应用程序,我最终会用大量无法处理的链接图像使它变得臃肿。

可以通过为每个应用程序制作一个镜像来解决此问题。这样上述服务将成为同一个镜像的一部分。这首先会与 Docker 的整体安全性或目的相冲突吗?

澄清

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

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

答案1

Docker 本身明确表示:你需要运行一个每个容器单个进程

但是,他们处理链接容器的工具还有很多不足之处。他们确实提供了 docker-compose(以前称为 fig),但我的开发人员报告说它很挑剔,偶尔会丢失链接容器的踪迹。它的扩展性也不好,实际上只适合非常小的项目。

目前我认为最好的解决方案是Kubernetes,这是谷歌的一个项目。Kubernetes 也是最新版本的Openshift 起源,一个 PaaS 平台,以及 Google Container Engine,现在可能还有其他东西。如果您使用 Kubernetes,您将能够轻松地部署到这些平台。

答案2

Docker 确实明确表示,他们认为每个容器一个进程是“正确”的方式,但从未真正给出理由。我的答案是,视情况而定。在这个特定情况下,我会将它们拆分,并使用 Kubernetes 或 OpenShift 进行管理,因为这很简单,而且它可以让您独立扩展应用程序的每个部分。

不过,我不会说你必须拆分应用程序。运行容器本质上是 clone() 系统调用、cgroups 和 selinux,这意味着你绝对可以为每个容器运行多个进程。Docker、LXC、自制,它们何时运行真的无关紧要。LXC 鼓励每个容器运行多个进程,所以我认为“每个容器一个进程”是一种哲学,而不是工程

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

相关内容