【问题标题】:How can I develop a LAMP web application using Docker, Puppet and Vagrant?如何使用 Docker、Puppet 和 Vagrant 开发 LAMP Web 应用程序?
【发布时间】:2014-11-26 04:21:55
【问题描述】:

在黑暗时代,我开发 LAMP Web 应用程序的常用设置是在我的机器上进行本地测试。 PHP(在我的例子中)、数据库和网络服务器都是本地安装的。

服务器设置了 Apache 和 MySQL 的标准安装,我有多个虚拟主机用于 Web 应用程序的不同部分。当我对本地计算机上的结果感到满意时,我登录到服务器并在暂存环境中执行git pull

假设服务器上的一切都和我的机器上一样好,我会为生产做同样的事情。

新的开始……

所以现在我要从头开始一个全新的 Web 应用程序,我想以“正确的方式”来做。我已经阅读了有关 Docker、Vagrant 和 Puppet 的信息(以及 Chef,尽管我个人更喜欢 Puppet 的依赖系统而不是 Chef 的迭代过程)。尽管我已经完成了所有研究,但似乎仍有几个问题我似乎无法找到答案:

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

当我谈到网络应用程序的部分时,我指的是 mysite.comcontrolpanel.mysite.com 等。这些“部分”将共享同一个数据库。

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

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

数据库服务器将管理与我的数据库内容相关的文件(我将要备份)。 Web 服务器将创建日志,我的 Web 应用程序将管理各种文件和缓存等。所有这些文件都需要在应用程序的容器之外编写(因为我可能会在更新时替换它们?),那么它们去哪里了?直接进入主机的文件系统?还是放到一个单独的“Docker Volume”中?

如果它们进入 Docker 卷,我应该为数据库、Web 服务器、应用程序等使用单独的卷吗?我还能像现在一样在本地机器上使用SFTP 轻松访问内容吗?我不想在这里失去任何便利!

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

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

希望我已经提出了一些相关问题;如果能获得一些适当的“最佳实践”来开发和生产类似 LAMP 的 Web 应用程序,那就太好了。只是我发现的似乎并不多!

【问题讨论】:

    标签: web-applications vagrant docker puppet lamp


    【解决方案1】:

    是否应该为 Web 服务器(如 Apache)、数据库服务器(如 MySQL)和 Web 应用程序的各个部分提供单独的 Docker 容器?

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

    Docker Hub 为 PHP、数据库等提供了现成的容器,并且易于使用。另一方面,您必须将它们链接在一起以允许它们进行交互。对于开发环境,如果您使用多个容器,我建议使用docker-compose

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

    当我谈到 Web 应用程序的某些部分时,我指的是 mysite.com、controlpanel.mysite.com 等。

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

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

    Docker 有一个叫做卷的东西,它允许将数据写入容器外的文件系统。使用卷有多种方式:您可以将 mount a directory from the Docker host 用于容器卷,也可以使用 data volume containersnamed volumes

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

    如果您想从 Docker 主机轻松访问容器使用的数据,在 Docker 主机上挂载一个目录是您的最佳选择。尽管文件的权限和所有权可能很棘手。

    关于备份,请查看Docker user guide,其中详细介绍了您需要了解的有关卷的所有信息。

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

    最佳做法是在您的开发环境中操作,就像您在生产环境中操作一样。如果所有工作都不会用于生产环境,那么为您的开发环境正确设置 Puppet 是没有意义的。只需 shell provisioning 就可以轻松拥有 Vagrantfile that provision a VM with Docker ;恕我直言,傀儡/厨师/...是矫枉过正。


    您提出了正确的问题,但没有适合所有情况的答案。在我看来,有两种方法可以做:

    • 让您的开发环境完全复制您的生产环境
    • 让您的开发环境与生产环境不同,尽可能保持简单明了,这样开发人员就不会因为使用新工具而感到摩擦

    【讨论】:

    • 谢谢,这是一个很好的答案!
    【解决方案2】:

    虽然answer of Thomasleveil 已经非常好并且涵盖了所有重要部分,但我想补充几点。

    Vagrant、Puppet/Chef 和 docker-compose

    当您使用 Vagrant 配置 虚拟机 时,您通常使用 Puppet 或 Chef 为您的服务器安装所需的软件包......以及一些 shell 脚本。 PuPHPet 是配置基于虚拟机的 LAMP 堆栈 并了解 Puppet 和 Vagrant 如何在更复杂的设置中协同工作的绝佳资源。顺便说一句,另一种选择是Protobox

    当您将 Docker 容器 与 Vagrant 一起使用时,就像使用虚拟机一样。然后使用vagrant up,您实际上是在使用 Docker provider 运行 Docker 容器。 Vagrant 会从 Dockerfile 为您构建容器或使用现有的镜像,或多或少类似于 docker-compose (fig) 并运行它们。

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

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

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

    截至 2015 年 2 月

    docker-compose 对我来说感觉有点快,并且可以更有效地处理启动、停止和重建容器。

    如果您喜欢这样的设置,Vagrant 的优势在于可以指定不同的主机虚拟机,例如,每个项目。

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


    是否应该为 Web 服务器(如 Apache)、数据库服务器(如 MySQL)和 Web 应用程序的各个部分提供单独的 Docker 容器?

    使用 Docker 容器时,您基本上是在运行单个、隔离的进程。主管 should be avoided) 的使用,LAMP 堆栈也不需要。

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


    当我谈到 Web 应用程序的某些部分时,我指的是 mysite.com、controlpanel.mysite.com 等。

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


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

    除了@Thomasleveil 的回答,我还建议您为Amazon S3SFTPWebDAV 等用户上传设置单独的存储后端。

    在我看来,您的 Web 应用程序容器应被视为客户端应用程序,访问您的数据库和存储后端(服务),而不是在生产环境中运行时依赖卷中的数据。


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

    我不知道 Puppet 的编排功能,但是对于构建容器,如果您使用 Vagrant,我认为不需要 Puppet,因为 Vagrant 的本地 Docker 配置器。


    奖金

    对于上述所有内容,您可以查看我的 12factor PHP application template,它基于带有 dockerized LAMP 堆栈的 Yii 2.0 框架。 使用 Docker,您还可以轻松地将反向代理或 selenium 测试容器插入到您的项目中,因为它们作为预构建映像存在,可以在几分钟内下载和配置,并在几秒钟内启动。

    【讨论】:

    • Re “当你使用带有 Vagrant 的 Docker 容器时,就像使用 VM 一样。”:似乎缺少了一些东西。你的意思是“当你在 Vagrant 中使用 Docker 容器时,你使用它的方式与使用 VM 相同。”(加上 “,你使用它”)?
    • 我的意思是:像vagrant up这样的控制命令是一样的。但我从来没有真正使用过它。
    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2018-12-15
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多