Установка Docker Compose в Ubuntu 18.04

Введение

Docker — это отличный инструмент для автоматизации развертывания приложений Linux внутри контейнеров ПО, но для использования всех его возможностей необходимо, чтобы каждый компонент приложения запускался в своем собственном контейнере. Для сложных приложений с большим количеством компонентов, организация совместных запуска, коммуникации и остановки всех контейнеров может быстро стать очень непростой и запутанной задачей.

Сообщество Docker предложило популярное решение, которое называется Fig и позволяет вам использовать единый файл YAML для организации совместной работы всех ваших контейнеров и конфигураций. Оно стало настолько популярным, что команда Docker решила создать Docker Compose на базе исходного кода Fig, который в настоящее является устаревшим инструментом и не поддерживается. Docker Compose упрощает организацию процессов контейнеров Docker, включая запуск, остановку и настройку связей и томов внутри контейнера.

В этом обучающем модуле мы расскажем вам, как установить последнюю версию Docker Compose для управления приложениями с несколькими контейнерами.

Предварительные требования

Для выполнения этого руководства вам потребуется сервер Ubuntu 18.04 и следующее:

  • Пользователь с привилегиями sudo без прав root (в статье Начальная настройка сервера с Ubuntu 18.04 объясняется, как это настроено).
  • Docker, установленный согласно инструкциям в шаге 1 и шаге 2 руководства Установка и использование Docker в Ubuntu 18.04

После установки всех необходимых компонентов мы сможем двигаться дальше.

Примечание. Хотя в предварительных условиях содержатся указания по установке Docker в Ubuntu 18.04 команды docker в этой статье должны работать в других операционных системах, где установлен Docker.

Шаг 1 — Установка Docker Compose

Хотя мы можем установить Docker Compose из официальных репозиториев Ubuntu, там не представлены самые последние версии, поэтому мы будем устанавливать Docker Compose из репозитория Docker на GitHub. Команда ниже немного отличается от команды, которую вы найдете на странице Releases. Благодаря использованию флага -o для указания файла вывода вместо перенаправления вывода, этот синтаксис позволяет избежать ошибки отсутствия прав доступа, возникающую при использовании sudo.

Мы проверим текущую версию и при необходимости обновим ее с помощью следующей команды:

  • sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

После этого мы настроим разрешения:

  • sudo chmod +x /usr/local/bin/docker-compose

Затем мы проверим, что установка прошла успешно, с помощью проверки версии:

  • docker-compose --version

В результате должна быть выведена установленная нами версия:

Outputdocker-compose version 1.21.2, build a133471 

Теперь, когда мы установили Docker Compose, мы можем запустить пример «Hello World».

Шаг 2 — Запуск контейнера с помощью Docker Compose

В общедоступном реестре Docker, Docker Hub, содержится образ Hello World, используемый для демонстрации и тестирования. Он демонстрирует минимальные параметры конфигурации, необходимые для запуска контейнера с помощью Docker Compose: файл YAML, вызывающий отдельный образ:

Сначала мы создадим директорию для файла YAML и перейдем в нее:

  • mkdir hello-world
  • cd hello-world

Затем мы создадим в этой директории файл YAML:

  • nano docker-compose.yml

Поместите в файл следующие данные, сохраните его и закройте текстовый редактор:

docker-compose.yml

my-test:  image: hello-world 

Первая строка файла YAML используется в качестве части имени контейнера. Вторая строка указывает, какой образ используется для создания контейнера. При запуске команды docker-compose up она будет искать локальный образ по указанному имени, т.е. hello-world. После этого можно сохранить и закрыть файл.

Мы можем вручную просмотреть образы в нашей системе с помощью команды docker images:

  • docker images

Когда локальные образы отсутствуют, будут отображены только заголовки столбцов:

OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE 

Далее, находясь в директории ~/hello-world, мы выполним следующую команду:

  • docker-compose up

При первом запуске команды, если локальный образ с именем hello-world отсутствует, Docker Compose будет загружать его из открытого репозитория Docker Hub:

OutputPulling 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, что, в свою очередь, подтверждает, что установка, выполнена успешно:

Output. . . 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 | . . . 

Затем программа отображает объяснение того, что она сделала:

Output of docker-compose up1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. 

Контейнеры Docker продолжают работать, пока команда остается активной, поэтому после завершения работы hello контейнер останавливается. Следовательно, когда мы просматриваем активные процессы, заголовки столбцов будут появляться, но контейнер hello-world не будет появляться в списке, поскольку он не запущен.

  • docker ps
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES 

Мы можем просмотреть информацию контейнера, которая нам потребуется на следующем шаге, используя флаг -a, с помощью которого можно отобразить все контейнеры, а не только активные:

  • docker ps -a
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES 06069fd5ca23        hello-world         "/hello"            35 minutes ago      Exited (0) 35 minutes ago                       drunk_payne 

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

Шаг 3 — Удаление образа (необязательно)

Чтобы избежать необязательного использования дискового пространства, мы удалим локальный образ. Для этого нам потребуется удалить все контейнеры, которые содержат образ, с помощью команды docker rm, после которой следует CONTAINER ID или NAME. Ниже мы используем CONTAINER ID из команды docker ps -a, которую мы только что запустили. Обязательно замените идентификатор на идентификатор вашего контейнера:

  • docker rm 06069fd5ca23

После удаления всех контейнеров, которые содержат образ, мы можем удалить образ:

  • docker rmi hello-world

Заключение

Мы установили Docker Compose, протестировали установку, запустив пример Hello World, и удалили тестовый образ и контейнер.

Хотя пример Hello World использовался для подтверждения корректности установки, простая конфигурация не демонстрирует одно из главных преимуществ Docker Compose — возможность одновременного запуска группы контейнеров Docker. Чтобы увидеть силу Docker Compose в действии, вы можете ознакомиться с практическим примером в статье Настройка среды непрерывного интеграционного тестирования с помощью Docker и Docker Compose в Ubuntu 16.04 (обратите внимание, что эта статья для Ubuntu 16.04, а не 18.04)