![我应该将应用程序拆分成多个链接的 Docker 容器还是将它们合并为一个?](https://linux22.com/image/672034/%E6%88%91%E5%BA%94%E8%AF%A5%E5%B0%86%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%8B%86%E5%88%86%E6%88%90%E5%A4%9A%E4%B8%AA%E9%93%BE%E6%8E%A5%E7%9A%84%20Docker%20%E5%AE%B9%E5%99%A8%E8%BF%98%E6%98%AF%E5%B0%86%E5%AE%83%E4%BB%AC%E5%90%88%E5%B9%B6%E4%B8%BA%E4%B8%80%E4%B8%AA%EF%BC%9F.png)
背景
我目前正在构建一个想要部署到 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 鼓励每个容器运行多个进程,所以我认为“每个容器一个进程”是一种哲学,而不是工程