Docker 生产中每个主机应该有多少个容器?服务应该如何分割?

Docker 生产中每个主机应该有多少个容器?服务应该如何分割?,docker,containers,Docker,Containers,我试图更好地理解Docker的好处,但我并不真正理解它在生产中是如何工作的 假设我有一个web前端、一个RESTAPI后端和一个db。一共有3个容器 假设我想要3个前端,5个后端和7个数据库。(小问题:拥有比后端服务器更少的dbs有意义吗?) 现在,考虑到上面的场景,如果我将它们都打包在同一台主机上,那么我将获得高效使用主机资源的好处,但是当该机器出现故障或具有网络分区时,我就是DOA 如果我将它们划分为每个主机一个完整的应用程序(即1个FE、1个BE和1个DB),并在它们自己的主机上放置额外的

我试图更好地理解Docker的好处,但我并不真正理解它在生产中是如何工作的

假设我有一个web前端、一个RESTAPI后端和一个db。一共有3个容器

假设我想要3个前端,5个后端和7个数据库。(小问题:拥有比后端服务器更少的dbs有意义吗?)

现在,考虑到上面的场景,如果我将它们都打包在同一台主机上,那么我将获得高效使用主机资源的好处,但是当该机器出现故障或具有网络分区时,我就是DOA

如果我将它们划分为每个主机一个完整的应用程序(即1个FE、1个BE和1个DB),并在它们自己的主机上放置额外的容器,我可以在高效使用资源方面获得一些优势,但在我看来,当我有一个网络分区时,我仍然会损失很多,因为它会占用多个服务

因此,我几乎倾向于这样一个结论,即我应该为每个主机放入一个容器,但这意味着我使用资源的效率非常低,那么容器在生产中的好处是什么?我的意思是,一个操作系统在存储容量上可能是每台机器多出几Gig,但大多数云提供商至少为您提供10 Gig的存储空间。让我们面对现实,rest api后端或web前端甚至不会接近10 Gig…甚至包括操作系统

所以,在所有这些之后,我试图找出我是否错过了容器的意义?将一个应用程序的所有容器都放在一台主机上的好处主要与测试和开发的好处有关吗

我知道在不同的供应商/机器之间轻松移动容器会带来好处,但在大多数情况下,我个人并不认为这是一个巨大的收益,因为这是可以通过图像实现的


对于生产中的容器,我还缺少其他好处吗?测试和开发的主要好处是什么?(我是否认为生产中的容器是错误的)

这取决于您在容器中运行的应用程序的类型。从我的头脑中,我可以想出几种不同的方法来看待这个问题:

  • 您的应用程序磁盘空间大吗
  • 是否需要在多台计算机上保存应用程序失败
  • 您能否在同一主机上运行不同应用程序的多个不同实例而不降低它们的性能
  • 您是否使用类似或的软件来处理您的机器

我认为,即使没有容器,大多数问题的答案都很有趣。容器可能会让您不再考虑单个主机,但您仍然需要自己决定和测量主机的负载。

注意:这个问题非常广泛,可能会占据整本书的篇幅,但我将给出一些说明

集装箱的好处 容器令人兴奋的部分不是它们在单个主机上的使用,而是它们在大型集群上连接的主机之间的使用。不要将您的机器视为独立的docker主机,而是将其视为承载容器的资源池

容器本身并不是突破性的(即Docker的CTO在最后一次DockerCon上声明“没有人关心容器”),但与最先进的调度程序和容器编排框架相结合,它们成为处理生产级软件的非常强大的抽象

关于它也适用于虚拟机的论点,是的,它确实适用,但是容器比虚拟机有一些技术优势(请参阅:),这使它们更易于使用

在单个主机上 在单个主机上,您可以从容器中获得的好处包括(除其他外):

  • 用作开发环境,模拟真实生产集群上的行为
  • 独立于主机的可复制构建(便于共享)
  • 测试新软件时,不必使用日常使用的软件包使机器膨胀
从单个主机扩展到计算机池(群集) 在管理生产集群时,有两种方法:

  • 创建两个docker主机,并通过脚本或使用docker compose等解决方案“手动”运行/连接容器。监控服务/容器的生命周期由您负责,您应该准备好处理服务停机时间
  • 让容器协调器处理所有事情,并监控服务的生命周期,以更好地应对故障
有很多容器编辑者:Kubernetes、Swarm、Mesos、Nomad、Cloud Foundry,可能还有很多其他人。它们为许多大型公司和基础设施(如Ebay)提供动力,因此它们肯定会从使用这些设备中获益

选择正确的复制策略 容器最好用作一次性资源,这意味着您可以独立地停止和重新启动数据库,并且不会影响后端(除了因为数据库关闭而抛出错误)。因此,只要您的服务在多个主机上正确复制,您就应该能够处理任何类型的网络分区

您需要选择适当的复制策略,以确保您的服务保持正常运行。例如,您可以跨云提供商的可用性区域复制数据库,以便在整个区域停机时,您的数据仍然可用

例如,使用Kubernetes,您可以将每个容器(1FE、1BE和1dB)放在一个吊舱中。Kubernetes将处理在许多主机上复制此pod的问题,并监控这些pod是否始终处于启动和运行状态,如果没有,将创建一个新的pod来应对故障

如果要减轻网络分区的影响,请指定节点亲缘关系,提示调度程序将容器放置在相同的计算机子集上,并在应用程序上进行复制