在不同容器中对nginx和php进行docker化有什么优势?


18

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

构建两个docker映像而不是同时安装两个nginx + php的优点是什么?

Answers:


19

使用nginx的PHP通常是使用php-fpm来完成的,这是一个单独的过程。

在每个容器中保留一个进程的docker核心思想(有关这一点的更多详细信息,请参见答案的结尾),这对于将nginx进程和php-fpm进程放在单独的容器中是有意义的。

由于nginx和php-fpm之间的通信是通过fastcgi产生的,因此php-fpm容器也可以位于单独的主机上,这允许在nginx后面使用一堆php-fpm容器。

在后面的评论墙后面有一些背景知识,docker文档中有一段关于容器应该只涉及一个问题的想法。

linux容器(lxc)的主要思想是在cpu和内存级别的隔离名称空间中运行进程,docker在此之上在文件系统级别添加隔离。
这样做的好处是,在此名称空间内对进程的破坏将不允许读取其他进程的内存,因此应防止主机上的其他破坏。

在谈论nginx和php-fpm时,它们是成对工作的,但是每个人都有各自的关注点,nginx将执行HTTP部分,路由,标头验证等工作,而php-fpm将进行代码解释并将html部分返回给nginx 。通常将两者一起提供给一个应用程序不是必须的。

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

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

虽然“每个容器一个进程”通常是一个很好的经验法则,但这并不是一个硬性规定。根据您的最佳判断,使容器保持清洁和模块化

没有适用于所有事物的“银弹规则”,它始终是容器内的复杂性与协调容器本身的复杂性之间的平衡。


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

我承认这是实现该想法的捷径,nginx并不是一个单一的进程,也不是php-fpm,但是在我的回答中,请关注替换进程,nginx可以进行路由,php-fpm可以进行解释
Tensibai

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

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

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

4

实际上,这里的一个缺失点是水平可伸缩性。很久以前,杰米·阿尔奎扎(Jamie Alquiza)上有一篇文章谈到了这一点:

http://archive.is/pDzz0

简而言之,您可以水平扩展php-fpm以获得更高的性能。一起扩展Nginx + php-fpm不会给您带来任何好处。我鼓励您自己进行一些压力测试(例如Tsung,Gatling等;请不要做Apache ab,这是一个非常古老的玩具),以验证文章中的内容。我个人有一些现实世界的经验证明这篇文章总体上是正确的。

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

  1. 如何配置Nginx动态发现php-fpm容器更改?这是简单的部分。
  2. 扩展后我们如何共享相同的卷/文件系统?Nginx和php-fpm容器应读取完全相同的内容以达到一致性。这使您最少需要拼图(也最有趣)。

编辑:现在快到2019年半年了。旧模型,同一容器中的php-fpm + nginx,具有不同的用法。如果您熟悉服务网格,那么nginx(或所谓的Nginmesh)可作为辅助车辆来处理东西向的交通。东西向的流量主要用于在服务或其他高级功能之间进行身份验证,而纯粹的php-fpm无法做到这一点。


3

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


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

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

1
@ 030 这里是一个例子
CarlosAS

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

我不同意这个答案,因此,一个具有mod安全性的apache服务器与一个tomcat进行通信,与一个仅托管一个应用程序的postgresql服务器进行通信应位于一个容器中。
Tensibai

-1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.