我需要部署同一个 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-wordpressPhusion
,它提供了为 Docker 优化的基础镜像,文档中的精确信息 (https://github.com/phusion/baseimage-docker#docker_single_process):Docker runs fine with multiple processes in a container. In fact, there is no technical reason why you should limit yourself to one process
优点(恕我直言):
- 似乎很容易自动化部署、监控、销毁……。
- 易于在生产、测试和开发环境中使用。
缺点(恕我直言):
- 单片
- 难以扩展
- 没有使用 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 进行了此类设置的分析。我知道有些人将 Docker 视为一种 MicroVM,但我认为 Docker 的理念更倾向于每个容器的单个进程。这与编程中的单一职责原则非常吻合。 Docker 容器做的越多,可重用性越低,管理起来就越困难。我在这里发表了我所有的想法:
http://software.danielwatrous.com/a-review-of-docker/
然后我继续使用 Docker 构建 LEMP 堆栈。我没有发现将 PHP 和 Nginx 进程拆分到单独的 Docker 容器中的值(value)不大,但是 Web 和数据库函数位于单独的容器中。我还展示了如何管理链接和卷共享以避免在容器中运行 SSH 守护程序。您可以按照我在此处所做的作为引用。
http://software.danielwatrous.com/use-docker-to-build-a-lemp-stack-buildfile/
关于每个容器的单个功能增加复杂性的观点,你是对的。它的外观和感觉就像您拥有不同的分布式层一样。大型应用程序多年来一直这样做,并且在通信、安全和管理方面确实增加了复杂性。当然,它也带来了许多好处。
关于web-applications - docker : How To Dockerize And Deploy multiple instances of a LAMP Application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24928772/