Docker: как выполнить Докеризацию и развертывание нескольких экземпляров приложения LAMP
мне нужно развернуть много экземпляров одного и того же приложения LAMP (или LEMP):
- каждый экземпляр будет доступен из поддомена с передним loadbalancer / proxy
- каждый экземпляр должен иметь свои собственные данные БД и файлы данных.
- каждый экземпляр может стать объектом
- предел памяти / cpu может быть установлен на экземпляр приложения
- простота автоматизации развертывания нового webapp пример
- окружающая среда может быть легко воспроизводимым для тестирования и разработки.
приложение требует :
- процессы dameon (
Nginx
,MariaDB
,PHPFPM
) - бинарники (
composer
,bower
, ...) - другие системы конкретные libs & config
после прочтения документации Docker и многих howtos я вижу различные решения для докеризации этого веб-приложения :
Решение 1: используйте контейнер "все-в-одном"
весь стек находится в одном контейнере:
- исходные файлы webapp, процессы демона EMP, двоичные файлы,...
- подключенные Тома на
mysql
и файлы данных webapp
примеры :
-
Tutum
предоставляет контейнер "все-в-одном" для приложения Wordpress : https://github.com/tutumcloud/tutum-docker-wordpress -
Phusion
, который обеспечивает базовое изображение, оптимизированное для Docker, уточняет в документации (https://github.com/phusion/baseimage-docker#docker_single_process) :Docker отлично работает с несколькими процессами в контейнере. Фактически, нет никаких технических причин, почему вы должны ограничивать себя одним процесс
плюсы (ИМХО) :
- кажется легко автоматизировать deploiement, контролировать, уничтожить....
- простота в использовании в среде prod, test и dev.
минусы (ИМХО):
- монолитно
- трудно масштабировать
- не использует всю силу Docker
решение 2: Используйте a стек контейнеров на экземпляр webapp
для каждого webapp для развертывания развертывается стек контейнеров:
- один контейнер в процесс:
Nginx
,Mysql
,PHP-FPM
, - Бинарные емкостей (
composer
,bower
,...) может быть также докеризован или объединен в контейнер phpfpm - монтировать тома для файлов данных mysql и webapp
примеры :
- в orchestror tool
Gaudi
предоставляет пример архитектуры LEMP, основанной на 3 контейнерах "daemon" (nginx, mysql, phpfpm) и 2 контейнерах приложений (composer, bower) (http://marmelab.com/blog/2014/06/04/demo-symfony-with-docker-and-gaudi.html)
Pro (ИМХО) :
- разъединенный
- процессы, изолированные на экземпляр
- один процесс в контейнер, отсутствие менеджера демона потребности как RUnit или Supervisord
минусы (ИМХО) :
- кажется более сложным сделать работу
- трудно поддерживать, чтобы увидеть "большую картину" всех состояний контейнеров, ссылок, версии...
решение 3. подмешать 2 предыдущие решения
- один контейнер "приложение" с : app src файлы, nginx, phpfmp, композитор, git..
- один контейнер для БД mysql, который может быть общим или не с контейнером приложения
я больше Dev, чем Ops, также это смущает меня.
Итак, Вопросы :
- каковы критерии, плюсы/минусы, чтобы рассмотреть при выборе между решениями тезисы?
- как управлять всеми стеками контейнеров если я выберу решение 2, чтобы иметь "большую картину" всех состояний контейнеров, ссылок, версии... ?
- App файлы src (PHP) могут быть встроены в контейнер или смонтированы как Том, например. в /var/ВСП ?
2 ответов
недавно я прошел анализ на Docker для этого типа настройки. Я знаю, что некоторые рассматривают Docker как своего рода Микровм, но я считаю, что философия Docker больше склоняется к одному процессу на контейнер. Это хорошо согласуется с принципом единой ответственности в программировании. Чем больше контейнер Docker делает, тем менее многоразовым и более сложным в управлении. Я выложил все свои мысли здесь:
http://software.danielwatrous.com/a-review-of-docker/
затем я продолжил создавать стек LEMP с помощью Docker. Я не нашел большого значения в разделении процессов PHP и Nginx на отдельные контейнеры Docker, но функции Web и Database находятся в отдельных контейнерах. Я также покажу, как управлять связыванием и общим объемом, чтобы избежать запуска демонов SSH в ваших контейнерах. Вы можете следить за тем, что я сделал здесь, как за точкой ссылка.
http://software.danielwatrous.com/use-docker-to-build-a-lemp-stack-buildfile/
к вашей точке об увеличении сложности для одной функции на контейнер вы правы. Это будет выглядеть и чувствовать себя так же, как у вас были четкие, распределенные уровни. Очень большие приложения делали это в течение многих лет, и это увеличивает сложность, когда дело доходит до связи, безопасности и управления. Конечно, это приносит ряд преимущества также.
оба варианта возможны. Однако я бы пошел с решением 2-один контейнер на процесс-так как он более совместим с "философией"Докера.
хорошая вещь о 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
вы можете настроить свой стек очень легко, как это. И, если вы хотите, вы можете изменить некоторые отдельные компоненты. Е. Г. вы можете изменить базу данных MySQL с MariaDB в не касаясь другого компонента.
самое сложное в этом решении-это настройка стека. Чтобы связать ваши контейнеры, взгляните наhttps://docs.docker.com/userguide/dockerlinks. Вы можете использовать этот подход, чтобы связать, например, ваш контейнер приложения с вашим контейнером MySQL.