我需要部署同一个LAMP(或LEMP)应用程序的许多实例:
申请要求:
Nginx
,MariaDB
,PHPFPM
)composer
,bower
,...)在阅读了Docker文档和许多howtos之后,我看到了将此Web应用程序停靠的不同解决方案:
所有筹码都在一个容器中:
mysql
和webapp数据文件的卷示例:
Tutum
为Wordpress应用程序提供了一个多功能的容器:https://github.com/tutumcloud/tutum-docker-wordpress Phusion
,提供针对Docker优化的基本映像,在文档(https://github.com/phusion/baseimage-docker#docker_single_process)中进行了精确处理:
Docker可以在容器中运行多个进程。事实上, 没有技术理由可以限制自己 过程
优点(恕我直言):
缺点(恕我直言):
对于要部署的每个Web应用程序,都会部署容器堆栈:
Nginx
,Mysql
,PHP-FPM
,composer
,bower
,...)也可以泊坞化,或者在phpfpm容器中合并示例:
Gaudi
提供了一个基于3个“守护进程”容器(nginx,mysql,phpfpm)和2个app容器(composer,bower)的LEMP架构示例
(http://marmelab.com/blog/2014/06/04/demo-symfony-with-docker-and-gaudi.html)专业(恕我直言):
缺点(恕我直言):
我比Ops更多Dev,也让我感到困惑。
所以,问题:
答案 0 :(得分:18)
我最近对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/
对于每个容器的单个函数增加复杂度的观点,您是对的。它的外观和感觉就像你有不同的分布式层。非常大的应用程序已经做了多年,并且在通信,安全性和管理方面确实增加了复杂性。当然,它也带来了许多好处。
答案 1 :(得分:9)
两种解决方案都是可行的。但是,我会选择解决方案2 - 每个进程一个容器 - 因为它更兼容Docker"哲学"。
Docker的优点在于,您可以创建具有独立构建块(单个应用程序的图像)的应用程序堆栈(与您的一样)。您可以组合这些构建块并重用它们。如果您查看official Docker registry,您会发现大多数组件都是预构建映像。例如。你会在https://registry.hub.docker.com/u/dockerfile/nginx找到一个Nginx,在https://registry.hub.docker.com/_/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
您可以像这样轻松设置堆栈。而且,如果您愿意,可以更改一些单个组件。例如。您可以使用MariaDB更改MySQL数据库,而无需触及其他组件。
该解决方案最复杂的是如何配置堆栈。要关联容器,请查看https://docs.docker.com/userguide/dockerlinks。您可以使用此方法链接,例如你的MySQL容器的应用程序容器。