首页 文章

Docker:如何Dockerize和部署LAMP应用程序的多个实例

提问于
浏览
49

I need to deploy many instances of the same LAMP (or LEMP) application :

  • 每个实例都可以通过前置loadbalancer / proxy从子域访问

  • 每个实例必须拥有自己的db数据和文件数据 .

  • 可能会监视每个实例
    每个应用程序实例可能设置

  • 内存限制/ cpu

  • 易于自动部署新的webapp实例

  • 环境可能很容易重现,无法进行测试和开发 .

申请要求:

  • dameon进程( NginxMariaDBPHPFPM

  • 二进制文件( composerbower ,...)

  • 其他系统特定的库和配置

After reading Docker documentation and many howtos, I see different solutions to dockerize this web application :


解决方案1:使用一体化容器

All the stack is in one container :

  • webapp源文件,EMP守护程序进程,二进制文件,...

  • mysql 和webapp数据文件的已装入卷

Examples :

Docker可以在容器中运行多个进程 . 事实上,没有技术理由说明为什么要将自己限制在一个过程中

Pros (恕我直言):

  • 似乎很容易实现自动化,监控,摧毁.......

  • 易于在prod,test和dev环境中使用 .

Cons (恕我直言):

  • 单片

  • 难以扩展

  • 不使用Docker的所有优势


解决方案2:每个webapp实例使用一个容器堆栈

For each webapp to deploy, a containers stack is deployed :

  • 每个进程一个容器: NginxMysqlPHP-FPM

  • 二进制容器( composerbower ,...)也可以进行docker化,或者在phpfpm容器中合并

  • 安装mysql和webapp数据文件的卷

Examples :

Pro (恕我直言):

  • 解耦
    每个实例隔离

  • 个进程

  • 每个容器一个进程,不需要守护程序管理器作为RUnit或Supervisord

Cons (恕我直言):

  • 做起来似乎更复杂

  • 难以维护,看到所有容器状态,链接,版本的“大图”......


解决方案3:混合前两个解决方案

  • 一个“app”容器:app src文件,nginx,phpfmp,composer,git ..

  • db mysql的一个容器,可以与app容器共享或不共享


我比Ops更开发,也让我感到困惑 .

So, Questions :

  • What are the criteria, pros/cons to consider 何时选择这些解决方案?

  • Howto to manage all the containers stacks 如果我选择解决方案2,拥有"big picture"所有容器状态,链接,版本......?

  • App src文件(PHP)可以在容器中构建,也可以作为卷安装,例如 . / var / www?

2 回答

  • 17

    我最近对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/

    对于每个容器的单个函数增加 complexity ,你是正确的 . 它的外观和感觉就像你有不同的分布式层 . 非常大的应用程序已经做了多年,并且在通信,安全性和管理方面确实增加了复杂性 . 当然,它也带来了许多好处 .

  • 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容器的应用程序容器 .

相关问题