Введение
Как подсказывает Википедия, 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/
И перезагрузите страницу.