我需要部署同一 LAMP(或 LEMP)应用程序的多个实例:
- 每个实例都可以通过前端负载均衡器/代理从子域访问
- 每个实例必须有自己的数据库数据和文件数据。
- 每个实例都可能受到监视
- 内存限制/CPU 可能会针对每个应用程序实例进行设置
- 轻松自动部署新的 webapp 实例
- 环境可以很容易地重现以进行测试和开发。
申请要求:
- 守护进程(
Nginx
, MariaDB
, PHPFPM
)
- 二进制文件(
composer
, bower
, ...)
- 其他系统特定的库和配置
在阅读了 Docker 文档和许多说明后,我看到了对此 Web 应用程序进行 docker 化的不同解决方案:
解决方案 1:使用一体式容器
所有堆栈都在一个容器中:
- webapp 源文件、EMP 守护进程、二进制文件……
- 已安装的卷
mysql
和 webapp 数据文件
例子 :
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 容器共享也可以不共享
我更喜欢开发而不是运营,这对我来说也很困惑。
那么,问题:
-
需要考虑的标准、优点/缺点是什么在这些解决方案之间进行选择时?
-
如何管理所有容器堆栈如果我选择解决方案 2,以获得所有容器状态、链接、版本的“大局”...?
- 应用程序 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(使用前将#替换为@)