我想要一个处理多个请求的容器吗


Do I want a container handling multiple requests?

这个问题与网络或主机无关,而是与我如何构建应用程序有关:如果我将docker容器设置为PHP web节点,那么我将其设置为可以处理多个连接的合适约定吗?

或者,最好将其设置为一次处理一个请求,然后如果我想同时处理更多的连接,则旋转同一映像的多个实例?

首先,请看一下docker.io和教程——在解决特定的体系结构问题之前,对如何使用它有一个坚实的理解是很重要的。

现在,在PHP世界中,您可以在容器中运行带有mod_PHP(或nginx/PHP_fpm或其他)的Apache。该容器将为所有传入的请求提供服务。

如果你需要负载平衡你的应用程序,那么你会有另一个容器(可能在另一台主机上),它有一个反向代理(比如HAProxy)来为你处理这个问题。您还可以将DNS配置为在具有或不具有HAProxy的Web服务器实例之间进行循环。

Docker容器通常是指运行单个(逻辑)应用程序,并限制该应用程序使用的资源(内存、磁盘I/O、网络带宽等)。这并不一定意味着运行单个进程;它可能有一些辅助的东西,比如进程监视器,但一般来说,PHP容器只会运行PHP解释器。这将运行其自身的多个副本。

正如我们所知,nginx和php-fpm都完全能够在可用资源限制的范围内同时处理多个请求。因此,单个容器可以为多个请求提供服务。使用mod_php的Apache也是如此,尽管在本例中,php嵌入在Apache中,限制了Apache的处理能力。因此,您可能无论如何都希望将web服务器和PHP分离到单独的(链接的)容器中。

因此,将会发生的情况是,您最终会获得足够的流量,以至于单个容器无法足够快地处理所有流量。在这一点上,你要么想扩大容器,要么启动一个新的容器。一般来说,nginx可以同时处理数千个请求,PHP可以处理几十个请求(这些都是大概的数字)。因此,在规模上,您可能有800个PHP容器,由四个nginx容器提供服务,前面有两个haproxy负载均衡器容器,所有这些容器每秒处理10000到峰值40000个请求。

不过,这800个PHP容器并不一定都在800个主机上。如果您使用的是t2.small AWS实例,则可能会出现这种情况,在该实例中,您只需要让容器使用VM的所有资源,但如果IT部署到裸机(通常比单个VM拥有更多的资源),则几乎可以肯定,该主机上会有多个容器,以便利用其所有资源。PHP往往是CPU绑定的,因此IT也可能将容器与完全不相关的容器并行运行,例如,这些容器不使用太多CPU,但使用大量RAM或磁盘。

也就是说,是的,你的单个容器可以也将处理多个同时的请求,你的程序应该意识到这一点。这通常不是问题,但这确实意味着你应该避免可能导致争用的问题,如数据库锁定,或者所有你的容器都可能急停。

如果您认为容器类似于流程,这将适当地指导您的选择。

遵循"一个应用程序到一个容器"的最佳实践建议,它将是一个过程,尽管在某些控制组中附加了某些命名空间,并进行了chroot处理。