Мне нужно развернуть многие экземпляры одного и того же приложения LAMP (или LEMP):
- каждый экземпляр будет доступен из субдомена, с фронтальным loadbalancer/proxy
- каждый экземпляр должен иметь свои данные и данные данных db.
- каждый экземпляр может отслеживаться
- ограничение памяти /cpu может быть установлено для каждого экземпляра приложения
- легко автоматизировать развертывание нового экземпляра webapp
- среда может быть легко воспроизведена для тестирования и разработки.
Приложение требует:
- процессы dameon (
Nginx
,MariaDB
,PHPFPM
) - двоичные файлы (
composer
,bower
,...) - другие системы, специфичные для libs и config
После прочтения документации Docker и многих способов, я вижу разные решения для докеретизации этого веб-приложения:
Решение 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):Докер работает отлично с несколькими процессами в контейнере. По факту, нет никакой технической причины, почему вы должны ограничиться одним Процесс
Профи (IMHO):
- Кажется, легко автоматизировать deploiement, контролировать, уничтожать....
- Простота использования в среде prod, test и dev.
Против (IMHO):
- Монолитные
- Трудно масштабировать
- Не использует всю силу Docker
Решение 2: Использовать стек контейнеров для экземпляра webapp
Для каждого развертывания webapp развертывается стек контейнеров:
- Один контейнер для процесса:
Nginx
,mysql
,PHP-FPM
, - Двоичные контейнеры (
composer
,bower
,...) также могут быть задокументированы или объединены в контейнер phpfpm - тома монтирования для файлов данных mysql и webapp
Примеры:
- инструмент оркестровки
Gaudi
предоставляет пример с архитектурой LEMP на основе 3-дюймовых контейнеров (nginx, mysql, phpfpm) и 2 контейнеров приложений (композитор, беседка) (http://marmelab.com/blog/2014/06/04/demo-symfony-with-docker-and-gaudi.html)
Pro (IMHO):
- отсоединенных
- процессы изолированы на каждый экземпляр
- Один процесс в контейнере, не нужен диспетчер демонов как RUnit или Supervisord
Против (IMHO):
- Сложнее работать
- Трудно поддерживать, видеть "общую картину" всех состояний контейнеров, ссылок, версий...
Решение 3. Смешайте два предыдущих решения
- Один контейнер приложения с файлами приложения src, nginx, phpfmp, composer, git..
- Один контейнер для db mysql, который может быть общим или нет с контейнером приложения
Я больше Dev, чем Ops, и это смутило меня.
Итак, вопросы:
- Каковы критерии, плюсы и минусы для рассмотрения при выборе между этими решениями?
- Как управлять всеми стеками контейнеров, если я выберу решение 2, чтобы иметь "общую картину" всех состояний контейнеров, ссылок, версии...?
- Файлы приложения src (PHP) могут быть созданы в контейнере или установлены как тома, например. /var/www?