docker集装箱集群

我正在使用laravel homestead解决scheme进行开发,但现在我想迁移到docker。 问题是如何“膨胀”应该是我的容器。 当我说“臃肿”时,我的意思是每个容器应该有多less模块/服务。 例如,我创build了四个自定义容器,如下所示:

php -> php-fpm -> composer -> memcached -> redis mysql -> mysql nginx ->nginx node ->gulp ->bower ->npm ->grunt 

问题是,如果这是正确的集群,或者我应该创build单独的容器,让咕噜,鲍尔,memcached等? 如何决定一起做什么和分离容器? 有什么规定吗? 应该像生产一样发展?

如何将应用程序组件分解到容器中取决于您的目标是什么。 您的目标是让您的服务器更易于pipe理/pipe理? 您是否主要关心如何成功扩展您的应用程序,因为它获得更多的stream量? 以下是一些build议,如果缩放是您的主要关注:

  1. 把nginx放到自己的容器中是很有道理的,因为它的主要作用是作为一个负载平衡器 。 大多数情况下,所有的nginx都将请求传递给您的PHP服务进行处理。 由于您的应用可能需要处理会话,并且由于您不希望容器共享会话数据,因此应该使用ip_hash策略来委派请求。 这样你就不会遇到无法识别的CSRF令牌问题。
  2. 由于您的PHP容器将完成大部分工作,因此您应该将它们保存在容器中。 如果延迟成为问题,您可以随时启动一个新的PHP容器,并将其添加到您的虚拟群集中,以帮助承担负载。 任何与会话pipe理相关的东西,比如Redis或memcached,也可以放在这个容器中。 这样,每个容器都具有减less延迟所需的所有工具,并打开瓶颈。
  3. 您将希望将实际的Laravel应用程序文件放入一个容器中,并使其卷在其他容器中共享。 这样,如果您的应用程序执行诸如处理file upload等操作,则不必将这些文件复制到多个容器中。 您可能希望将composer php和工匠放在这里,因为这些程序处理的任务主要与维护Laravel应用程序中的文件有关。 迪伦·林格伦(Dylan Lindgren)build议把工匠和composer php放在自己的容器里 。
  4. 由于您的数据也是在整个应用程序中共享的,因此您应该也可以为数据库设置单独的容器。 我想你可能会考虑将你的数据库与你的Laravel应用程序文件捆绑在一起,但是这样做可能不那么容易,因为你可以相对容易地find各种数据库的预configuration容器。
  5. 至于节点,你可能甚至不需要在你的生产服务器上。 由于基于node / npm的组件通常仅用于在部署之前对资源(JS和CSS)进行组合和压缩,因此您可以对开发机器上的所有资源进行预处理,并将压缩/缩小的CSS / JS文件你的Laravel容器的一部分。 由于所有的CSS / JS相关的处理都发生在客户端,所以它们基本上可以被当作静态文件。

这是一个图表来表示:

在这里输入图像说明

请注意,您可以根据需要添加尽可能多的PHP / Redis / Memcached容器,以便处理额外的服务器负载。 这些容器甚至不一定必须位于同一台物理服务器上,这是您获得更多内存和处理能力的地方。

如果你不希望你的应用程序的负载是这样的,你需要所有这些来pipe理它,那么坚持传统的方法可能会更容易。 Docker相对来说还是比较新的,并不是真正推荐在生产环境中使用的,尽pipe像我一样,你可能真的很想搞清楚它是如何有用的。

Docker的一个很酷的事情是,你在本地开发你的容器,并可以“​​按原样”部署到云中。 所以,在本地你将拥有所有这些容器(甚至可以把它们中的一些换成你的数据库和/或服务器),然后部署就成为在生产服务器上运行容器的一个新实例的问题。

我希望这可以帮助您更好地理解如何制定将应用程序分解为容器的策略。 Docker对于Laravel领域来说还是比较新的,所以我相信这些做法在未来一两年内会迅速发生变化,并且可能最终变成自动化的。

在定义我的容器时,我总是会提前考虑指定的服务将会扩展多less,以及是否能够以一种孤立的方式进行扩展。 这样我就可以在一定时间内调整具体的服务,并且可以很好地调整瓶颈。 用你的例子我会做:

  • PHP + Nginx + Node(应用程序容器)
  • MySQL(Mysql容器)
  • Memcached(Memcached容器)
  • Redis(Redis容器)

您总是可以考虑将更多的MySQL实例添加到MySQL集群,就像使用Memcached和Redis一样。

作为最终的build议级别,在生产环境中,您应该考虑使用诸如Amazon RDS和Amazon Elasticache这样的MySQL和Memcached + Redis。 这将更容易设置和pipe理。