Docker:如何 Dockerize 并部署 LAMP 应用程序的多个实例

2024-02-26

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

  • 每个实例都可以通过前端负载均衡器/代理从子域访问
  • 每个实例必须有自己的数据库数据和文件数据。
  • 每个实例都可能受到监视
  • 内存限制/CPU 可能会针对每个应用程序实例进行设置
  • 轻松自动部署新的 webapp 实例
  • 环境可以很容易地重现以进行测试和开发。

申请要求:

  • 守护进程(Nginx, MariaDB, PHPFPM)
  • 二进制文件(composer, bower, ...)
  • 其他系统特定的库和配置

在阅读了 Docker 文档和许多说明后,我看到了对此 Web 应用程序进行 docker 化的不同解决方案:


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

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

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

例子 :

  • Tutum为 Wordpress 应用程序提供一个一体化容器:https://github.com/tutumcloud/tutum-docker-wordpress https://github.com/tutumcloud/tutum-docker-wordpress
  • Phusion,它提供了针对 Docker 优化的基础镜像,在文档中有详细说明(https://github.com/phusion/baseimage-docker#docker_single_process https://github.com/phusion/baseimage-docker#docker_single_process) :

    Docker 在容器中的多个进程中运行良好。实际上, 没有任何技术原因让您应该将自己限制为一个 过程

Pros(恕我直言) :

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

Cons (IMHO):

  • 整体式
  • 难以扩展
  • 没有发挥 Docker 的全部力量

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

对于每个要部署的 Web 应用程序,都会部署一个容器堆栈:

  • 每个进程一个容器:Nginx, Mysql, PHP-FPM,
  • 二进制容器(composer, bower,...) 也可以进行 dockerized,或者合并到 phpfpm 容器中
  • mysql 和 webapp 数据文件的挂载卷

例子 :

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

Pro(恕我直言) :

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

Cons(恕我直言) :

  • 看起来工作比较复杂
  • 很难维护,很难看到所有容器状态、链接、版本的“大局”……

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

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

我更喜欢开发而不是运营,这对我来说也很困惑。

那么,问题:

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

我最近对 ​​Docker 进行了此类设置的分析。我知道有些人将 Docker 视为一种 MicroVM,但我的看法是 Docker 理念更倾向于每个容器单个进程。这很好地符合编程中的单一职责原则。 Docker 容器做的事情越多,可重用性就越差,管理起来就越困难。我在这里发表了我所有的想法:

http://software.danielwatrous.com/a-review-of-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/ http://software.danielwatrous.com/use-docker-to-build-a-lemp-stack-buildfile/

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker:如何 Dockerize 并部署 LAMP 应用程序的多个实例 的相关文章

随机推荐

  • 将流量从 80 转发到 8080 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经用puppet安装了tomcat 它在标准 8080 端口上运行 tomcat进程以tomcat用户身份启动 我想将所有流量从端口
  • iOS:使用HKObserverQuery的后台更新completionHandler

    HKObserverQuery有以下方法支持在后台接收更新 initWithSampleType predicate updateHandler The updateHandler has a completionHandler其中有以下内
  • 从 git 存储库中提取作者信息

    我正在尝试从 git 存储库中提取 源代码行 作者标签 对 最简单的方法是使用 git Blame 问题是 gitblame 将最后一个提交者视为作者 无论提交者只是缩进代码还是真正更改了代码 你知道有什么更好的方法吗 或者也许在尝试解决问
  • 将 WPF 用户控件选择传递给主机控件

    我有一个带有列表框的 WPF 用户控件 我想通过绑定将列表框中的选定项传递给调用控件 我怎样才能实现这个目标 您可以在用户控件上公开 SelectedItem 的新属性 并将其绑定到子控件 ListBox 用户控件的代码 不过我是从 Con
  • 自定义函数类

    我正在开发一个涉及从其他函数构造函数的项目 我有编写一个类来简化事情的想法 但如果不求助于使用我就无法让它工作 proto 这基本上就是我的愿景 function MyFunction var myFn new MyFunction myF
  • Express.js + lint 给出错误

    https www youtube com watch v Fa4cRMaTDUI https www youtube com watch v Fa4cRMaTDUI我正在观看这节课 并试图重现作者所做的一切 19 00 他设置了 vue
  • 特定模型的 Django 管理自定义模板

    我正在尝试在 Django 管理中为特定模型添加自定义模板 基本上我想在 Django admin 中显示地址模型的 Google 地图 那么对此有什么帮助吗 FineManual tm 对此进行了全面介绍 因此请先阅读此内容 检查这个网址
  • 将字段更改为ManyToMany时Django数据迁移

    我有一个 Django 应用程序 我想将字段从foreignkey更改为ManyToManyField 我想保留我的旧数据 为此 最简单 最好的流程是什么 如果重要的话 我使用 sqlite3 作为我的数据库后端 如果我对问题的总结不清楚
  • SQL/SQL-LITE - 过滤后计算记录

    假设我有一个客户表和一个销售订单表 其架构如下 客户 id 姓名 销售订单 id customer id sales representer 具有以下定义 id 是两个表中的主键 customer id 是外键引用客户 我想实现以下查询 F
  • Python 对 Windows 8 的支持 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 重用存储是否会开始新对象的生命周期? [复制]

    这个问题在这里已经有答案了 include
  • Rails:如何使用 before_save 更改基于另一个字段的字段值?

    我试图根据另一个布尔字段的值将一个布尔字段设置为 false 我使用 ActiveRecord 模型尝试了以下操作 before save reconcile xvent def reconcile xvent self xvent hoo
  • 网络错误:405 方法不允许 AngularJS REST

    在 AngularJS 中 我有以下功能 运行良好 http get fruits json success scope handleLoaded 现在我想将其从文件更改为 url 使用一些可爱的 Laravel 4 返回 json htt
  • 在 AngularJS 中,如何获取作为 URL 一部分的 ID?我正在使用 Restangular 与 REST API 进行通信

    我正在使用 Restangular 进行后端调用 只要 URL 提供如下所示的数据 一切都会正常工作 如果我打http mysite responses 回复看起来像 fname some guy lname some name dob 2
  • 如何访问 boost::spirit::karma 中嵌套对象的数据?

    In an ItemList包含列表Item对象 我如何访问Item生成器中的对象 以下示例代码在 VC9 上编译 适当设置了 boost 包含和链接目录 我不知道如何设置list generator item include
  • `y = x = x + 1;` 是未定义的行为吗?

    这段代码是 y x x 1 C 中未定义的行为 回答你的问题 No 会发生什么这将会发生 int x 1 ASSUME THIS IS SO y x x 1 Results y 2 x 2 它是如何编译的与以下相同 x 1 y x 为什么这
  • pch 上的 #import 是否会减慢编译时间?

    我正在读这个post http qualitycoding org import order 关于进口 我有一个问题 默认情况下 prefix pch 文件中的 import 是否会减慢编译时间 我应该删除它并仅在必要时导入吗 ifdef
  • 在 NestJS 中使用与 GraphQL 中的输入和对象类型相同的类

    我正在尝试设置我的 graphql resover 来处理对象数组 但无法配置 Args 装饰器 我创建了自己的 ArgsType import ArgsType Field Int ObjectType from nestjs graph
  • 从 github 中删除文件

    我已经在一个项目中使用 github 一段时间了 但是仅作为问题跟踪器 因此 今晚我也花了一些时间来处理代码 并犯了一个菜鸟错误 我提交了凭证文件和其他不必要的数据 我已将它们添加到 gitignore现在提交文件 它们应该不再是问题 但我
  • Docker:如何 Dockerize 并部署 LAMP 应用程序的多个实例

    我需要部署同一 LAMP 或 LEMP 应用程序的多个实例 每个实例都可以通过前端负载均衡器 代理从子域访问 每个实例必须有自己的数据库数据和文件数据 每个实例都可能受到监视 内存限制 CPU 可能会针对每个应用程序实例进行设置 轻松自动部