======NGINX======
Docker, docker, docker… Было время, когда это слово звучало в каждой курилке разработчиков. Хайп вокруг докера уже подугас, однако он по-прежнему может быть полезен как для локальной среды, так и как production-ready решение. Но в посте речь пойдет именно о среде для локальной разработки.
Но для тех, кто не в курсе, на всякий случай:
Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в среде виртуализации на уровне операционной системы. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть перенесён на любую Linux-систему с поддержкой cgroups в ядре, а также предоставляет среду по управлению контейнерами. Изначально использовал возможности LXC, с 2015 года применял собственную библиотеку, абстрагирующую виртуализационные возможности ядра Linux — libcontainer. С появлением Open Container Initiative начался переход от монолитной к модульной архитектуре.
[[https://ru.wikipedia.org/wiki/Docker|wikipedia]]
Углубляться в то, что такое docker и как он работает в этой статье я не буду, это тема скорее для отдельного разговора. Если кому-то интересно - пишите в комментариях.
===== Что будет уметь наша сборка? =====
Простейшая среда разработки на php включает в себя следующие компоненты:
* Собственно сам PHP, последний стабильный релиз 7.1;
* Composer
* Mysql, последняя стабильная версия 8;
* Nginx
Также наша конфигурация будет поддерживать сколько угодно хостов nginx (см. проектов). Добавление новых компонентов в стек обычно не составляет труда, если это не заморская диковина конечно, но об этом позже.
===== Установка docker =====
Заострять внимание на процессе установки docker'а нет никакого смысла, на официальном сайте есть подробные мануалы по установке для всех популярных ОС:
* [[https://docs.docker.com/engine/installation/linux/ubuntu/|Ubuntu]],
* [[https://docs.docker.com/docker-for-mac/install/|Mac]],
* [[https://docs.docker.com/docker-for-windows/install/|Windows]].
Нам еще понадобится ''docker-compose''. Как установить можно прочитать [[https://docs.docker.com/compose/install/|по ссылке]].
===== Файловая структура =====
Переходим к организации папок и файлов нашей сборки. Создадим на диске какую-нибудь директорию, которая будет корневой для нашей сборки и в ней по порядку создаем следующие директории:
* **www** - в этой папке будут лежать файлы наших проектов, по директории на каждый проект;
* **mysql** - в этой папке будут храниться файлы наших баз данных;
* **logs** - здесь будет собриать логи из разных образов;
* **hosts** - здесь будут храниться файлы конфигурации nginx для наших проектов;
* **images** - папка с нашими образами - компонентами нашей системы.
Еще не помешает создать дефолтный проект, чтобы проверить работоспособность нашей сборки когда все запустится. В директории ''www'' создадим директорию тестового проекта - ''hello.dev'' с одим единственным файлом ''index.php''. Содердимое файла ''index.php'' классическое:
Также в корне будет лежать наш ''docker-compose.yml'' - сердце любой docker-конфигурации :)
===== Собираем образ PHP =====
Стандартный официальный образ PHP не включает в себя никаких модулей, поэтому чтобы включить их нужно собрать свой образ на основе официального. Звучит немного страшновато, но на деле все просто. Создаем директорию для нашего образа ''images/php'' и в ней создаем файл ''Dockerfile'' следующего содержания
# Для начала указываем исходный образ, он будет использован как основа
FROM php:7.1-fpm
# Необязательная строка с указанием автора образа
MAINTAINER PHPtoday.ru
# RUN выполняет идущую за ней команду в контексте нашего образа.
# В данном случае мы установим некоторые зависимости и модули PHP.
# Для установки модулей используем команду docker-php-ext-install.
# На каждый RUN создается новый слой в образе, поэтому рекомендуется объединять команды.
RUN apt-get update && apt-get install -y \
curl \
wget \
git \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
&& docker-php-ext-install -j$(nproc) iconv mcrypt mbstring mysqli pdo_mysql zip \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
# Куда же без composer'а.
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Добавим свой php.ini, можем в нем определять свои значения конфига
ADD php.ini /usr/local/etc/php/conf.d/40-custom.ini
# Указываем рабочую директорию для PHP
WORKDIR /var/www
# Запускаем контейнер
# Из документации: The main purpose of a CMD is to provide defaults for an executing container. These defaults can include an executable,
# or they can omit the executable, in which case you must specify an ENTRYPOINT instruction as well.
CMD ["php-fpm"]
Также в этой папке создадим пока пустой php.ini'', чтобы не было ошибки при сборке образа. Можете добавить в него нужные вам настройки.
====Docker Compose====
Docker compose сильно упрощает жизнь если у вас больше одного контейнера. С помощью одного (иногда нескольких) конфигурационных файлов формата yml вы описываете какие у вас будут запускаться контейнеры, их настройки, то как они будут между собой взаимодействовать и так далее. Начиная со второй версии docker compose поддерживает наследование и можно с его помощью описывать разные конфигурации для разных окружений. Мы сейчас не будем заострять на этом внимание, у нас одно окружение и один файл. Создадим в корне docker-compose.yml.
# Версия docker-compose
version: '2'
# Список наших сервисов (контейнеров)
services:
nginx:
# используем последний стабильный образ nginx
image: nginx:latest
# маршрутизируем порты
ports:
- "80:80"
- "443:443"
# монтируем директории, слева директории на основной машине, справа - куда они монтируются в контейнере
volumes:
- ./hosts:/etc/nginx/conf.d
- ./www:/var/www
- ./logs:/var/log/nginx
# nginx должен общаться с php контейнером
links:
- php
php:
# у нас свой образ для PHP, указываем путь к нему и говорим что его надо собрать
build: ./images/php
# этот образ будет общаться с mysql
links:
- mysql
# монтируем директорию с проектами
volumes:
- ./www:/var/www
mysql:
image: mysql:8
ports:
- "3306:3306"
volumes:
- ./mysql:/var/lib/mysql
# задаем пароль для root пользователя
environment:
MYSQL_ROOT_PASSWORD: secret
Структура docker-compose.yml файла предельно простая, если будут вопросы - задавайте в комментариях.
Конфигурация nginx для проектов
Раньше мы уже создали тестовый проект hello.dev, давайте добавим для него конфиг nginx. В папке hosts создадим файл с названием hello-dev.conf:
server {
index index.php;
server_name hello.dev;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/hello.dev;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Конфиг nginx для докер-контейнера ничем не отличается от обычного конфига для сайта. Стоит лишь обратить внимание на директиву fastcgi_pass, где мы используем не путь к unix-сокету, а адрес php:9000. Здесь присутствует немного магии docker'а: php - это хост по которому доступен наш php контейнер внутри контейнера nginx, ну а 9000 - порт, по которому можно достучаться до fpm-сокета.
====Run the magic!====
Мы набросали минимальную конфигурацию для локальной среды разработки и можем ее смело запускать. Для этого из корня нашей сборки, где лежит docker-compose.yml файл нужно выполнить команду docker-compose up -d и немного подождать. Первый запуск будет дольше, потому что docker'у нужно скачать образы и собрать образ для php.
В конце концов мы увидим заветные строчки:
Starting source_mysql_1 ...
Starting source_mysql_1 ... done
Starting source_php_1 ...
Starting source_php_1 ... done
Starting source_nginx_1 ...
Starting source_nginx_1 ... done
Они говорят нам что наши три контейнера запущены и готовы к работе. Проверимс... Для этого откроем браузер и перейдем по адресу http://hello.dev/, но сперва добавим одну строку в hosts файл.
127.0.0.1 hello.dev
Важно для windows и mac адрес 127.0.0.1 нужно заменить на адрес виртуальной машины, в которой запускается докер, потому что нативной поддержки пока нет или она очень унылая.
Итак, окрываем браузер и видим:
{{:phpinfo.png?600|}}
Наша среда готова для работы. Можно легко добавлять новые проекты - просто создаем новую папку для проекта в www и добавляем новый конфиг для nginx, перезаускаем контейнеры и вперед! Удачи в разработке и пишите вопросы в комментариях.
Репозиторий на github.
Использованные образы:
* PHP
* Nginx
* Mysql
====Исходники=====
{{ :nginx_new.zip |nginx пример}}
[[https://github.com/PHPtoday-ru/docker-local-conf|github.com/PHPtoday-ru]]
----
[[https://jeka.by/post/1051/setup-ssh-keys-for-bitbucket-github/|Доступ к bitbucket и github по ssh ключам]] \\
[[https://pacificsky.ru/recepty/sql/mysql/125-linux-mysql-kak-ustanovit-heidisql-na-linux.html|linux mysql. Как установить heidisql на linux]]