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

Kor*_*nik 50 lamp web-applications web-deployment docker

我需要部署同一个LAMP(或LEMP)应用程序的许多实例:

  • 每个实例都可以通过前置loadbalancer/proxy从子域访问
  • 每个实例都必须有自己的db数据和文件数据.
  • 每个实例都可能受到监控
  • 每个应用程序实例可能设置内存限制/ CPU
  • 易于自动部署新的webapp实例
  • 环境可能很容易重现,可用于测试和开发.

申请要求:

  • dameon过程(Nginx,MariaDB,PHPFPM)
  • 二进制文件(composer,bower,...)
  • 其他系统特定的库和配置

在阅读了Docker文档和许多howtos之后,我看到了对这个Web应用程序进行docker化的不同解决方案:


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

所有堆栈都在一个容器中:

  • webapp源文件,EMP守护程序进程,二进制文件,...
  • 已安装的卷mysql和webapp数据文件

例子 :

优点(恕我直言):

  • 似乎很容易实现自动化,监控,摧毁.......
  • 易于在prod,test和dev环境中使用.

缺点(恕我直言):

  • 单片
  • 难以扩展
  • 不使用Docker的所有优势

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

对于要部署的每个webapp,部署了一个容器堆栈:

  • 每个进程的一个容器:Nginx,Mysql,PHP-FPM,
  • 二进制容器(composer,, bower...)也可以进行docker化,或者在phpfpm容器中合并
  • 装载mysql和webapp数据文件的卷

例子 :

(恕我直言):

  • 解耦
  • 每个实例隔离的进程
  • 每个容器一个进程,不需要守护程序管理器作为RUnit或Supervisord

缺点(恕我直言):

  • 看起来工作更复杂
  • 很难维护,看到所有容器状态,链接,版本的"大图"......

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

  • 一个"app"容器:app src文件,nginx,phpfmp,composer,git ..
  • db mysql的一个容器,可以与app容器共享或不共享

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

所以,问题:

  1. 在选择这些解决方案时,有哪些标准,优点/缺点
  2. 如果我选择解决方案2,如何管理所有容器堆栈,以获得所有容器状态,链接,版本......的"大图"?
  3. App src文件(PHP)可以在容器中构建,也可以作为卷安装,例如./ var/www?

Dan*_*ous 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/

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

  • @freethebees本教程有一些目的.一种是在多个VM上显示LEMP堆栈.另一个是演示Dockerfile.我对基础设施非常感兴趣,所以我选择了这种方法.如果您要开始生产我的产品,您可能会发现可用的图像更方便. (3认同)
  • 为什么选择使用ubuntu为FROM容器创建自己的容器而不是使用Docker提供的nginx和mysql容器?Docker会提供一些不简化的吗? (2认同)

Tho*_*rig 9

两种解决方案都是可能 但是,我会选择解决方案2 - 每个进程一个容器 - 因为它与Docker"哲学"更兼容.

Docker的优点在于,您可以创建具有独立构建块(单个应用程序的图像)的应用程序堆栈(如您的).您可以组合这些构建块并重用它们.如果您查看官方Docker注册表,您会发现大多数组件都是预构建映像.例如,你会发现Nginx的在https://registry.hub.docker.com/u/dockerfile/nginx和MySQL数据库https://registry.hub.docker.com/_/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
Run Code Online (Sandbox Code Playgroud)

您可以像这样轻松设置堆栈.而且,如果您愿意,可以更改一些单个组件.例如,您可以使用MariaDB更改MySQL数据库,而无需触及其他组件.

该解决方案最复杂的是如何配置堆栈.要链接您的容器,请查看https://docs.docker.com/userguide/dockerlinks.您可以使用此方法将您的应用程序容器与MySQL容器链接起来.

  • 我认为造船厂很难保持一个概述.但是,我认为它没有任何部署支持.你可以看一下无花果. (2认同)