Docker-сompose на практике

16/02/2020

docker compose img

Чем больше Вы работаете с Docker, тем чаще испытываете необходимость запускать одновременно сразу несколько контейнеров в связке. Это позволяет обеспечить работоспособность приложений, требующих нескольких компонентов для своего функционирования. Банальный пример, который иллюстрирует часто встречающую связку из реальной жизни — nginx, php-fpm и mysql. Как правило, современные веб приложения в минимальной конфигурации требуют СУБД — mysql, поддержку PHP, и возможность отдачи через веб сервер. Данную связку легко поднять с помощью 3 контейнеров, каждый из которых будет выполнять свой процесс. Так контейнер с nginx будет взаимодействовать с пользователями, контейнер с php-fpm обрабатываь PHP скрипты, а контейнер с mysql хранить информацию. Сами скрипты PHP и вспомогательные файлы приложения могут спокойно храниться на сервере, где работает Docker. С помощью Docker-compose проблема работы такой связки решается легко и эффективно.

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

Варим кашу c Docker-compose

Первым делом нам необходимо получить работающий бинарник docker-compose в системе. Как установить docker в OS Ubuntu Linux я рассказывал в предыдущей статье — Используем Docker для python приложения. Если Вы проделали все приведенные в той статье манипуляции, то чтобы получить docker-compose достаточно выполнить команду apt-get install docker-compose. После ее выполнения в дополнение к основному пакету docker Вы получите нужную утилиту для управления группой контейнеров.

Итак, создадим файл docker-compose.yml, в котором опишем состояния наших 3 контейнеров. Файл составляется в соотстветствии со стандартом YAML. В нем мы описываем, во-первых, контейнер mysql, который использует образ mysql из Docker Hub. В данной статье для наших целей мы будем использовать только публичные признанные образы из Docker Hub. В случае необходимости, конечно же, можно использовать и свои приватные образы контейнеров, а также другие публичные или приватные репозитарии Docker. В качестве веб сервера мы будем использовать контейнер с образом nginx из Docker Hub, ну а обработчик файлов PHP — контейнер php:7-fpm. Cодержание docker-compose.yml приведено далее.

version: '2'
services:
    mysql:
        image: mysql
        container_name: group1-mysql
        restart: always
        environment:
            - MYSQL_ROOT_PASSWORD=SomeRootPass1234
            - MYSQL_DATABASE=testdb
            - MYSQL_USER=testdbUser
            - MYSQL_PASSWORD=testdbPass
        volumes:
            - ./mysql:/var/lib/mysql


    nginx:
        build: ./nginx_local
        image: nginx
        container_name: group1-nginx
        restart: always
        ports:
            - "8080:80"
        volumes:
            - ./nginx_local/www:/var/www/
        links:
            - mysql
            - php

    php:
        build: ./php
        image: php:7-fpm
        container_name: group1-php
        restart: always
        volumes:
            - ./nginx_local/www:/var/www
        links:
            - mysql 

Как видно из содержания файла для двух сервисов из трех мы будем билдить образ контейнеров, а для сервиса mysql будем использовать уже готовый из репозитария без внесения дополнительных правок. Что интересно в даном примере, для настроек СУБД MYSQL будут использоваться переменные из environment. Таким образом мы заданим логин с паролем, а также название базы данных, которая будет использоваться в PHP приложении.

С контейнерами для nginx & php все немножко сложнее. Для создания их образов мы проведем ряд манимуляций с помощью дополнительных Dockerfile. Благодаря этому мы получим нужный нам функционал.

Манипуляции с Nginx

Итак, Dockerfile для контейнера nginx небольшой и будет выглядеть следующим образом.

FROM nginx

COPY nginx.conf /etc/nginx/conf.d/default.conf

Как видно из этого файла мы копируем конфигурационный файл nginx.conf из локальной директории сервера в /etc/nginx/conf.d/default.conf контейнера. Содержание данного конфигурационного файла приведено далее. На что хотелось бы обратить внимание в нем — настройка связки с контейнером php-fpm. Обращение при вызове интерпретатора PHP будет происходить к контейнеру с именем php на 9000 TCP порт. При этом имя данного контейнера будет браться из файла docker-compose.yml.

server {
  listen 80;
  listen [::]:80;

  index index.php index.html;
  server_name _;
  root /var/www;

  location / {
      root /var/www;
  }

  location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
} 

Манипуляции с PHP

Для того, чтобы собрать образ Docker, который будет обрабатывать файлы PHP, а также сможет обращаться к СУБД mysql, создадим следующий Dockerfile.

FROM php:7-fpm
RUN apt-get update
RUN docker-php-ext-install mysqli pdo pdo_mysql
RUN docker-php-ext-enable mysqli

Также в качестве образца файла index.php будем использовать следующий. С помощью него будет происходить подключение к СУБД MySQL, которая работает в соответсвующем нашем контейнере, а также вывод информации о подключении.

<?php

$host = "mysql";
$user = 'testdbUser';
$passwd = 'testdbPass';
$schema = 'testdb';
$mysqli = mysqli_connect($host, $user, $passwd, $schema);
if (!$mysqli)
{
   echo 'Connection failed<br>';
   echo 'Error number: ' . mysqli_connect_errno() . '<br>';
   echo 'Error message: ' . mysqli_connect_error() . '<br>';
   die();
}

echo 'Connection to MySQL is Successful<br>';
?>

Сборка контейнеров и запуск

Итак, написав docker-compose.yml, Dockerfile для соответствующих контейнеров, а также сопутствующие конфигурационные файлы для приложений, мы можем запустить нашу систему в работу. Для этого нужно будет выполнить две команды docker-compose. Первая команда с опцией build произведет сборку образов контейнеров, что необходимо сделать для nginx и php. Ну а уже вторая команда с опцией up запустит все наши контейнеры в работу.

$ docker-compose build
$ docker-compose up -d

В целом опции командной строки docker-compose практически идентичны тем, которые используем docker сам. Поэтому, освоить их не составит труда тем, кто мало мальски знаком с самим Docker-ом.

Заключение

Docker-compose полезная утилита, которая в современном IT мире просто незаменима. Она поможет и при тестировании сложных приложений и при определенных типах развертывания на продакшен серверах. С учетом простоты написания yaml конфигурационных файлов для запуска всего комплекта контейнеров, docker-compose не требует сложной конфигурации и большого объема работы. Очень многие специалисты в области высоких технологий используют его постоянно в работе. Если Вы еще не в их числе, настоятельно рекомендую уделить немного времени изучению этой утилиты.

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

Ваш адрес email не будет опубликован.