【问题标题】:Docker : How To Dockerize And Deploy multiple instances of a LAMP ApplicationDocker:如何 Dockerize 和部署 LAMP 应用程序的多个实例
【发布时间】:2014-09-15 17:12:25
【问题描述】:

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

  • 每个实例都可以从一个子域访问,带有前端负载均衡器/代理
  • 每个实例都必须有自己的数据库数据和文件数据。
  • 每个实例都可能被监控
  • 可能会为每个应用实例设置内存限制/cpu
  • 轻松自动部署新的 webapp 实例
  • 环境可能易于重现以进行测试和开发。

申请要求:

  • dameon 进程(NginxMariaDBPHPFPM
  • 二进制文件 (composer, bower, ...)
  • 其他系统特定的库和配置

在阅读了 Docker 文档和许多操作指南后,我看到了 dockerize 这个 Web 应用程序的不同解决方案:


解决方案 1:使用一体式容器

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

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

示例:

优点(恕我直言):

  • 似乎很容易实现自动化部署、监控、销毁……。
  • 易于在生产、测试​​和开发环境中使用。

缺点(恕我直言):

  • 单片
  • 难以扩展
  • 没有使用 Docker 的全部力量

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

为每个要部署的 webapp 部署一个容器堆栈:

  • 每个进程一个容器:NginxMysqlPHP-FPM
  • 二进制容器(composerbower、...)也可以 docker 化,或合并到 phpfpm 容器中
  • 为 mysql 和 webapp 数据文件装载卷

示例:

专业版(恕我直言):

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

缺点(恕我直言):

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

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

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

我更多的是 Dev 而不是 Ops,这对我来说也很困惑。

所以,问题:

  1. 在这些解决方案之间进行选择时,需要考虑哪些标准和优缺点
  2. 如果我选择解决方案 2,如何管理所有容器堆栈,以了解所有容器状态、链接、版本...的“大图”...?
  3. App src 文件 (PHP) 可能构建在容器中或作为卷安装,例如。 /var/www ?

【问题讨论】:

  • 在单个容器中运行多个进程也具有安全隐患。请参阅 Docker 团队/CIS 的 security recommendations 列表(有些过时)。

标签: web-applications web-deployment lamp docker


【解决方案1】:

我最近对 ​​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/

关于每个容器的单个功能增加复杂性的观点,你是对的。它的外观和感觉就像您拥有不同的分布式层一样。大型应用程序多年来一直这样做,并且在通信、安全和管理方面确实增加了复杂性。当然,它也带来了许多好处。

【讨论】:

  • 为什么FROM容器选择使用ubuntu创建自己的容器,而不是使用Docker提供的nginx和mysql容器? Docker 提供的会不会更加精简?
  • @freethebees 本教程有几个目的。一个是展示跨多个虚拟机的 LEMP 堆栈。另一个是演示 Dockerfile。我对基础设施即代码非常感兴趣,所以我选择了这种方法。如果您要将我开始的内容生产化,您可能会发现可用的图像更方便。
【解决方案2】:

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

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

(注意,这只是一个例子,我对PHP和其他东西并不熟悉......)

获取图片:

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

您可以像这样非常轻松地设置堆栈。而且,如果您愿意,您可以更改一些单个组件。例如。您可以使用 MariaDB 更改 MySQL 数据库,而无需触及其他组件。

该解决方案最复杂的是如何配置您的堆栈。要链接您的容器,请查看https://docs.docker.com/userguide/dockerlinks。您可以使用这种方法来链接,例如你的应用程序容器和你的 MySQL 容器。

【讨论】:

  • 感谢您的回复。我完全同意解决方案 2 更符合 docker 哲学。但主要缺点(恕我直言)是保持所有容器状态和链接的“大图”。我试过 Shipyard 和 Gaudi,但我不知道是否有更好的方法。
  • 我认为造船厂保持概览很酷。但是,我认为它没有任何部署支持。你可以看看图。
猜你喜欢
  • 2013-01-14
  • 2021-01-01
  • 2012-05-06
  • 2014-09-16
  • 2019-12-25
  • 2019-09-14
  • 2013-08-05
  • 2016-12-23
  • 2011-12-14
相关资源
最近更新 更多