В этой статье мы расскажем о Docker Compose и покажем, как использовать его для ваших нужд.

Мы установим его, напишем простой файл Compose и запустим контейнер.

Затем мы увидим, как запустить несколько контейнеров.

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

Вступление

До сих пор мы видели, как Docker отлично подходит для управления образами и запуска контейнеров.

Но часто приложения требуют, чтобы разные контейнеры работали и общались друг с другом.

Соединяя их через сеть, заставляя их совместно использовать тома диска, и передавая переменные среды, можно легко превратить в последовательность команд, которые сложно документировать и поддерживать с течением времени.

Тут на помощь приходит Docker Compose.

Давайте начнем его устанавливать, а затем напишем файл Compose.

Установка Docker Compose

В Ubuntu 18.04 установить Docker Composer просто:

# apt install docker-compose

Чтобы проверить установку, вы можете проверить его версию:

$ docker-compose -v
docker-compose version 1.17.1, build unknown

Версии Docker Engine и Docker Compose важны, так как их выпуски встречаются часто, а функции добавляются и удаляются.

Показанная выше версия (1.17.1) была выпущена в ноябре 2017 года.

Если вам нужен более новый выпуск, вы можете либо включить репозиторий Ubuntu Universe и получить более новый пакет, либо даже загрузить и установить последний выпуск непосредственно с веб-сайта Docker Compose:

# curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# sudo chmod +x /usr/local/bin/docker-compose

Файл Docker Compose

Docker Compose читает файл YAML, который обычно называется docker-compose.yml.

version: "3"

services:
apache:
image: php:7.3-apache
container_name: 'apache'
ports:
- "80:80"
volumes: 
- ./www:/var/www/html

В начале, синтаксическая версия сообщается как 3.

Далее, в разделе служб указан только один контейнер (apache), а теги image, container_name, ports и volume используются для описания того, как он должен выполняться.

Теперь создайте каталог с именем www и поместите этот файл index.html внутрь.

<html>
        <body>
                Hello       
        </body> 
</html>

Далее, для проверки работоспособности PHP просто поместите этот файл в www.

<?php
        phpinfo();
?>

Команды Docker Compose

Команда up позаботится обо всем: загрузить зобразы из Docker Hub, если они еще не существуют в локальном кэше, создать пользовательские образа (что не так; мы рассмотрим это в следующем разделе) и запустить контейнеры.

$ docker-compose up -d

Ключ -d указывает Docker Compose запускать контейнеры в фоновом режиме.

Если вместо docker-compose.yml используется другое имя файла, это можно сообщить с помощью -f.

Обратите внимание, что команда запуска намного проще, чем аналог запуска Docker.

У него есть еще два преимущества: он не изменяется независимо от содержимого файла Compose, и если в файле Compose указано более одного контейнера, все они будут запущены.

Для сравнения команда docker run будет выглядеть так:

$ docker run -d --name='apache-alone' -p 80:80 -v $PWD/www:/var/www/html php:7.3-apache

Поскольку синтаксис файла Compose — YAML, отступ имеет значение.

Если вы получаете синтаксические ошибки, проверьте синтаксис YAML с помощью онлайн-парсера, такого как этот.

Вы можете проверить, работает ли контейнер.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
3937d997e029        php:7.3-apache      "docker-php-entrypoi…"   8 minutes ago       Up 8 minutes        0.0.0.0:80->80/tcp   apache

Теперь зайдите на http://localhost в вашем любимом браузере, а затем на http://localhost/phpinfo.php.

Запуск нескольких контейнеров

Давайте теперь посмотрим на более сложный файл Compose.

Давайте представим, что мы собираемся настроить локальную среду для разработки приложения LAMP.

Нам нужен контейнер с Apache и PHP, другой контейнер с MySQL и, возможно, контейнер PHPMyAdmin для взаимодействия с MySQL. Docker-compose.yml будет:

version: "3"

services:
apache:
image: php:7.3-apache
container_name: 'apache'
restart: 'always'
ports:
- "80:80"
- "443:443"
volumes: 
- ./www:/var/www/html
- ./php/php.ini:/usr/local/etc/php/php.ini
- ./sites-enabled:/etc/apache2/sites-enabled
- apache-logs:/var/log/apache2
mysql:
image: mariadb:10.4
container_name: 'mysql'
restart: 'always'
volumes: 
- mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somepassword
MYSQL_DATABASE: db_site
MYSQL_USER: user
MYSQL_PASSWORD: password
phpmyadmin:
image: phpmyadmin/phpmyadmin:4.8
container_name: 'phpmyadmin'
environment:
PMA_HOST: mysql
PMA_PORT: 3306
ports:
- '8080:80' 
volumes:
apache-logs:
mysql-data:

Этот файл Compose запускает три контейнера, каждый из которых имеет раздел под службами.

Обратите внимание, что мы определяем некоторые переменные окружения под окружением.

Определение restart: всегда указывает Docker автоматически запускать контейнеры при запуске службы Docker (например, в случае перезагрузки).

Команда для запуска трех контейнеров такая же, как в предыдущем простом примере.

Легко запомнить, верно?

$ docker-compose up -d

Проверьте, созданы ли контейнеры.

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f76ece3508fe phpmyadmin/phpmyadmin:4.8 "/run.sh supervisord…" 20 seconds ago Up 4 seconds 9000/tcp, 0.0.0.0:8080->80/tcp phpmyadmin
69b1b5054f3d mariadb:10.4 "docker-entrypoint.s…" 20 seconds ago Up 6 seconds 3306/tcp mysql
6747d7580dac php:7.3-apache "docker-php-entrypoi…" 2 days ago Up 14 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp apache

Интересно отметить, что контейнеры могут общаться через свои имена и получать доступ к портам друг друга без необходимости выставлять свои порты хосту.

Например, мы не открывали порт 3306 службы MySQL (как видно из приведенного выше вывода), но PHPMyAdmin может получить доступ к этому порту.

Чтобы получить доступ к PHPMyAdmin, перейдите по адресу http://localhost:8080 и войдите в систему, используя имя пользователя и пароль, определенные в службе MySQL (user / password).

Создание образов с помощью Docker Compose

Если вам нужно создать образ, а не использовать существующее, просто добавьте тег сборки.

В приведенном ниже примере мы говорим Docker Compose найти текущий каталог для Dockerfile.

Тег образа будет использоваться для названия нового образа.

version: "3"

services:
  apache:
    build: .
    image: my-image-name
    container_name: 'apache'
    restart: 'always'
    ports:
      - "80:80"

Переопределение с использованием нескольких файлов Docker Compose

Docker Compose позволяет легко настроить запуск контейнеров для различных сред.

Вам просто нужно создать вызываемые файлы переопределения и запустить контейнеры, указав их.

Они перезапишут предыдущие определения, сделанные в базовом файле Compose.

Например, давайте создадим файл переопределения с именем docker-compose-prod.yml и определим другой пароль для MySQL.

version: "3"

services:

  mysql:
    environment:
      MYSQL_ROOT_PASSWORD: somepassword_other
      MYSQL_DATABASE: db_site_other
      MYSQL_USER: user_other
      MYSQL_PASSWORD: password_other
Вы можете использовать другой хост для запуска контейнеров.
Если вы используете один и тот же хост, необходимо удалить контейнер mysql и связанный с ним том.
В противном случае будет использоваться существующий контейнер со старыми учетными данными.
$ docker stop mysql
$ docker rm mysql
$ docker volume ls
$ docker volume rm directory_mysql-data

И тогда вы можете выполнить команду ниже.

Важно следить за порядком файлов.

Можно использовать несколько файлов.

В нашем примере будет переопределен только раздел среды службы mysql.

$ docker-compose -f docker-compose.yml -f docker-compose-prod.yml up -d

После проверки работы контейнеров попробуйте получить доступ к PHPMyAdmin с использованием новых учетных данных.

Заключение

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

Существует множество возможностей, и настоятельно рекомендуется прочитать руководство по Docker Compose.

В следующих статьях мы рассмотрим способы организации контейнеров Docker между несколькими хостами.

 

Поделитесь статьей:

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