Docker for local development with Traefik and Dnsmasq
Привет опять. :)
В прошлой заметке я обещал рассказать об своем окружении, которое базируется на Docker. Обещание выполняю.
Почему Docker? Потому что это просто, быстро, легковесно, гибко и вообще модно-молодежно. Я сейчас не говорю про запуск в докере на продакшене и прочее, там свои требования к сборке, оркестрации и мониторингу. Но для локальной разработки Docker удобен тем, что позволяет быстро накидать нужный конфиг в docker-compose.yml и развернуть нужную инфраструктуру одной командой. Понадобился Redis, например, добавили пару строк, запустили `docker-compose up -d` и у вас запущен новый сервис с Redis, можно слать запросы. Внутри контейнеров можете использовать любые операционки, которые вам нравятся. Хотите Ubuntu - ради бога, не нравится и предпочитаете CentOS, нет проблем. Внутри можно сделать окружение точь в точь, как на продакшене.
Я таким окружением пользуюсь уже давно, но раньше были нюансы с проксированием запросов с основной машины через nginx на те многочисленные запущенные контейнеры. Было много возни с портами, запоминанием их и прочее. Однако недавно я узнал о таком инструменте, как Traefik и значительно обновил и улучшил своё окружение. Теперь это работает предельно просто и удобно без лишних телодвижений.
Давайте под кат, буду показывать вкусняшки.
P.S. Это окружение подходит не только для MODX, в контейнерах можете запускать любые приложения на любых фреймворках.
Программный набор
Вам понадобится <a href=“https://www.docker.com/products/docker-desktop”>Docker, <a href=“https://docs.docker.com/compose/“>Docker Compose (ставится вместе с Docker), <a href=“https://traefik.io/“>Traefik и <a href=“https://ru.wikipedia.org/wiki/Dnsmasq”>Dnsmasq.
Я всё буду показывать на примере MasOS, для Windows какие-то моменты могут отличаться, но я с этой системой не работаю, мне сложно давать советы. Думаю, сможете разобраться самостоятельно, суть одинакова.
Итак, чтобы установить Docker, нужно просто скачать по ссылке пакет и следовать инструкциям. Traefik лучше всего запускать через Docker, позже к этому вернемся. Dnsmasq для macos ставится через brew (думаю, для маководов не нужно объяснять, что это такое).
Структура
Общая схема работы получается следующая. С помощью Dnsmasq мы настраиваем локальную доменную зону, например `.docker`, таким образом все запросы на этот домен первого уровня будут поступать к нашим локальным сервисам. Затем, на порту 80 запускается Traefik, который слушает все запросы и, исходя из запрошенного домена, отправляет запрос дальше в необходимый контейнер, который помечен особым образом. Внутри этого контейнера идет обработка запроса (это контейнер с nginx) как обычно, вызывается приложение на PHP (другой контейнер) и ответ по цепочке возвращается обратно. Ниже примерная схема, как все работает.
Запуск MODX в Docker
Теперь поговорим, как запускать MODX в Docker. Ничего особенно в самом деле нет. Образ такой же, как и для любого PHP-приложения, ну или почти. В моем случае в нём еще установлен Gitify, чтобы было проще устанавливать MODX из командной строки, но это не обязательно. Пример моего Dockerfile для MODX ниже.
FROM php:7.2-fpm
MAINTAINER Ivan Klimchuk ivan@klimchuk.com (@alroniks)
RUN apt-get update && apt-get install -y curl zip unzip git vim
RUN docker-php-ext-install pdo pdo_mysql zip
RUN php -r “readfile(‘http://getcomposer.org/installer’);” | php — —install-dir=/usr/bin/ —filename=composer
RUN cd /var/www && git clone https://github.com/modmore/gitify.git && cd Gitify && composer install && cd -
RUN { echo ‘date.timezone=Europe/Minsk’; } > /usr/local/etc/php/conf.d/datetime.ini
WORKDIR /var/www/html/public
VOLUME /var/www/html/public
RUN usermod -u 1000 www-data
EXPOSE 9000
CMD [“php-fpm”]
Dokerfile у нас есть, теперь нужен `docker-compose.yml`, где мы можем описать все сервисы, которые нам нужно поднять для нашего проекта. Как правило, это золотая тройка - web-сервер, т.е. nginx, PHP в виде php-fpm сервиса и база данных. Остальные сервисы можно добавлять по желанию. Но давайте перейдем к практике. К этому моменту у вас уже должен быть установлен Docker.
Создайте любую папку с любым именнем для вашего нового проекта. Я у себя создаю все рабочие проекты в `$HOME/dev/running/`, но вы сами решайте, как вам удобно. Давайте создадим, например, папку `modx`. И внутри этой папки создадим файл `docker-compose.yml` со следующим содержимым (мои комментарии прямо по коду):
выафвыавыа
После этого мы можем запустить наши сервисы командой `docker-compose up -d`
К слову, я об этом уже рассказывал в подробностях в уроке про Docker - https://www.youtube.com/watch?v=d8hzj8Gz5xU
Балансирование через Traefik
- описать, куда прописывать лейблы
DNS и локальная рабочая доменная зона
- настройка dnsmsqrd
Это просто работает
В итоге, у вас получается гибкое рабочее окружение, которое потребляем минимум ресурсов. Если вам нужно поработать над одним проектом, нет нужды держать запущенной целую виртуалку, достаточно запустить контейнеры с проектом. Закончили работать, остановили контейнеры. Если нужно добавить какой-то сервис для поиска или новую БД - пару строчек в конфиг и окружение готово (разве что подождать, пока образы скачаются).
Если нужно начать новый проект - скопировали пару файлов со старого, поменяли домен в конфиге, запустили и все работает сразу же, так как образы уже скачаны. Это удобно и не занимает время на бесполезную рутину.
Пользуйтесь на здоровье. Сказать спасибо можно через кнопочку под постом, как обычно.
Related reading
Ivan Klimchuk
I am a Senior Software Engineer and indie maker. I build things for the web and share my journey here.