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

在黑暗时代,我通常开发的LAMP Web应用程序是在我的机器上进行本地testing。 PHP(在我的情况下),数据库和Web服务器都是本地安装的。

服务器是使用标准安装的Apache和MySQL进行安装的,而且我有多个虚拟主机用于Web应用程序的不同部分。 当我对我在本地机器上得到的结果感到满意时,我将login到服务器,然后在暂存环境中进行git pull 。 假设服务器上的所有东西都和我的机器一样,我也会为生产做同样的事情。

新的开始…

所以现在我从头开始一个全新的Web应用程序,我想要“正确的方式”。 我已经读了Docker,Vagrant和Puppet(还有厨师,尽pipe我个人更喜欢Puppet的依赖系统而不是Chef的迭代过程)。 尽pipe我所做的所有研究,似乎仍然有几个问题,我似乎无法find答案:

是否应为Web服务器(如Apache),数据库服务器(如MySQL)和Web应用程序的每个部分分别安装Docker容器?

当我谈论Web应用程序的某些部分时,我指的是mysite.comcontrolpanel.mysite.com等等。这些“部分”将共享相同的数据库。

由于Docker似乎为Web和数据库服务器提供了现成的容器,所以至less应该将这些东西放在单独的容器中。 我的networking应用程序的不同部分应该在不同的容器中吗?

Docker容器似乎被devise成可replace的,而不是我必须更新里面的软件。 他们写的数据怎么样,我不想丢失?

数据库服务器将pipe理与我的数据库内容相关的文件(我将要备份)。 Web服务器将创build日志,我的Web应用程序将pipe理各种文件和caching等。所有这些文件都需要写在应用程序的容器之外(因为我可能在更新时replace它们),所以它们在哪里? 直接进入主机的文件系统? 或成为一个单独的“docker卷”? 如果他们进入Docker卷,我应该使用一个单独的卷为数据库,Web服务器,应用程序等? 我是否仍然可以像现在一样使用本地机器上的SFTP轻松访问内容? 我不想在这里失去任何便利!

使用Puppet创build和pipe理开发服务器和生产服务器的Docker容器是不是一个好主意?

看来Puppet支持直接pipe理Docker容器,所以这似乎是从头开始轻松设置服务器或生产环境(使用Vagrant)的相当好的方法。

希望我已经提出了一些相关的问题; 为了开发和生产类似LAMP的networking应用程序,获得一些适当的“最佳实践”将是非常好的,只是似乎没有多less我find的!

是否应为Web服务器(如Apache),数据库服务器(如MySQL)和Web应用程序的每个部分分别安装Docker容器?

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

docker中心提供准备去容器的PHP,数据库等,它很容易使用它们。 另一方面,你必须把它们联系起来,让它们互动。 对于开发环境,如果你使用多个容器,我会build议使用docker-compose 。

另一个path是build立一个最接近你的生产机器的docker图像(假设你只有一台机器),它将运行数据库,Web服务器和PHP。 一个容器从这样的图像将不得不运行多个进程。 这可以通过不同的方式来实现。 看一下主pipe或者phusion / baseimage 。

当我谈论Web应用程序的一部分时,我的意思是像mysite.com,controlpanel.mysite.com等

你可以让他们分开。 如果这些应用程序需要共享会话,请确保会话存储在数据库或所有人均可访问的泊坞窗上。

Docker容器似乎被devise成可replace的,而不是我必须更新里面的软件。 他们写的数据怎么样,我不想丢失?

Docker有一个叫做volume的东西,允许将数据写在容器外的文件系统上。 处理卷有多种不同的方式:可以将docker主机上的目录挂载到容器卷,也可以拥有数据卷容器或命名卷 。

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

如果您想轻松访问您的容器所使用的数据,则在Docker主机上安装一个目录是一种方法。

关于备份,请参阅docker用户指南 ,了解有关卷的所有知识。

使用Puppet创build和pipe理开发服务器和生产服务器的Docker容器是不是一个好主意?

最好的做法是像你在生产环境中一样操作你的开发环境。 如果所有工作都不会用于生产环境,那么为您的开发环境正确设置puppet就毫无意义了。 拥有一个为VM提供docker的Vagrantfile对于configuration shell来说非常简单, 恕我直言,木偶/厨师/ …是矫枉过正。


你在问正确的问题,但没有适合所有情况的答案。 在我看来,有两种方法可以做到这一点:

  • 使你的开发环境准确地复制你的生产环境
  • 使你的开发环境与生产不同,保持它简单直接,因此开发人员不会感觉到使用新工具引起的摩擦

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

stream浪者,木偶/厨师和docker工作者组成

当您使用Vagrantconfiguration虚拟机时 ,通常使用Puppet或Chef为您的服务器安装所需的软件包…以及一些shell脚本。 PuPHPet是configuration基于虚拟机的LAMP堆栈的一个很好的来源,并且学习Puppet和Vagrant如何在更复杂的设置中一起工作。 顺便说一句, Protobox是另一种select。

当你使用Vagrant使用Docker容器时 ,就像使用虚拟机一样。 然后,你实际上是在运行Docker 提供程序的Docker容器。 Vagrant会从Dockerfile为你build立容器,或者使用一个现成的图像,或多或less像docker-composefig )并运行它们。

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

如果你在OS X上,你可以使用docker-compose和一个Virtual Box VM,如果你在Linux上,你可以使用Docker。 通过sshlogin到boot2docker(或另一个Docker主机虚拟机)也是可以的,不pipe你是在Windows还是在OS X上。

注意:你不应该SSH进入你的容器,但这是另一个话题。

截至2015年2月

docker-compose对我来说感觉有点快,还能更有效地处理启动,停止和重build容器。

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

注意:还有一个与Puppet构build过程更相关的Docker置备程序。


是否应为Web服务器(如Apache),数据库服务器(如MySQL)和Web应用程序的每个部分分别安装Docker容器?

当使用Docker容器时,你基本上正在运行单独的,孤立的进程。 应该避免使用监督员,也不需要LAMP堆栈。

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


当我谈论Web应用程序的一部分时,我的意思是像mysite.com,controlpanel.mysite.com等

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


Docker容器似乎被devise成可replace的,而不是我必须更新里面的软件。 他们写的数据怎么样,我不想丢失?

除了@ Thomasleveil的回答,我build议你还有一个单独的存储后端用于用户上传,如Amazon S3,SFTP或WebDAV。

在我看来,您的Web应用程序容器应该像访问数据库和存储后端(服务)的客户端应用程序一样对待,并且在生产环境中运行时不依赖卷上的数据。


使用Puppet创build和pipe理开发服务器和生产服务器的Docker容器是不是一个好主意?

我不知道Puppet的编排function,但是对于构build容器,如果你使用的是Vagrant,我认为不需要Puppet,因为Vagrant的本地Docker供应商。


奖金

对于上面描述的所有内容,您可以看看我的基于Yii 2.0 Framework的12 因子PHP应用程序模板和一个dockerized LAMP堆栈。 使用Docker,您还可以轻松地将反向代理或seleniumtesting容器插入到您的项目中,因为它们以预构build映像的forms存在,并且可以在几分钟内下载并configuration,并在数秒内启动。