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

примеры :

Pro (ИМХО) :

  • разъединенный
  • процессы, изолированные на экземпляр
  • один процесс в контейнер, отсутствие менеджера демона потребности как RUnit или Supervisord

минусы (ИМХО) :

  • кажется более сложным сделать работу
  • трудно поддерживать, чтобы увидеть "большую картину" всех состояний контейнеров, ссылок, версии...

решение 3. подмешать 2 предыдущие решения

  • один контейнер "приложение" с : app src файлы, nginx, phpfmp, композитор, git..
  • один контейнер для БД mysql, который может быть общим или не с контейнером приложения

я больше Dev, чем Ops, также это смущает меня.

Итак, Вопросы :

  1. каковы критерии, плюсы/минусы, чтобы рассмотреть при выборе между решениями тезисы?
  2. как управлять всеми стеками контейнеров если я выберу решение 2, чтобы иметь "большую картину" всех состояний контейнеров, ссылок, версии... ?
  3. 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.