我有一个使用Puma的Rails应用程序。我正在使用nginx进行负载均衡。我想停靠并部署到DigitalOcean(Docker)Droplet。
在阅读了大量的博客和示例(其中大部分是一年之久且在Docker世界中已经很长时间了)之后,我仍然对两件事情感到困惑。假设我选择了一个带有4个CPU的DigitalOcean盒子。我该如何设置Rails容器?我应该设置4个不同的容器,Puma配置了1个工作进程吗?或者我应该设置1个容器,其中Puma配置了4个工作进程?
第二件事我很困惑:我应该在Rails容器中运行nginx,还是应该在单独的容器中运行它们?
这两个问题允许我在下面描述的4种排列。
答案 0 :(得分:2)
Docker喜欢按容器式设计推送单个进程。当在单个容器中运行多个进程时,Docker和底层进程之间存在额外的服务管理器层,这会导致Docker失去对实际服务状态的可见性。这通常会使Docker及其相关工具难以管理服务。 Puma管理员工不会像运行多个流程的通用服务管理员那样糟糕。
您可能还需要考虑应用程序中的下一步,托管多个drop / hosts,以及如何轻松实现下一步。
选项1和3遵循Dockers首选设计。如果您正在使用MRI,Puma可以在集群模式下运行,因此它取决于您是想自己管理Ruby进程(1)还是让Puma进行工作管理(3)。 nginx和Puma如何在工人之间分配请求之间会有所不同。 Puma还可以安排零停机更新,这需要一些努力才能通过Docker工作。如果您使用Rubinius或JRuby,您可能会倾向于选项3并让线程完成工作。
选项1可以让您使用Docker工具更轻松地在不同大小的主机上进行扩展。
选项2看起来像添加了一个不必要的应用程序跃点,Docker不再维护您的应用程序层中的服务状态,因为您需要容器中的其他内容来启动nginx和Puma。
由于本地套接字,选项4可能比其他选项更好一些,但Docker不再知道服务状态。
无论如何,尝试使用JMeter之类的解决方案和基准测试。您将很快了解在性能和管理方面哪些有效,哪些无效。