这个问题与网络或托管无关,而是与我如何构建我的应用程序有关:如果我将docker容器设置为PHP Web节点,那么我设置的正确约定是这样的它可以处理多个连接?
或者,最好是设置它以便一次处理一个请求,然后如果我想同时处理更多连接,那么启动同一图像的多个实例?
答案 0 :(得分:7)
首先,请查看docker.io和tutorial - 了解在解决特定架构问题之前如何使用它是非常重要的。
现在,在PHP世界中,您将在容器中运行带有mod_php(或nginx / php_fpm或其他)的Apache。该容器将为所有传入请求提供服务。
如果您需要对应用程序进行负载平衡,那么您将拥有另一个容器(可能在另一台主机上),该容器具有可以为您处理此问题的反向代理(如HAProxy)。您还可以将DNS配置为在具有或不具有HAProxy的Web服务器实例之间进行循环。
答案 1 :(得分:4)
如果您认为某个容器与某个流程类似,则会适当地指导您的选择。
遵循"一个应用程序到容器"的最佳实践建议,将成为一个进程,虽然在某些控制组中附加了某些名称空间,chroot-ed
答案 2 :(得分:4)
Docker容器通常用于运行单个(逻辑)应用程序并限制该应用程序使用的资源(内存,磁盘I / O,网络带宽等)。这并不一定意味着运行一个过程;它可能有辅助的东西,比如进程监视器,但一般来说PHP容器只会运行PHP解释器。这将自己运行多个副本。
众所周知,nginx和php-fpm完全能够处理多个同时发出的请求,最高可达资源限制。因此,单个容器可以提供多个请求。 Apache也可以使用mod_php,但在这种情况下,PHP嵌入在Apache中并限制了Apache可以处理的内容。因此,您可能希望将Web服务器和PHP分离为单独的(链接的)容器。
所以会发生的事情是,你最终获得足够的流量,单个容器无法足够快地处理它,或者根本不能处理它。此时,您要么想要放大容器,要么启动一个新的容器。通常,nginx可以处理数千个并发请求,PHP可以处理数十个(这些是大概数字)。因此,在规模上,您可能拥有800个PHP容器,由四个nginx容器提供服务,前面有两个haproxy负载均衡器容器,所有处理容量从10,000到每秒40,000个峰值。
然而,所有这800个PHP容器都不一定会在800个主机上。如果您正在使用t2.small AWS实例,那么您可能就是这样,您可以让容器使用VM的所有资源,但是如果IT部署到裸机,那么通常会有比单个资源更多的资源VM,您几乎肯定会在该主机上拥有多个容器,以便利用其所有资源。 PHP往往受CPU限制,因此IT也可能与完全不相关的容器并排运行容器,这些容器不会占用太多CPU,但会使用大量的RAM或磁盘。
所有这一切,是的,您的单个容器可以并且将处理多个同时发出的请求,并且您的程序应该知道这种情况正在发生。这通常不是问题,但它确实意味着您应该避免可能导致争用的问题,例如数据库锁定,或者所有您的容器可能会嘎然而止。