Установка LEMP с помощью Docker'а
Не так давно из всех углов доносились крики о докоре шморек. А я тогда использовал на локалхосте Vagrant и не понимал нафига мне переходить на Docker. Если честно я до сих пор этого не понимаю, но очередной сбой в вагранте (я сам виноват, инфа 146%) сподвиг меня хоть чуть чуть разобраться с докером. Вообще, если быть честным это не первый мой опыт, у меня одно время локально крутился Ghost на нем, а дальше дело не пошло. Предлагаемое решение больше для локалхоста, но принципы понятны и его можно будет адаптировать для production-ready решение.
Что такое докер
Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в среде виртуализации на уровне операционной системы. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть перенесён на любую Linux-систему с поддержкой cgroups в ядре, а также предоставляет среду по управлению контейнерами. Изначально использовал возможности LXC, с 2015 года применял собственную библиотеку, абстрагирующую виртуализационные возможности ядра Linux — libcontainer. С появлением Open Container Initiative начался переход от монолитной к модульной архитектуре.
Углубляться в то, что же это зазверь и как он работает я не буду, это тема для отдельного разговора да и есть отличный хелп у них на сайте.
Что будет в сборке
Самая простая и примитивная среда разработки:
- сам PHP
- Composer
- MariaDB
- Nginx с мультихостами
- PhpMyAdmin
Установка
На этом пункте я тоже заострять внимание не буду ибо все и так просто, но вот инструкции:
Так же нам потребуется docker-compose
, как его установить читайте тут.
Структура проекта
Создадим какую нибудь папку, где будет лежать наш проект. В ней нам нужно будет создать вот такие папки:
- www — в этой папке будут лежать файлы наших проектов, по директории на каждый проект
- mysql — в этой папке будут храниться файлы наших баз данных
- logs — здесь будет собрирать логи из разных образов
- hosts — здесь будут храниться файлы конфигурации nginx для наших проектов
- images — папка с нашими образами
Еще не помешает создать папку с нашим дефолтным проектом для проверки нашей сборки. В папке www
создадим папку с нашим проектом, например hello.test
. В ней создадим файл index.php
со следующим содержанием:
|
|
Так же давайте сразу создадим в папке с нашими образами папку php, а в ней файлы php.ini
(можем в нем определять свои значения конфига) и Dockerfile
(тут будут настройки нашего образа).
Для ленивых вот команда которая сделает все сама:
|
|
Собираем наш PHP образ
Официальный образ PHP не включает в себя никаких модулей, для того чтобы их включить, мы соберем собственный образ на основе официального. В файл images/php/Dockerfile
пропишем следующее:
|
|
Docker Compose
Docker Compose упрощает жизнь если у вас больше одного контейнера. С помощью одного, а иногда нескольких файлов, мы описываем какие контейнеры запускать, их настройки и связи между контейнерами. Начиная со второй версии docker compose поддерживает наследование и можно с его помощью описывать разные конфигурации для разных окружений. Мы сейчас не будем заострять на этом внимание, у нас одно окружение и один файл. В файл docker-compose.yml
пропишем следующее:
|
|
Конфигурация nginx для проектов
Мы уже сосдали тестовый проект hello.test
, создадить для этого проекта nginx конфиг. В папке hosts
cоздадим файлик hello-test.conf
:
|
|
Конфиг nginx для докер контейнеров ничем не отличается от обычного конфига для сайта. Стоит лишь обратить внимание на директиву fastcgi_pass
, где мы используем не путь к unix-сокету, а адрес php:9000
. Здесь присутствует немного магии docker’а: php - это хост по которому доступен наш php контейнер внутри контейнера nginx
, ну а 9000 - порт, по которому можно достучаться до fpm-сокета.
Погнали!
mysql
. Не localhost
, а именно mysql
.Минимальная конфигурация для нашей локальной разработки готовы. Осталось только запустить ее и проверить, работает ли оно. Переходит в корень нашего проекта, где лежит файл docker-compose.yml
. Выполняем команду docker-compose up -d
и ждем. Первый запуск он самый долгий, потому что докеру нужно скачать образы и собрать наш образ php.
В самом конце мы увидим заветные строки:
|
|
Они сообщают нам, что все 4 контейнера поднялись и работают. Проверим все ли так. Открываем браузер и переходим по адресу http://hello.test:8000/
и нихрена не открывается. Все потому, что нам надо в файл host
прописать следующею строку:
|
|
Обновляем страницу и видим:
Все готово, все работает. Для создания дополнительного хоста нам нужно в папке www
создать папку проекта, а в папке hosts
создать для него конфиг nginx и перезапустить контейнеры. Удачи!
domain-name.test
. Хром успокаивается и пускает вас поработать.Github
Используемые образы
mysql
. Не localhost
, а именно mysql
.Чуть не забыл. Вы можете почитать меня в твиттере или телеграме, посмотреть мои фотографии в инстаграме, подружиться со мной в PSN, позлить меня на твиче пока я играю или посмотреть в записи. А самые лучшие человеки могут меня поддержать деньгой.