Найти в Дзене
Bierdy

Docker-compose для web-приложений

Оглавление

При разработке web-приложения одним из важнейших вопросов, который было бы здорово решить ещё до начала самой разработки, является вопрос рабочего окружения приложения. Под рабочим окружением подразумеваются знакомые многим web-разработчикам аббривиатуры LAMP (Linux, Apache, MySQL, PHP), WAMP (Windows, Apache, MySQL, PHP), LEMP (Linux, Nginx (engine-x), MySQL, PHP) и т.д.

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

Далее в этой статье речь пойдёт об одном из таких способов.

Docker

Докер представляет собой одну из технологий контейнерезации. Основное отличие от виртуальной машины - малое потребление ресурсов и быстродействие. Нас же интересует возможность докера изолировать выполняемый код и переменные среды окружения.

Docker-compose

Docker-compose представляет собой конфигурационный файл докера. Можно использовать докер и без этого файла, но так удобней.

Установка Docker и Docker-compose

Установка этих приложений обычно не вызывает трудностей у разработчиков. Инструкцию по установке докера можно найти на официальном сайте. Выбираем свою операционную систему и ставим. Docker-compose ставим также по инструкции с этого же сайта (ссылка на отдельное приложение, на сайте есть инструкция для установки docker-compose как плагина для docker). Вообще документация хорошо прописана, есть много примеров конфигураций под разные приложения.

Docker можно использовать на Windows, Mac и Linux. Я пользуюсь Ubuntu, на Windows раньше были некоторые трудности с докером, если есть конкретная информация по текущему состоянию дел, пожалуйста, напишите об этом в комментариях.

Теперь пара слов о том, где именно можно использовать docker. Я использую его на домашнем ПК и на работе (есть десктопная версия, но меня устраивает cli), а также на хостинге, на который выкатываю production версии приложений. Про хостинг нужно иметь ввиду то, что shared не подойдёт, так как там нельзя устанавливать своё ПО, а нам без этого никак. Подойдёт любой VDS/VPS сервер. Я пользуюсь timeweb, но можете выбрать любой другой. Я остановил свой выбор на этом хостинге по 2 причинам:

  • Результаты тестирования сайта на битриксе были лучшими именно на серверах этой компании. Кто работал с битрикс знает, на сколько прожорлив этот движок. Тесты проводил на 3 хостингах, названия в целях антирекламы указывать не буду. Кстати говоря, не все хостинги дают тестовый период на vps/vds сервера.
  • Техническая поддержка на высоком уровне: высокая скорость ответа, клиентоориентированность в финансовых вопросах.

Переходим к конфигурации.

Структура разделов

apps
----dev.example.com
conf
----mysql-8
--------conf.d
------------docker.cnf
----nginx
--------conf.d
------------dev.example.com
--------nginx.conf
----php-81-fpm
--------conf.d
------------php.ini
--------Dockerfile
----phpmyadmin
--------config.user.inc.php
--------upload
----docker-compose.yml
db
----mysql-8
logs
----nginx

Раздел apps содержит наши приложения, к примеру сайты. Каждый сайт в своём разделе (в примере выше он один - dev.example.com).

Раздел conf содержит конфигурации наших приложений окружения, таких как mysql, nginx, php, раздел db с базами данных, раздел logs с логами приложений окружения, а также конфигурационный файл docker-compose.yml. Файл docker-compose.yml мы разберём ниже, а конфигурации mysql, nginx, php выходят за рамки этой статьи, примеров в интернете множество.

Docker-compose.yml

Внимание! Формат docker-compose.yml требует обязательных отступов в 2 пробела, здесь вместо них указаны звёздочки (*). После копирования замените их на пробелы.

version: '3.9'

services:

**nginx:
****image: nginx:1.23.1
****container_name: nginx
****volumes:
******- ./nginx/nginx.conf:/etc/nginx/nginx.conf
******- ./nginx/conf.d:/etc/nginx/conf.d
******- ../logs/nginx:/var/log/nginx
******- ../apps:/usr/share/nginx/html:ro
******- /etc/localtime:/etc/localtime:ro
******- /etc/timezone:/etc/timezone:ro
****ports:
******- '80:80'
******- '8080:8080'
****depends_on:
******- php-81-fpm
****restart: always

**php-81-fpm:
****container_name: php-81-fpm
****build:
******context: ./php-81-fpm
****volumes:
******- ./php-81-fpm/conf.d:/usr/local/etc/php/conf.d:ro
******- ../apps:/usr/share/nginx/html
******- /etc/localtime:/etc/localtime:ro
******- /etc/timezone:/etc/timezone:ro
****restart: always

**mysql-8:
****image: mysql:8.0.30
****container_name: mysql-8
****volumes:
******- ./mysql-8/conf.d:/etc/mysql/conf.d
******- ../db/mysql-8:/var/lib/mysql
******- /etc/localtime:/etc/localtime:ro
******- /etc/timezone:/etc/timezone:ro
****restart: always
****environment:
******MYSQL_ROOT_PASSWORD: 1234
****expose:
******- '3306'
******- '33060'
****command: --default-authentication-plugin=mysql_native_password
****user: "1000:1000"

**phpmyadmin:
****image: phpmyadmin:5.2.0
****container_name: phpmyadmin
****volumes:
******- ./phpmyadmin/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php
******- ./phpmyadmin/upload:/etc/phpmyadmin/upload
******- /etc/localtime:/etc/localtime:ro
******- /etc/timezone:/etc/timezone:ro
****restart: always
****environment:
******PMA_ARBITRARY: 1
******UPLOAD_LIMIT: 10737418240

В разделе nginx есть проброс порта 8080 из хоста в контейнер. Это сделано, чтобы в конфигах nginx можно было управлять phpmyadmin, к примеру закрыть доступ по ip.

В примере выше мы используем php-fpm. Для указания адреса этого контейнера в конфигах nginx просто используем его название (и порт через двоеточие):

fastcgi_pass php-81-fpm:9000;

Также можно заметить файл Dockerfile по пути conf->php-81-fpm. Он может иметь примерно следующее содержание:

FROM php:8.1.10-fpm

WORKDIR /usr/share/nginx/html

COPY --from=mlocati/php-extension-installer:1.5.40 /usr/bin/install-php-extensions /usr/bin/
COPY --from=composer:2.4.1 /usr/bin/composer /usr/bin/composer

RUN apt update && apt install -y curl apt-utils ca-certificates zip unzip msmtp git vim imagemagick webp \
&& install-php-extensions mysqli pdo_mysql gd imagick intl zip \

&& install-php-extensions xdebug \
&& docker-php-ext-enable xdebug \

&& groupmod -g 1000 www-data \
&& usermod -u 1000 -g 1000 www-data \
&& chown -R www-data:www-data /usr/share/nginx/html \
&& chown -R www-data:www-data /var/www \
&& chown -R www-data:www-data /var/log

USER www-data:www-data

Запуск

Заходим в консоль и переходим в раздел conf. Выполняем команду:

docker-compose up -d --build

Начнётся сборка и запуск наших контейнеров.