В этом разделе коснемся одного из популярных расширений докер. Это docker-compose, который позволяет комплексно создавать объединения контейнеров и управлять ими. В предыдущих постах «Часть 1 – терминология» мы рассмотрели основные термины и в части “Часть 2 – основные команды” провели обзор основных команд по управлению докер, “Часть 3 – файл докер” тренировались в создании своих образов. Часть 4 – посвящена томам и монтированию создавали хранилища данных. В части 5 – строили сети.
Часть 6 – Docker Compose
Docker Compose, инструмент для запуска многоконтейнерных приложений, позволяющий создавать и управлять различные связанные и зависимые контейнеры и многое другое – и все это с помощью всего одного файла конфигурации и команд. Данный инструмент нужен для сложных приложений, которые требуют для своей работы разворачивание нескольких связанных контейнеров (например ВЕБ сервер и сервер БД). Для таких решений этот инструмент позволяет создать единый файл конфигурации, описывающий сразу все контейнеры и связи между ними, а также с помощью команд управлять сразу всеми контейнерами.
Файл конфигурации Docker Compose представляет собой, файл содержащий YAML описание связей контейнеров приложения, который позволяет, например, запустить все приложение всего одной командой.
Docker Compose позволяет следующее:
- Создавать, останавливать и запускать контейнеры, связанные с приложением
- Следите за журналами запущенных контейнеров, экономя время на открытие нескольких сеансов терминала для каждый контейнера
- Просмотр статуса каждого контейнера
Docker Compose помогает обеспечить непрерывную интеграцию. Путем предоставления нескольких воспроизводимых сред, Docker compose позволяет запускать интеграционные тесты изолированно, а это путь к автоматизированным тестам. Инструмент позволяет запускать тесты, проверять их результаты, а затем аккуратно очистить или удалить тестовую среду.
Данный инструмент требует отдельной установки в среде Linux (в Mac и Windows инструмент в уже есть составе докер). В линукс можно скачать с официального репозитория GitHub или выполнив команду: sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose (предварительно заменив номер версии на соответствующий необходимому, а после скачивания необходимо дать файлу права на выполнение)
Основы Docker Compose
В отличии от жкер файла, содержащего инструкции по тому как создать контейнер, файл Docker Compose это YAML описание настроек сетей, томов и сервисов необходимое для запуска приложения. Докер ожидает наличие файла конфигурации в месте где запускается команда docker-compose и как правило имеет имя docker-compose.yaml или docker-compose.yml, которое можно переопределить с помощью ключа “-f”.
В начале файла конфигурации указывается версия формата (если она упущена, то считается, что файл напиан в версии 1.х). Существует 3 версии формата. Версия 1 – считается устаревшей и настоятельно не рекомендуется к использованию. Версия 2 – все сервисы должны быть описаны сервисными ключами, все контейнеры подключаются с отдельной сети приложения, где образы доступны по именам контейнеров, есть возможность описать зависимости между контейнерами. Версия 3 – наиболее новая удаляет некоторые старые инструкции конфигурации и добавляет инструкцию deploy (для кластерных сред).
Пример файла конфигурации версии 3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
version: '3' services: database: image: mysql environment: MYSQL_ROOT_PASSWORD: dontusethisinprod webserver: image: nginx:alpine ports: - 8080:80 depends_on: - cache - database cache: image: redis |
В этом примере, Compose описывает три сервиса их которых будет состоять приложение (это веб сервер, сервер БД и сервер кэшироания). При этом докер сам создаст необходимые контейнеры из базовых образов.
Приложение можно запустить одной командой: docker-compose up
При этом стоит отметить, что для веб сервера есть описание depends_on, которое указывает, что этот контейнер должен быть запушен только после запуска серверов БД и кэша. Важно помнить, что эта инструкция не контролирует успешность запуска контейнеров, а только создает порядок запуска контейнеров.
Основные команды:
- docker-compose build [–compress] [–no-cache] [<имя сервиса>] производит только сборку приложения (при использовании –no-cache игнорирует существующие кэши, а –compress позволяет сжать контекст) кроме того команда позволяет собрать как все контейнеры так и конкретный по имени сервиса.
- docker-compose up сборка контейнеров и запуск приложения.
- docker-compose down останавливает и удаляет контейнеры созданные up.
- docker-compose stop остановка приложения.
- docker-compose exec <имя сервиса> <команда> выполняет
- docker-compose start запуск уже созданного приложения
- docker-compose logs [–follow] [–tail=n] [<имя сервиса>]- отображает слепок логов с контейнеров. Ключ –tail=n позволяет просмотреть последние n строк лога. Ключ –follow указывает выводить поток с логов напрямую (в живую). Если указано имя сервиса, то будут браться логи только от указанного сервиса, иначе от всех.
Инструкции файла конфигурации
Сервисы Services
Раздел Services это первый корневой ключ для Compose YAML, который должен быть создан.
Ключ build
Build указывает на путь к контексту образа или указание на контекст и путь к файлу докер (dockerfile).
Например путь к контексту, где расположено все необходимое и докер файл.
1 2 3 |
services: app: build: ./app |
Вариант задания отдельно контекста и докер файла:
1 2 3 4 5 |
services: app: build: context: ./app Dockerfile: dockerfile-app |
Если контекст указан как относительный путь, то он вычисляется относительно места запуска утилиты docker-compose.
Ключ image
Этот ключ служит для указания базового образа (в тех случаях когда сборка нового образа не нужна), образ будет скачан и использован. Можно указать как имя образа так и конкретный тег.
Например:
1 2 3 4 |
services: app: build: ./app image: sathyabhat:app |
Ключи environment/env_file
Ключ environment позволяет установить значение переменных окружения в формате ключ/значение, а env_file позволяет указать путь к файлу содержащему значения переменных окружения.
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
version: '3' services: app: image: mysql environment: PATH: /home API_KEY: thisisnotavalidkey version: '3' services: app: image: mysql env_file: .env version: '3' services: app: image: mysql env_file: - common.env - app.env - secrets.env |
Ключ ports
Этот ключ указывает порты, которые будут открыты для контейнера. Можно указать какие конкретно номера портов будут связаны с портами хоста или если номера портов хоста не указаны, то они будут выбраны случайным образом при каждом запуске.
Пример:
1 2 3 4 5 6 7 8 9 10 11 |
version: '3' services: database1: image: nginx ports: - "8080:80" database2: image: nginx ports: - "80" |
в этом примере сервер nginx из образа database1 будет использовать порт 8080 на хосте, который будет связан с портом 80, в то время как образ database2 займет случайный порт хоста и свяжет его с портом 80 контейнера.
Ключ volumes
Этот ключ может быть как основным ключом так и дочерним по отношению с сервисам. На корневом уровне инструкция описывает именованные хранилища, а на уровне сервиса позволяет их использование в образах.
Для сервиса указывается как значение <имя тома>:<путь по которому том будет смонтирован>[:<режим доступа>].
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
version: '3' services: database: image: mysql environment: MYSQL_ROOT_PASSWORD: dontusethisinprod volumes: - "dbdata:/var/lib/mysql" webserver: image: nginx:alpine depends_on: - cache - database cache: image: redis volumes: dbdata: |
Если в примере выше упустить корневую инструкцию volumes – это вызовет ошибку.
Однако допускается использование монтирования каталогов, например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
version: '3' services: database: image: mysql environment: MYSQL_ROOT_PASSWORD: dontusethisinprod volumes: - "./dbdir:/var/lib/mysql" webserver: image: nginx:alpine depends_on: - cache - database cache: image: redis |
В этой конфигурации будет использовано монтирование каталога ./dbdir с хоста в каталог /var/lib/mysql в образе. В этом случае корневой volumes не нужен. При этом допустимо указывать пути относительные каталога в котором запускается composer.
Ключ restart
Этот ключ задает политику перезапуска контейнера. По умолчанию такой политики нет, что значит, что докер не будет перезапускать контейнер, что бы ни случилось. Но возможны и другие варианты:
- no – не перезапускать
- always – перезапускать всегда
- on-failure – перезапускать в случае ошибки
- unless-stoped – перезапускать до тех пор пока не будет остановлен командой или завершением докер.