【发布时间】:2014-09-15 17:12:25
【问题描述】:
我需要部署同一个 LAMP(或 LEMP)应用程序的多个实例:
- 每个实例都可以从一个子域访问,带有前端负载均衡器/代理
- 每个实例都必须有自己的数据库数据和文件数据。
- 每个实例都可能被监控
- 可能会为每个应用实例设置内存限制/cpu
- 轻松自动部署新的 webapp 实例
- 环境可能易于重现以进行测试和开发。
申请要求:
- dameon 进程(
Nginx、MariaDB、PHPFPM) - 二进制文件 (
composer,bower, ...) - 其他系统特定的库和配置
在阅读了 Docker 文档和许多操作指南后,我看到了 dockerize 这个 Web 应用程序的不同解决方案:
解决方案 1:使用一体式容器
所有堆栈都在一个容器中:
- webapp 源文件、EMP 守护进程、二进制文件……
- 为
mysql和 webapp 数据文件装载的卷
示例:
-
Tutum为 Wordpress 应用程序提供一体化容器:https://github.com/tutumcloud/tutum-docker-wordpress -
Phusion,提供针对 Docker 优化的基础镜像,文档中的精确信息 (https://github.com/phusion/baseimage-docker#docker_single_process):Docker 在一个容器中运行多个进程时运行良好。实际上, 没有技术上的理由让你将自己限制在一个 进程
优点(恕我直言):
- 似乎很容易实现自动化部署、监控、销毁……。
- 易于在生产、测试和开发环境中使用。
缺点(恕我直言):
- 单片
- 难以扩展
- 没有使用 Docker 的全部力量
解决方案 2:每个 webapp 实例使用一个容器堆栈
为每个要部署的 webapp 部署一个容器堆栈:
- 每个进程一个容器:
Nginx,Mysql,PHP-FPM, - 二进制容器(
composer、bower、...)也可以 docker 化,或合并到 phpfpm 容器中 - 为 mysql 和 webapp 数据文件装载卷
示例:
- orchestror 工具
Gaudi提供了一个基于 3 个“守护程序”容器(nginx、mysql、phpfpm)和 2 个应用程序容器(composer、bower)的 LEMP 架构示例 (http://marmelab.com/blog/2014/06/04/demo-symfony-with-docker-and-gaudi.html)
专业版(恕我直言):
- 解耦
- 每个实例隔离的进程
- 每个容器一个进程,不需要守护进程管理器作为 RUnit 或 主管
缺点(恕我直言):
- 工作似乎更复杂
- 很难维护,要查看所有容器状态、链接、版本的“大图”...
解决方案 3:混合之前的 2 个解决方案
- 一个“app”容器,包含:app src 文件、nginx、phpfmp、composer、git..
- db mysql 的一个容器,可以与应用容器共享或不共享
我更多的是 Dev 而不是 Ops,这对我来说也很困惑。
所以,问题:
- 在这些解决方案之间进行选择时,需要考虑哪些标准和优缺点?
- 如果我选择解决方案 2,如何管理所有容器堆栈,以了解所有容器状态、链接、版本...的“大图”...?
- App src 文件 (PHP) 可能构建在容器中或作为卷安装,例如。 /var/www ?
【问题讨论】:
-
在单个容器中运行多个进程也具有安全隐患。请参阅 Docker 团队/CIS 的 security recommendations 列表(有些过时)。
标签: web-applications web-deployment lamp docker