首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker :如何对LAMP应用程序的多个实例进行文档化和部署

Docker :如何对LAMP应用程序的多个实例进行文档化和部署
EN

Stack Overflow用户
提问于 2014-07-24 08:31:48
回答 2查看 21.2K关注 0票数 52

我需要部署同一个LAMP (或LEMP)应用程序的许多实例:

  • 每个实例都可以从子域访问,使用前端负载平衡器/代理。
  • 每个实例都必须有自己的db数据和文件数据。
  • 每个实例都可能受到监视。
  • 每个应用程序实例可能设置内存限制/ cpu
  • 易于自动化地部署新的webapp实例
  • 环境可以很容易地重复用于测试和开发。

申请要求:

  • dameon过程(NginxMariaDBPHPFPM)
  • 二进制(composerbower,.)
  • 其他系统特定库&配置

在阅读了Docker文档和许多说明之后,我看到了不同的解决方案来将这个web应用程序:

解决方案1:使用全合一容器

所有堆栈都在一个容器中:

  • webapp源文件、EMP守护进程、二进制文件、…
  • mysql和webapp数据文件的挂载卷

示例:

  • Tutum为Wordpress应用程序:https://github.com/tutumcloud/tutum-docker-wordpress提供了一个全合一的容器。
  • Phusion为Docker提供了优化的基本映像,它在文档(process)中提供了以下内容: Docker在容器中的多个进程中运行良好。事实上,没有任何技术上的原因可以让你将自己限制在一个过程中。

Pros (IMHO):

  • 似乎很容易自动部署、监视、销毁…。。
  • 易于在prod,测试和开发环境中使用。

Cons (IMHO):

  • 单片
  • 难以缩放
  • 没有充分利用码头工人的力量

解决方案2:使用每个webapp实例的容器堆栈

对于要部署的每个webapp,将部署一个容器堆栈: :

  • 每个进程一个容器:NginxMysqlPHP-FPM
  • 二进制容器(composerbower,.)也可以进行坞化,或者合并到phpfpm容器中。
  • 安装mysql和webapp数据文件的卷

示例:

  • orchestror工具Gaudi提供了一个基于3个“守护进程”容器(nginx、mysql、phpfpm)和2个应用程序容器(composer,bower) (http://marmelab.com/blog/2014/06/04/demo-symfony-with-docker-and-gaudi.html)的LEMP体系结构的示例。

Pro (IMHO):

  • 解耦
  • 每个实例隔离的进程
  • 每个容器一个进程,不需要守护进程管理器作为RUnit或监督。

Cons (IMHO):

  • 做工作似乎更复杂
  • 很难维护,要看到所有容器状态、链接、版本的“大图”.

解决方案3:混合之前的两个解决方案

  • 一个包含: app src文件、nginx、phpfmp、composer、git的“app”容器。
  • 一个用于db mysql的容器,它可以与app容器共享也可以不共享。

我比行动组更有发展能力,这也让我很困惑。

So,问题:

  1. 在选择这些解决方案时,考虑的标准、利弊是什么?
  2. 如何管理所有容器堆栈如果我选择解决方案2,有一个所有容器状态,链接,版本的“大图片”.?
  3. App src文件(PHP)可以构建在容器中或作为卷挂载,例如。/var/www?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-06 20:08:17

我最近对这种设置的Docker进行了分析。我知道有些人认为Docker是一种MicroVM,但我的观点是,Docker哲学更倾向于每个容器的单个进程。这与编程中的单一责任原则密切相关。Docker容器做的越多,可重用性就越低,管理起来也就越困难。我把我所有的想法都张贴在这里:

http://software.danielwatrous.com/a-review-of-docker/

然后,我继续使用Docker构建一个LEMP堆栈。我没有发现将PHP和Nginx进程拆分到单独的Docker容器中有多大的价值,但是Web和数据库函数位于单独的容器中。我还展示了如何管理链接和卷共享,以避免在容器中运行SSH守护进程。你可以跟着我在这里做的作为一个参考点。

http://software.danielwatrous.com/use-docker-to-build-a-lemp-stack-buildfile/

关于每个容器的单个函数的复杂性增加的问题,您是正确的。它的外观和感觉就像您有不同的、分布的层。非常大的应用程序已经这样做多年了,当涉及到通信、安全和管理时,它确实增加了复杂性。当然,它也带来了许多好处。

票数 18
EN

Stack Overflow用户

发布于 2014-07-24 08:54:53

这两种解决办法都是可能的。但是,我会使用解决方案2--每个进程一个容器--因为它更符合Docker“哲学”。

Docker的好处是,您可以使用独立的构建块(单个应用程序的映像)创建应用程序堆栈(如您的应用程序堆栈)。您可以将这些构建块组合起来并重用它们。如果您查看official Docker registry,您将发现大多数组件都是预构建映像。例如,您将在https://registry.hub.docker.com/u/dockerfile/nginx找到一个Nginx,在/mysql找到一个MySQL数据库。因此,如果您选择每个进程/应用程序使用一个容器,则设置堆栈变得非常容易:

(注意,这只是一个例子,我不熟悉PHP之类的东西。)

获取你的图像:

代码语言:javascript
复制
docker pull mysql
docker pull dockerfile/nginx
docker pull tutum/apache-php

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
docker run -d -p 80:80 -v <sites-enabled-dir>:/etc/nginx/sites-enabled -v <log-dir>:/var/log/nginx dockerfile/nginx
docker run -d -p 80:80 tutum/apache-php

您可以像这样很容易地设置堆栈。如果你愿意的话,你可以改变一些单一的组件。例如,您可以使用MySQL更改MariaDB数据库,而无需接触其他组件。

关于这个解决方案,最复杂的事情是如何配置堆栈。要链接您的容器,请查看https://docs.docker.com/userguide/dockerlinks。您可以使用这种方法将应用程序容器与MySQL容器链接起来。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24928772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档