我需要部署许多相同的LAMP(或LEMP)应用程序实例:
- 每个实例将可从子域访问,并带有前端负载均衡器/代理
- 每个实例必须具有其自己的数据库数据和文件数据。
- 每个实例可能会被监视
- 每个应用程序实例可能会设置内存限制/ CPU
- 易于自动化部署新的webapp实例
- 环境可能很容易地复制以进行测试和开发。
应用程序要求:
- 守护进程(
Nginx
,MariaDB
,PHPFPM
) - 二进制文件(
composer
,bower
, ...) - 其他特定于系统的库和配置
阅读Docker文档和许多howtos后,我看到了不同的解决方案来构建这个Web应用程序的docker镜像:
解决方案1:使用一个全包容镜像
所有堆栈都在一个容器中:
- webapp源文件、EMP守护进程、二进制文件等
- 挂载的卷用于
mysql
和webapp数据文件
例如:
Tutum
为WordPress应用程序提供了一个全包容镜像:https://github.com/tutumcloud/tutum-docker-wordpressPhusion
,提供为Docker优化的基础映像,在文档中说明了(https://github.com/phusion/baseimage-docker#docker_single_process):Docker在容器中运行多个进程很好。事实上, 没有技术原因限制您只能运行一个进程
优点(在我看来):
- 似乎容易自动化部署、监控、销毁……
- 易于在生产、测试和开发环境中使用。
缺点(在我看来):
- 单体架构
- 难以扩展
- 没有充分利用 Docker 的所有优势
解决方案2:每个 Web 应用实例使用一个容器堆栈
为了部署每个 Web 应用,都会部署一个容器堆栈:
- 每个进程一个容器:
Nginx
,Mysql
,PHP-FPM
, - 二进制容器(
composer
,bower
等)也可以被dockerize,或者合并到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)
优点(在我看来):
- 解耦合的
- 每个实例隔离的进程
- 一个容器一个进程,不需要像RUnit或Supervisord这样的守护进程管理器
缺点(在我看来):
- 似乎更加复杂
- 难以维护,难以看到所有容器状态、链接、版本等的“大局”。
解决方案3:混合前两种解决方案
- 一个包含应用程序源文件、nginx、php-fpm、composer和git的“应用程序”容器。
- 一个包含MySQL数据库的容器,可以与应用程序容器共享或不共享。