Как разработать веб-приложение LAMP с помощью Docker, Puppet и Vagrant?

В темные века моя обычная настройка для создания веб-приложений LAMP заключалась в локальном тестировании на моей машине. PHP (в моем случае), база данных и веб-сервер были установлены изначально.

Сервер был настроен со стандартными установками Apache и MySQL, и у меня было несколько виртуальных хостов для разных частей веб-приложения. Когда я был доволен результатами, полученными на моем локальном компьютере, я зашел на сервер и git pull в промежуточную среду. Предполагая, что все работает на сервере, как это было на моей машине, я бы сделал то же самое для производства.

Новые начинания...

Итак, теперь я начинаю новое веб-приложение с нуля, и я хочу сделать это "правильно". Я читал о докерах, бродяжниках и куклах (и шеф-повара, хотя я лично предпочитаю систему кукольных игр, а не итеративный процесс Chef). Несмотря на все проведенные мной исследования, все еще есть несколько вопросов, на которые я не могу найти ответы:

Должны ли быть отдельные контейнеры Docker для веб-сервера (например, Apache), сервера базы данных (например, MySQL) и каждой части веб-приложения?

Когда я говорю о частях веб-приложения, я имею в виду такие вещи, как mysite.com, controlpanel.mysite.com и т.д. Эти "части" будут использовать одну и ту же базу данных.

Поскольку Docker, похоже, предлагает готовые контейнеры для таких вещей, как веб-серверы и серверы баз данных, похоже, что эти вещи, по крайней мере, должны быть в отдельных контейнерах. Должны ли разные части моего веб-приложения также находиться в отдельных контейнерах?

Контейнеры для докеров, похоже, предназначены для замены, а не для обновления программного обеспечения внутри них. Как насчет данных, которые они пишут, что я не хочу потерять?

Сервер базы данных будет управлять файлами, связанными с содержимым моей базы данных (что я хочу создать резервную копию). Веб-сервер будет создавать журналы, и мои веб-приложения будут управлять различными файлами и кэшами и т.д. Все эти файлы должны быть написаны за пределами контейнеров приложений (потому что я могу их заменить при обновлении?), Поэтому, куда они идут? Прямо в файловую систему хост-машин? Или в отдельный "объем докеров"? Если они входят в объемы докеров, я должен использовать отдельный том для базы данных, веб-сервера, приложения и т.д.? Могу ли я получить доступ к содержимому с помощью SFTP с моей локальной машины, как сейчас? Я не хочу потерять удобство здесь!

Полезно ли использовать Puppet для создания и управления контейнерами Docker как для сервера разработки, так и для производственного сервера?

Кажется, что Puppet поддерживает управление контейнерами Docker напрямую, поэтому это похоже на разумно хороший способ легко настроить сервер или производственную среду (используя Vagrant) с нуля.

Надеюсь, я задал несколько важных вопросов; было бы здорово получить некоторые надлежащие "лучшие практики" для разработки и производства LAMP-подобных веб-приложений, но, похоже, это не так много, что я нашел!

Ответ 1

Должны ли быть отдельные контейнеры Docker для веб-сервера (например, Apache), сервера базы данных (например, MySQL) и каждой части веб-приложения?

Нет правильного ответа на этот вопрос. Если вы будете использовать докер в производстве, попробуйте запустить ваши контейнеры докеров в своей среде разработки, так как они будут в производстве. Else просто используйте контейнеры докеров самым простым способом.

Консоль докеры предоставляет готовые контейнеры для php, баз данных и т.д., и их легко использовать. С другой стороны, вам нужно связать их вместе, чтобы они могли взаимодействовать. Для среды dev и если вы используете несколько контейнеров, я бы посоветовал использовать docker-compose.

Другой путь - создать образ докеры, наиболее близкий к вашей производственной машине (при условии, что у вас есть только одна машина), которая будет запускать базу данных, веб-сервер и php. Контейнер из такого образа должен запускать несколько процессов. Это может быть достигнуто по-разному. Взгляните на supervisor или phusion/baseimage.

Когда я говорю о частях веб-приложения, я имею в виду такие вещи, как mysite.com, controlpanel.mysite.com и т.д.

Вы могли бы разделить их. Если этим приложениям необходимо обмениваться сеансами, убедитесь, что сеансы хранятся в базе данных или на томе докеров, доступном для всех.

Контейнеры-докеры, по-видимому, предназначены для замены, а не для обновления программного обеспечения внутри них. Как насчет данных, которые они пишут, что я не хочу потерять?

Докер имеет вещь под названием volume, позволяющую записывать данные из файловой системы из контейнера. Существуют разные способы работы с томами: вы можете монтировать каталог с хоста docker в объем контейнера, или вы можете иметь контейнеры объема данных или именованные тома.

Объемы докеров являются важной концепцией, и стоит потратить время на их освоение.

Если вы хотите легко получить доступ к данным, используемым в ваших контейнерах, то можно создать каталог на хосте docker.

Что касается резервных копий, ознакомьтесь с руководством пользователя docker, где подробно описано все, что вам нужно знать в отношении томов.

Хорошо ли использовать Puppet для создания и управления контейнерами Docker как для сервера разработки, так и для производственного сервера?

Лучшей практикой является работа в среде вашего разработчика так же, как и в вашей производственной среде. Нет смысла правильно настраивать марионетку для вашей среды разработчиков, если все эти работы не будут использоваться для производственной среды. Имея Vagrantfile, который предоставляет виртуальную машину с докером, очень просто с помощью оболочки; ИМХО марионетка/шеф-повар/... переполнены.


Вы задаете правильные вопросы, но нет ответа, который бы отвечал всем ситуациям. На мой взгляд, есть два способа сделать что-то:

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

Ответ 2

В то время как ответ @Thomasleveil уже очень хорош и охватывает все важные части, я хотел бы добавить дополнительные моменты.

Бродяга, Кукольный/Шеф-повар и докер-сочинитель

Когда вы создаете виртуальную машину с помощью Vagrant, вы обычно используете Puppet или Chef для установки необходимых пакетов для вашего сервера... наряду с несколькими сценариями оболочки. PuPHPet является отличным источником для настройки стека LAMP на виртуальной машине и изучения того, как Puppet и Vagrant работают вместе в более сложной настройке. Альтернативой является Protobox.

Когда вы используете контейнеры Docker с Vagrant так же, как и с виртуальными машинами. Затем с vagrant up вы, по сути, запускаете контейнеры докеров с поставщиком Docker. Vagrant построит для вас контейнеры из файла Docker или использует существующее изображение, более или менее похожее на docker-compose (fig) и запустит их.

Основная причина выбора Vagrant для вашей установки Docker - если вы или ваша команда частично работаете в среде Windows, так как Vagrant позволяет вам поддерживать вашу настройку согласованной, независимо от того, какая ваша хост-система (см. Host VM).

Если вы используете OS X, вы можете использовать docker-compose с виртуальной виртуальной машиной, если вы работаете в Linux, вы можете использовать Docker изначально. Также всегда можно войти в boot2docker (или другую виртуальную машину Docker Host) через ssh, независимо от того, находитесь ли вы в Windows или OS X.

Примечание. Вы не должны использовать SSH в своих контейнерах, но это другая тема.

По состоянию на февраль 2015 года

docker-compose чувствует себя немного более эффектно для меня, а также более эффективно запускает, останавливает и восстанавливает контейнеры.

Преимущество Vagrant заключается в том, чтобы указать другую виртуальную машину хоста, например. за проект, если вы предпочитаете такую ​​настройку.

Примечание: там также предусмотрен механизм Docker, который более связан с процессом сборки Puppet.


Должны ли быть отдельные контейнеры Docker для веб-сервера (например, Apache), сервера базы данных (например, MySQL) и каждой части веб-приложения?

При использовании контейнеров Docker вы в основном используете одиночные изолированные процессы. Использовать супервизор следует избегать, а также не нужно для стека LAMP.

Итак, мой ответ определенно: Да, должны быть отдельные контейнеры!


Когда я говорю о частях веб-приложения, я имею в виду такие вещи, как mysite.com, controlpanel.mysite.com и т.д.

Это зависит от ваших потребностей, я предлагаю вам прочитать документацию 12factor, в которой описываются важные вещи, о которых нужно позаботиться очень подробный путь.


Контейнеры-докеры, по-видимому, предназначены для замены, а не для обновления программного обеспечения внутри них. Как насчет данных, которые они пишут, что я не хочу потерять?

В дополнение к ответу @Thomasleveil я бы порекомендовал вам также отдельный бэкэнд для хранения пользователей, таких как Amazon S3, SFTP или WebDAV.

По моему мнению, ваш контейнер веб-приложений должен рассматриваться как клиентское приложение, обращающееся к вашей базе данных и бэкэдам (службам) хранения данных, а также не полагаться на данные из томов при работе в рабочей среде.


Хорошо ли использовать Puppet для создания и управления контейнерами Docker как для сервера разработки, так и для производственного сервера?

Я не знаю о возможностях оркестровки Puppet, но для создания контейнеров, если вы используете Vagrant, я не вижу необходимости в Puppet, из-за собственного помощника Docker для Vagrant.


Bonus

Для всех описанных выше вещей вы можете посмотреть мой 12factor PHP-шаблон приложения на основе Yii 2.0 Framework с доклерным стеком LAMP. С Docker вы также можете легко подключать обратные прокси или контейнеры для тестирования селена в свой проект, поскольку они существуют как изображения предварительной сборки и могут быть загружены и настроены за несколько минут и начаты через несколько секунд.