Введение

Как подсказывает Википедия, Docker это программное обеспечение для автоматизации развертывания и управлениями приложениями в среде виртуализации. Несравненным приемуществом Docker является полная изолированность приложений от операционной системы, за счет работы каждого приложения в, так называемом, контейнере. Отсюда можно вытянуть еще один жирный плюс - то, что ваше собственное приложение можно развернуть на абсолютно любой операционной системе или процессорной архитектуре. Не нужно заботиться о зависимостях или прочих проблемах — как уже говорилось выше — контейнер изолирован от операционной системы и ему все равно где он находится — на FreeBSD, Ubuntu или даже на Windows.

Сам Docker уже оброс большим количеством инструментов, облегчающим работу с ним или предоставляющим дополнительные возможности. Одним из таких инструментов является Docker Compose. Compose это пакетный менеджер, позволяющий с помощью конфигурационного YAML файла описать необходимую структуру контейнеров Docker, и являющий по своей сути простым аркестратором контейнеров.

Использование Docker Compose значительно упрощает работу с контейнерами, и пусть он и является своеобразным переходным звеном к Kubernetes или Swarm, это не уменьшает интерес к данному инструменту.

В данной статье мы, с помощью Docker Compose запустим LAMP сервер, разделив компоненты стека по контейнерам.

Для начала работы нам понадобится установить Docker и Docker Compose. Процесс установки этих инструментов никто не опишет лучше чем официальная документация: Установка Docker - https://docs.docker.com/install/Установка Docker Compose - https://docs.docker.com/compose/install/

Вам остается только выбрать вашу операционную систему из списка и по шагам выполнить установку инструментов.

Настройка окружения

Перейдем непосредственно к созданию нашего окружения. Для начала создадим директорию проекта

mkdir project
cd project

В ней необходимо создать директории под файлы конфигурации Apache, под базу данных и файлы сайта.

mkdir httpd
mkdir mariadb
mkdir src

Переходим в директорию с конфигурацией Apache, и создадим там Dockerfile. Дело в том, что мы создаем простейшее веб-окружение для разработки, поэтому, чтобы упростить себе жизнь, возьмем с Docker Hub образ Apache, с уже установленным PHP, чтобы не отвлекаться на линковку контейнеров. Однако в предлагаемом образе не включен нужный мне модуль и нет нескольких нужных пакетов, что мы сейчас и исправим.

cd httpd
nano Dockerfile

Сюда запишем следующее:

FROM php:7.2-apache 
RUN a2enmod rewrite 
RUN set -xe \ 
   && apt-get update \ 
   && apt-get install -y libpng-dev libjpeg-dev libmcrypt-dev \ 
   && rm -rf /var/lib/apt/lists/* \ 
   && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \ 
   && docker-php-ext-install gd mbstring mysqli zip \ 
   && pecl install mcrypt-1.0.1 \ 
   && docker-php-ext-enable mcrypt

Готово. Теперь поднимаемся на директорию выше:

cd ..

Так же входим в src, и создадим простой файл для проверки работы нашего веб-сервера:

cd src

touch index.html

echo «<h2> Hellow World! </h2>» > index.html

Снова переходим в корневую директорию нашего проекта:

cd ..

Создание файла docker-compose

Cоздадим файл docker-compose.yml, необходимый для сборки и линковки контейнеров.

nano docker-compose.yml

Сюда нужно вписать следующее:

version: '3' 

services: 
 apache_php: 
   build: ./httpd 
   ports: 
     - 80:80 
   volumes: 
     - ./src:/var/www 
   links: 
     - mariadb 
   depends_on: 
     - mariadb 

 mariadb: 
   image: mariadb:10.3   
   volumes: 
     - ./mariadb:/var/lib/mysql 
   environment: 
     MYSQL_ROOT_PASSWORD: ***********
     MYSQL_DATABASE: ********
     MYSQL_USER: *********
     MYSQL_PASSWORD: *************

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

version: '3' Все просто — указываем какую версию Docker Compose использовать

services: Объявляем создание сервисов (каждый контейнер будет являться сервисом)

apache_php: Объявляем название сервиса

build: ./httpd Говорим Docker Compose, что нам нужно собрать контейнер из файла Dockerfile в директории директория проекта/httpd.

Собственно, не обязательно собирать каждый образ из Dockerfile, можно сразу взять готовый из Docker Hub, но об этом чуть ниже.

ports:

- 80:80 Объявляем порты, которые должны быть доступны из внешней сети

volumes:

- ./src:/var/www/html Volumes, если объяснять по простому, это директории (или файлы), которые пробрасываются в контейнер при создании, и содержат данные, которые не должны измениться при остановке или перезапуске контейнера (все же помнят, что все изменения в созданном контейнере сбросятся при его остановке или перезагрузке?) В случае с создаваемым контейнером apache_php мы пробрасываем в контейнер файлы нашего сайта.

links:

- mariadb Этой директивой мы связываем контейнер apache_php с контейнером базы данных mariadb. Теперь из одного контейнера можно обращаться к другому используя только имя сервиса.

depends_on:

- mariadb Эта директива не обязательна, но позволяет выстроить последовательность, с которой загружаются контейнеры. В нашем случае нам необходимо запускать контейнер с Apache строго после запуска контейнера с базой данных, чтобы избежать лишних проблем.

mariadb:

image: mariadb:10.3

Объявляем сервис с базой данных MariaDB, образ которого берем из официального репозитория на Docker Hub (mariadb:10.3 latest)

volumes:

- ./mariadb:/var/lib/mysql

Как и в случае с Apache, пробросим в создаваемый контейнер директорию, в которой будут храниться файлы базы данных.

environment:

MYSQL_ROOT_PASSWORD: ***

MYSQL_DATABASE: ****

MYSQL_USER: *****

MYSQL_PASSWORD: *****

Environment это так называемые переменные окружения. Полный список переменных можно посмотреть на странице образа на Docker Hub, но нас сейчас интересует лишь несколько:

MYSQL_ROOT_PASSWORD: - пароль root пользователя базы данных MYSQL_DATABASE: - Используемая база даных. Если не существует, то будет создана при сборке контенера. MYSQL_USER: - Пользователь базы данных. Ему передаются все права на базу данных, указанную выше. Если пользователя не существует, то он будет создан. MYSQL_PASSWORD: - Пароль пользователя базы данных.

Конечно же хранить пароли от базы данных в docker-compose.yml не лучшее решение, для этого существую так называемые секреты, но это уже тема для отдельной статьи.

На этом все. Остается только перейти в директорию с проектом и начать сборку.

docker-compose up -d

Этой командой мы сказали выполнить сборку проекта из файла docker-compose.yml (учтите, что почти все операции с docker-compose необходимо осуществлять, находясь в директории с файлом docker-compose.yml) и запустить проект в режиме демона (ключ -d).

Если вы вносили какие либо изменения в файл Dockerfile или Docker-compose уже после сборки, то может потребоваться пересобрать проект, чтобы Docker не использовал кэш, для этого выполните:

docker-compose up -d --force-recreate -V

Теперь перейдите по адресу 127.0.0.1 и вы увидите работающий веб-сервер LAMP. Если же вы увидите 403 ошибку apache, то просто перейдите в директорию с проектом и выполните:

chown -R www-data:www-data src/

И перезагрузите страницу.