В веб-разработке обычно используется несколько отдельных сервисов, о чём мы говорили в предыдущих статьях. Как правило, это минимальный набор:

  • веб-сервер;
  • интерпретатор 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 файлы.

От a-pro

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *