В веб-разработке обычно используется несколько отдельных сервисов, о чём мы говорили в предыдущих статьях. Как правило, это минимальный набор:
- веб-сервер;
- интерпретатор php;
- база данных.
Зачастую их гораздо больше, например, может быть Redis, Rabbit и т.д.
Можно всё это настроить на основной машине, но такой способ обладает недостатками, которые начинают особенно остро проявляться при появлении нескольких веб-проектов. Например, каждый из них требует строго определённые версии php и mySQL. Каждый раз перенастраивать основную систему становится крайне накладно. Хотелось бы иметь под рукой инструмент, который позволяет гибко настраивать версии, порты, состав сервисов.
Напрашивается некая виртуализация, и одна из самых удобных на сегодняшний день — контейнеризация с помощью Docker.
В составе Docker есть специальное средство docker-compose, которое позволяет управлять системой связанных контейнеров. Основная идея состоит в том, что создаётся конфигурационный файл, описывающий состав контейнеров с сервисами определённых версий.
Docker Registry имеет в своих репозиториях (основной репозиторий – Docker Hub) огромный выбор готовых контейнеров, которые будут автоматически скачаны при сборке docker-compose. Можно создать репозиторий (это актуально для организаций), и помещать туда свои образы. Если же нужна какая-то специфическая сборка, можно описать правила сборки нестандартных контейнеров (помещается в Dockerfile, об этом позже).
Начальные требования.
1. Ubuntu 20.04.
2. Установленный Docker.
Итак, приступим. Создаём папку проекта:
mkdir ~/projects/creative
cd ~/projects/creative
Создаём конфигурационный файл «рецепта»:
touch docker-compose.yml
Инструкция по сборке описывается в формате yaml, который получил широкую известность благодаря простоте и наглядности описания. Представляет из себя простой текстовый файл, где ключи разделяются переносами строки, а вложенность задаётся отступами.
Открываем в текстовом редакторе:
nano docker-compose.yml
Пока что создадим один контейнер nginx, который будет работать с html. Поддержку PHP добавим позже.
version: '3.7'
services:
nginx:
image: nginx:latest
ports:
- 8080:80
volumes:
- .:/usr/share/nginx/html/www
- ./docker-compose/nginx/nginx.conf:/etc/nginx/nginx.conf
В docker-compose.yml был указан файл nginx.conf, которого пока ещё не существует. Создаём простейшую конфигурацию nginx:
cd ~/projects/creative
mkdir -p docker-compose/nginx
touch nginx.conf
Ключ -p команды mkdir добавляется для рекурсивного создания вложенных папок.
nano docker-compose/nginx/nginx.conf
Добавляем в nginx.conf следующее содержание:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
proxy_cache_path /usr/share/nginx/cache levels=1:2 keys_zone=image-preview:10m;
server {
listen 80;
server_name creative.local;
root /usr/share/nginx/html/www;
client_max_body_size 32m;
location / {
try_files $uri $uri/index.html;
}
}
}
Наш сервис теперь должен уже работать. Конечно, пока в простейшем режиме, но для первого запуска уже достаточно.
Проверять будем на тестовом файле html. Мы указали в конфигурации, что рабочая папка веб-сервера монтируется прямо в корневую для нашего проекта. Создаём html файл:
cd ~/projects/creative
touch index.html
nano index.html
И помещаем в него следующие строки:
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>Привет, Док!</h1>
</body>
Запускаем сборку docker-compose, при первом запуске начинается скачивание образов.
cd ~/projects/creative
docker-compose up -d
> Creating network "creative_default" with the default driver
> Creating creative_nginx_1 ... done
Запускаем наше новое окружение!
<p>docker-compose start</p>
> Starting nginx ... done
Можно пробовать. В адресной строке браузера вводим
http://127.0.0.1:8080/
Результат:

В следующей статье научим наше окружение обрабатывать PHP файлы.