我刚刚开始使用Docker和Kubernetes,并且一直在观察很多堆栈,其中有些人在单个映像中构建nginx + php,另一些人使用nginx构建映像,另一个人使用php构建(挂载相同路径并封闭两个容器在Kubernetes中的同一部署中。)

构建两个docker映像而不是将两个nginx + php安装在同一个容器中有什么好处?

#1 楼

使用nginx的PHP通常是使用php-fpm完成的,这是一个单独的进程。将nginx进程和php-fpm进程放在单独的容器中。

nginx和php-fpm之间的通信是通过fastcgi产生的,因此php-fpm容器也可以位于单独的主机上,这允许使用在nginx后面的一组php-fpm容器。 br /> linux容器(lxc)的主要思想是在cpu和内存级别的隔离命名空间中运行进程,docker在此之上在文件系统级别添加隔离。
优点是该名称空间内的进程不允许读取其他进程的内存,因此应避免

在谈论nginx和php-fpm时,它们是成对工作的,但是每一个都有自己的关注点,nginx将执行HTTP部分,路由,标头验证等。 -fpm将进行代码解释,并将html部分返回给nginx。虽然通常都可以将两者一起提供给非强制性的单个应用程序。

根据上下文的不同,在开发人员工作站上放置一个包含整个应用程序堆栈的容器会比较容易,例如。但是,理想的情况是用于生产用途,请尽量减少容器内部的交互,在具有监督者的情况下在同一个容器中分离进程会带来僵尸进程和日志处理方面的问题(此处仅作说明之用)。

所以最后我会重点强调docker页面:


虽然“每个容器一个进程”通常是一个很好的经验法则,但这并不是一个硬性规定。运用您的最佳判断,使容器尽可能保持清洁和模块化。编排容器本身的复杂性。

评论


核心思想实际上是“每个容器只应关注一个问题”,并且“每个容器仅应有一个操作系统进程不一定是正确的”。 docs.docker.com/engine/userguide/eng-image/…

–user2640621
17-09-20在10:41



我承认这是达成这个想法的捷径,nginx并不是一个单一的进程,也不是php-fpm,但是在我的回答中将其替换为关注的问题,nginx可以进行路由,php-fpm可以解释

–滕西拜
17年9月20日在10:54

答案通常是一种服务,每个容器一个端口,而不是一个进程。另一方面,如果一个容器中有多个正在运行的进程,则需要考虑一些初始化进程,服务管理,重新启动,独立日志记录,独立程序包依赖性,这会变得更加复杂。缩放时,有时1:1映射变成1:n映射。

–吉里·克劳达(Jiri Klouda)
17年9月20日在16:26

@Jiri扮演魔鬼的拥护者:所以使用postgres DB的Rails应用程序前面的Apache应该放在同一个容器中?毕竟,这只是从外部角度来看的一项服务。

–滕西拜
17年9月20日在18:27

@JiriKlouda的答案已修改,我希望它足够详细,可以传达评论中提出的所有观点。

–滕西拜
17年9月22日在8:34

#2 楼

没有比必须管理两个容器更有意义的好处。只要您在流程之间具有1:1的关系并且它们具有单一目的,请将它们放在同一容器中。

评论


您是说同一容器上的不同图片吗?

– CarlosAS
17年9月20日在13:06

您将如何在同一容器中启动nginx和php-fpm?请添加示例。

– 030
17/09/20在14:49



@ 030这里是一个例子

– CarlosAS
17年9月20日在15:24

@carlos对于开发人员而言是非常有效的示例,我会阻止此类事情用于生产用途(在容器中运行有监督的管理员可以很容易地将脚枪打开)

–滕西拜
17年9月20日在17:41

我不同意这个答案,因此,一个具有mod安全性的apache服务器与tomcat对话,而与托管一个应用程序的postgresql服务器对话只能容纳在一个容器中。

–滕西拜
17年9月20日在18:30

#3 楼

实际上,这里的一个缺失点是水平可伸缩性。很久以前,杰米·阿尔奎扎(Jamie Alquiza)上有一篇文章对此进行了介绍:性能。一起扩展Nginx + php-fpm不会给您带来任何好处。我鼓励您自己进行一些压力测试(例如Tsung,Gatling等;请不要做Apache ab,那是一个非常古老的玩具),以验证本文的内容。我个人有一些现实世界的经验证明这篇文章总体上是正确的。

但是裸机/ VM有两个缺点(也许不是Kubernetes):


如何配置Nginx动态发现php-fpm容器更改?这是简单的部分。
缩放后如何共享相同的卷/文件系统? Nginx和php-fpm容器应读取完全相同的内容以达到一致性。这将使您最少需要拼图的部分(也是最有趣的部分)可以工作。用法。如果您熟悉服务网格,那么nginx(或所谓的Nginmesh)可以用作处理东西向交通的辅助工具。东西向的流量主要用于在服务或其他高级功能之间进行身份验证,而纯php-fpm无法做到这一点。

#4 楼

优点是:您可以在后端运行多个php-fpm容器,我们通过端口数将其称为PHP集群。
例如端口9000、9001、9002等。