如何使用Docker,Puppet和Vagrant开发LAMP Web应用程序?


70

在黑暗时代,我通常用于开发LAMP Web应用程序的设置是在计算机上进行本地测试。PHP(以我为例),数据库和Web服务器都是本地安装的。

该服务器设置了Apache和MySQL的标准安装,并且我在Web应用程序的不同部分具有多个虚拟主机。当我对本地计算机上的结果感到满意时,我将登录到服务器和git pull登台环境中。假设服务器和我的机器都运行良好,那么我将为生产做同样的事情。

新的开端…

因此,现在我要从头开始一个全新的Web应用程序,我想“以适当的方式”进行操作。我已经阅读了有关Docker,Vagrant和Puppet(以及Chef,尽管我个人更喜欢Puppet的依赖系统,而不是Chef的迭代过程)。尽管我已经做了所有的研究,但是似乎仍然有一些问题我找不到以下答案:

Web服务器(例如Apache),数据库服务器(例如MySQL)和Web应用程序的每个部分是否应该有单独的Docker容器?

当我谈论Web应用程序的各个部分时,我的意思是诸如mysite.comcontrolpanel.mysite.com等。这些“部分”将共享同一数据库。

由于Docker似乎为Web和数据库服务器之类的东西提供了现成的容器,因此看来这些东西至少应该放在单独的容器中。Web应用程序的不同部分也应该放在单独的容器中吗?

Docker容器似乎被设计为可替换的,而不是我必须更新其中的软件。他们写的我不想丢失的数据又如何呢?

数据库服务器将管理与数据库内容相关的文件(我将要备份)。Web服务器将创建日志,而我的Web应用程序将管理各种文件和缓存等。所有这些文件都需要写在应用程序容器的外部(因为我可能会在更新时替换它们?),所以它们去哪里了? ?直接进入主机的文件系统?还是放入单独的“ Docker Volume”?如果它们进入Docker卷,我是否应该对数据库,Web服务器,应用程序等使用单独的卷?是否仍可以像现在一样使用SFTP从本地计算机轻松访问内容?我不想在这里失去任何便利!

使用Puppet为开发服务器和生产服务器创建和管理Docker容器是一个好主意吗?

Puppet似乎支持直接管理Docker容器,因此这似乎是一种从头开始轻松设置服务器或生产环境(使用Vagrant)的合理好方法。

希望我已经问了一些相关的问题;为开发和生产类似LAMP的Web应用程序获取一些适当的“最佳实践”将是非常不错的,只是我发现的东西似乎很少!

Answers:


47

Web服务器(例如Apache),数据库服务器(例如MySQL)和Web应用程序的每个部分是否应该有单独的Docker容器?

这个问题没有正确答案。如果要在生产环境中使用docker,请尝试在开发环境中运行docker容器,因为它们将在生产环境中运行。否则,只需使用最简单的方法即可使用Docker容器。

搬运工中心提供准备去容器PHP,数据库等,并很容易使用。另一方面,您必须它们链接在一起以允许它们进行交互。对于开发环境,如果您使用多个容器,则建议使用docker-compose

另一条路径是构建一个最接近您的生产机器(假设您只有一台机器)的docker映像,该映像将运行数据库,Web服务器和php。来自此类映像的容器将必须运行多个进程。这可以通过不同的方式来实现。看一下主管phusion / baseimage

当我谈论Web应用程序的各个部分时,我的意思是诸如mysite.com,controlpanel.mysite.com等。

您可以将它们分开。如果这些应用程序需要共享会话,请确保将会话存储在数据库中或所有人都可以访问的Docker卷上。

Docker容器似乎被设计为可替换的,而不是我必须更新其中的软件。他们写的我不想丢失的数据又如何呢?

Docker有一个叫做volume的东西,它允许数据从容器中写入文件系统。有多种使用卷的方式:您可以将目录从Docker主机安装到容器卷,或者可以具有数据卷container命名的volumes

Docker卷是一个重要的概念,值得花些时间来掌握它们。

如果您想轻松地从Docker主机访问容器使用的数据,可以在Docker主机上安装目录。尽管关于文件的权限和所有权可能很棘手

关于备份,请参阅docker用户指南,其中详细介绍了您需要了解的有关卷的所有信息。

使用Puppet为开发服务器和生产服务器创建和管理Docker容器是一个好主意吗?

最佳实践是在开发环境上进行操作的方式与在生产环境上进行操作的方式相同。如果所有工作都不会用于生产环境,则没有必要为您的开发环境正确设置人偶。仅使用shell配置,拥有一个通过docker配置VMVagrantfile真的很容易;恕我直言,木偶/厨师/ ...太过分了。


您在问正确的问题,但没有适合所有情况的答案。在我看来,有两种处理方法:

  • 使您的开发环境完全复制您的生产环境
  • 使您的开发环境不同于生产环境,并使其尽可能简单直接,这样开发人员就不会感觉到使用新工具所产生的摩擦

谢谢,这是一个很好的答案!
罗伯特

13

@Thomasleveil的答案已经非常不错,涵盖了所有重要部分,但我想补充一点。

流浪者,木偶/厨师和docker-compose

在为Vagrant配置虚拟机时,通常使用Puppet或Chef为服务器安装所需的软件包...以及一些shell脚本。PuPHPet是配置基于虚拟机的LAMP堆栈以及了解Puppet和Vagrant如何在更复杂的设置中一起工作的绝佳资源。顺便提一下Protobox是替代品。

当您将Docker容器与Vagrant一​​起使用时,就像对VM一样。然后,vagrant up您实际上是使用Docker提供程序运行Docker容器。Vagrant将从Dockerfile为您构建容器,或使用现有的映像,或多或少像docker-composefig)一样运行它们。

为您的Docker安装选择Vagrant的主要原因是,如果您或您的团队在Windows环境中部分工作,则无论您的主机系统是什么,Vagrant都可以使您的设置保持一致(请参阅Host VM)。

如果您使用的是OS X,则可以docker-compose与Virtual Box VM一起使用;如果您使用的是Linux,则可以本机使用Docker。ssh无论您使用的是Windows还是OS X ,也始终可以通过登录到boot2docker(或另一个Docker主机VM)。

注意:您不应该通过SSH进入您的容器,但这是另一个主题。

截至2015年2月

docker-compose 我觉得自己比较敏捷,并且可以更有效地处理容器的启动,停止和重建。

Vagrant具有指定不同主机VM的优势,例如。每个项目,如果您喜欢这样的设置。

注意:还有一个Docker Provisioner,它与Puppet构建过程更相关。


Web服务器(例如Apache),数据库服务器(例如MySQL)和Web应用程序的每个部分是否应该有单独的Docker容器?

使用Docker容器时,您基本上是在运行单个隔离的进程。应该避免使用监督者,对于LAMP堆栈也不需要。

所以我的答案肯定是:是的,应该有单独的容器!


当我谈论Web应用程序的各个部分时,我的意思是诸如mysite.com,controlpanel.mysite.com等。

这取决于您的需求,我建议您阅读12factor应用程序文档,该文档以非常详细的方式描述了需要注意的重要事项。


Docker容器似乎被设计为可替换的,而不是我必须更新其中的软件。他们写的我不想丢失的数据又如何呢?

除了@Thomasleveil的答案外,我建议您还为用户上载提供单独的存储后端,例如Amazon S3,SFTP或WebDAV。

在我的观点中,应该将Web应用程序容器视为访问数据库和存储后端(服务)的客户端应用程序,并且在生产环境中运行时不要依赖卷中的数据。


使用Puppet为开发服务器和生产服务器创建和管理Docker容器是一个好主意吗?

我不了解Puppet的编排功能,但是对于构建容器,如果您使用的是Vagrant,由于Vagrant的本地Docker供应商,我不需要Puppet。


奖金

对于上述所有这些,您可以查看我的基于Yii 2.0 Framework的12因子PHP应用程序模板,该模板具有dockerized LAMP堆栈。 使用Docker,您还可以轻松地将反向代理或硒测试容器插入您的项目中,因为它们以预构建映像的形式存在,可以在几分钟内下载和配置,并在几秒钟内启动。

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.