Docker – очень полезный инструмент, но чтобы использовать его возможности в полной мере, нужно создать отдельный контейнер для каждого компонента приложения. Однако при работе со сложными приложениями, состоящими из большого количества компонентов, управлять контейнерами и синхронизировать их работу – задача довольно непростая.
Сообщество Docker использовало для решения этой проблемы средство под названием Fig, которое позволяет использовать единый YAML-файл для планирования и организации работы контейнеров и конфигураций Docker. Но со временем команда Docker решила разработать собственное средство, основанное на исходном коде Fig. Так появился Docker Compose – инструмент для определения и запуска многоконтейнерных приложений Docker.
Данное руководство поможет установить Docker Compose.
Требования
- Сервер Ubuntu 16.04.
- Не-root пользователь с доступом к sudo (подробнее об этом – в руководстве по начальной настройке сервера).
- Предустановленная система Docker (инструкции по установке можно найти здесь).
Примечание: Руководство предназначено для Ubuntu 16.04, однако команда docker аналогичным образом работает и в других дистрибутивах.
1: Установка Docker Compose
Установить Docker Compose можно из GitHub-репозитория Docker.
Ссылка в нижеприведённой команде несколько отличается от ссылки, предложенной на странице релизов. Флаг –о позволяет указать файл, в который нужно поместить вывод. Такой синтаксис устраняет ошибки, связанные с конфликтом привилегий при использовании sudo.
Итак, проверьте текущий релиз и при необходимости обновите команду:
sudo curl -o /usr/local/bin/docker-compose -L "https://github.com/docker/compose/releases/download/1.8.1/docker-compose-$(uname -s)-$(uname -m)"
Установите права:
sudo chmod +x /usr/local/bin/docker-compose
Запросите версию программы, чтобы убедиться, что установка прошла успешно:
docker-compose -v
Команда должна вернуть:
docker-compose version 1.8.1, build 878cff1
Инструмент Docker Compose успешно установлен. Теперь можно создать тестовый контейнер для программы Hello World, чтобы проверить работу Docker Compose.
2: Запуск контейнера при помощи Docker Compose
Официальный открытый ресурс Docker, Docker Hub, предлагает образ простого приложения Hello World. Он представляет собой минимальную конфигурацию (YAML-файл), необходимую для запуска контейнера в Docker Compose. Можно использовать этот образ, чтобы протестировать Docker Compose.
Создайте каталог для YAML-файла и откройте его:
mkdir hello-world
cd hello-world
Создайте YAML-файл при помощи текстового редактора:
nano docker-compose.yml
Поместите в файл следующий код, затем сохраните и закройте его:
my-test:
image: hello-world
Первая строка будет использоваться как часть имени контейнера. Вторая строка указывает, какой образ использовать для создания контейнера. Команда docker-compose up будет искать в локальных образах образ hello-world.
Список локальных образов можно просмотреть вручную:
docker images
Если локальных образов нет, команда вернёт только заголовки столбцов:
REPOSITORY TAG IMAGE ID CREATED SIZE
В каталоге ~/hello-world выполните следующую команду, чтобы создать контейнер:
docker-compose up
Если при первом запуске команда не обнаружит нужного образа на локальной машине, образ будет загружен из официального репозитория Docker Hub.
Pulling my-test (hello-world:latest)...
latest: Pulling from library/hello-world
c04b14da8d14: Downloading [==================================================>] c04b14da8d14: Extracting [==================================================>] c04b14da8d14: Extracting [==================================================>] c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest
. . .
Загрузив образ, docker-compose создаст контейнер и запустит программу hello-world. Если всё выполнено верно, на экране появится такой вывод:
. . .
Creating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 |
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 |
. . .
Затем команда опишет свои действия:
- The Docker client contacted the Docker daemon.
- The Docker daemon pulled the “hello-world” image from the Docker Hub.
- The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
- The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
- Клиент Docker подключается к демону Docker.
- Демон загружает образ hello-world с Docker Hub.
- Демон создаёт из этого образа новый контейнер.
- Демон передаёт полученный вывод клиенту Docker, а он возвращает его в терминал.
Контейнер Docker работает до тех пор, пока работает программа, запущенная в нём. Если вы остановите программу hello, контейнер тоже остановится. Запросите список активных контейнеров; программы hello-world среди них не будет.
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Чтобы просмотреть все существующие контейнеры, используйте флаг –а:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06069fd5ca23 hello-world "/hello" 35 minutes ago Exited (0) 35 minutes ago drunk_payne
3: Удаление образа (опционально)
Чтобы не тратить понапрасну дисковое пространство, можно удалить локальный образ. Для этого нужно удалить все связанные с ним контейнеры с помощью команды docker rm; при этом нужно указать имя или ID контейнера (его можно найти в выводе docker ps –a).
docker rm 06069fd5ca23
Когда все контейнеры, связанные с образом, будут удалены, вы сможете удалить и сам образ:
docker rmi hello-world
Заключение
Теперь вы умеете устанавливать Docker Compose и управлять контейнерами с помощью этого инструмента.
Данное руководство охватывает только основы работы с Docker Compose. К сожалению, оно не рассматривает одну из самых важных функций Docker Compose – управление группами контейнеров.
Читайте также: Тестирование приложения в непрерывной интеграции с Docker и Docker Compose в Ubuntu 16.04