Перевод nginx, php-fpm, mysql на docker-compose

Давно хотел перевести свои сайты на микросервисы для удобства сопровождения. Плюс хотелось отказаться от монолита в силу слишком большого влияния состояния ОС хоста на все остальные сервисы на ней. Как таковой виртуализацией я занимаюсь давно, но в основном это было изолирование на уровне отдельных серверов для разных задач. Теперь это можно сделать в рамках одного сервера. Об этом и о нюансах развертывания — дальнейшая статья.

Подготовка

Как уже было сказано, перевести я собирался сервисы nginx, php-fpm и mysql для хостинга wordpress. В основе всех микросервисных архитектур лежит в основном либо docker либо другая подобная контейнерная виртуализация. Я выбрал именно docker по причине очень хорошей документации и большого количества вспомагательных инструментов.

Алгоритм действий такой:

  • С помощью docker-compose пишем описание наших сервисов. Результрующий файл можно посмотреть тут.
  • Добавляем конфигурационные файлы для nginx, php-fpm, mysql в нужное место согласно описания сервисов.
  • Добавляем файлы сайтов в папки томов описанных контейнеров.
  • Запускаем все с помощью docker-compose или простого легковесного интерфейса управления контейнерами — Portainer.

Детали реализации

Как обычно, реализация описания сервисов требует учета большого количества нюансов используемого ПО. При использовании стандартной библиотеки образов docker сверьтесь с подробностями их реализации. Например из документации можно узнать что:

  • При развертывании контейнера mysql можно добавить файлы *.sql в папку /docker-entrypoint-initdb.d и они будут выполнены при сборке контейнера docker-compose. Я смонтировал в эту папку внешний том с набором скриптов и дампами нужных мне БД.
  • Образ php:7-fpm содержит только базовый набор расширений. Чтобы установить дополнительные — вам потребуется собрать свой образ с помощью Docekrfile и команд (они включены в оригинальный образ) docker-php-ext-install, docker-php-ext-configure и т.д.
  • Если вы собираетесь реализовывать сборку и развертывание сервисов с помощью самого Portainer, то для работы со сборкой образов из внешних Dockerfile обязательно монтируйте папку, которую собираетесь использовать в качестве build context, т.к. во всех остальных случаях Portainer ищет Dockerfile в своем томе portainer_data/compose. Как вариант — сразу соберите нужный образ и используйте его при описании сервисов.

Почтовый сервис

Для тех кто хочет пользоваться собственным почтовым сервером с связке с docker-compose, рекомендую очень хорошую реализацию такого сервера — docker-mailserver. В отличии от другого популярного решения mailcow, docker-mailserver гораздо гибче настраивается и подходит для применения даже на небольших серверах.

Так же, если перед вами стоит задача отправлять письма с помощью функции PHP mail(), то следует учесть, что образ php:7-fpm содержит только заглушку для MTA. Поэтому отправть почту можно только установив его в образ. Рекомендую для этих целей воспользоваться ssmtp. Добавляете в образ php этот MTA. Монтируете в качестве внешнего тома конфигурацию /etc/ssmtp/ssmtp.conf примерно такую:

FromLineOverride=YES
mailhub=mail.server.tld
hostname=php-fpm.yourdomain.tld
UseTLS=YES
UseSTARTTLS=YES

Затем добавляете конфигурацию для php в /usr/local/etc/php/conf.d/mail.ini:

[mail function]
sendmail_path = "/usr/sbin/ssmtp -t"

и перезапускаете контейнер.

Заключение

Разумеется такой способ развертывания не подходит тем, кто предпочитает уже преднастроенные окружения либо панели управления хостингом. Основная идея использования указанных инструментов в данном случае — удобство развертывания и сопровождения. Так единожды написав файл описания сервисов развернуть уже готовую инфраструктуру можно одной командой. То же относится к обновлениям всей инфраструктуры.

Список использованных материалов

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.