← Back to blog

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

Ivan Klimchuk

I am a Senior Software Engineer and indie maker. I build things for the web and share my journey here.

Find me on