我需要部署同一个LAMP (或LEMP)应用程序的许多实例:
申请要求:
Nginx,MariaDB,PHPFPM)composer,bower,.)在阅读了Docker文档和许多说明之后,我看到了不同的解决方案来将这个web应用程序:
解决方案1:使用全合一容器
所有堆栈都在一个容器中:
mysql和webapp数据文件的挂载卷示例:
Tutum为Wordpress应用程序:https://github.com/tutumcloud/tutum-docker-wordpress提供了一个全合一的容器。Phusion为Docker提供了优化的基本映像,它在文档(process)中提供了以下内容:
Docker在容器中的多个进程中运行良好。事实上,没有任何技术上的原因可以让你将自己限制在一个过程中。Pros (IMHO):
Cons (IMHO):
解决方案2:使用每个webapp实例的容器堆栈
对于要部署的每个webapp,将部署一个容器堆栈: :。
Nginx、Mysql、PHP-FPM、composer,bower,.)也可以进行坞化,或者合并到phpfpm容器中。示例:
Gaudi提供了一个基于3个“守护进程”容器(nginx、mysql、phpfpm)和2个应用程序容器(composer,bower) (http://marmelab.com/blog/2014/06/04/demo-symfony-with-docker-and-gaudi.html)的LEMP体系结构的示例。Pro (IMHO):
Cons (IMHO):
解决方案3:混合之前的两个解决方案
我比行动组更有发展能力,这也让我很困惑。
So,问题:
发布于 2014-08-06 20:08:17
我最近对这种设置的Docker进行了分析。我知道有些人认为Docker是一种MicroVM,但我的观点是,Docker哲学更倾向于每个容器的单个进程。这与编程中的单一责任原则密切相关。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/
关于每个容器的单个函数的复杂性增加的问题,您是正确的。它的外观和感觉就像您有不同的、分布的层。非常大的应用程序已经这样做多年了,当涉及到通信、安全和管理时,它确实增加了复杂性。当然,它也带来了许多好处。
发布于 2014-07-24 08:54:53
这两种解决办法都是可能的。但是,我会使用解决方案2--每个进程一个容器--因为它更符合Docker“哲学”。
Docker的好处是,您可以使用独立的构建块(单个应用程序的映像)创建应用程序堆栈(如您的应用程序堆栈)。您可以将这些构建块组合起来并重用它们。如果您查看official Docker registry,您将发现大多数组件都是预构建映像。例如,您将在https://registry.hub.docker.com/u/dockerfile/nginx找到一个Nginx,在/mysql找到一个MySQL数据库。因此,如果您选择每个进程/应用程序使用一个容器,则设置堆栈变得非常容易:
(注意,这只是一个例子,我不熟悉PHP之类的东西。)
获取你的图像:
docker pull mysql
docker pull dockerfile/nginx
docker pull tutum/apache-php
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
docker run -d -p 80:80 -v <sites-enabled-dir>:/etc/nginx/sites-enabled -v <log-dir>:/var/log/nginx dockerfile/nginx
docker run -d -p 80:80 tutum/apache-php您可以像这样很容易地设置堆栈。如果你愿意的话,你可以改变一些单一的组件。例如,您可以使用MySQL更改MariaDB数据库,而无需接触其他组件。
关于这个解决方案,最复杂的事情是如何配置堆栈。要链接您的容器,请查看https://docs.docker.com/userguide/dockerlinks。您可以使用这种方法将应用程序容器与MySQL容器链接起来。
https://stackoverflow.com/questions/24928772
复制相似问题