Как установить Docker Compose в Ubuntu 18.04

Вступление

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

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

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

Предпосылки

Чтобы следовать этой статье, вам понадобится сервер Ubuntu 18.04 со следующим:

Как только они будут на месте, вы готовы следовать.

[.note] #Note: Несмотря на то, что предварительные требования содержат инструкции по установке Docker в Ubuntu 18.04, командыdocker в этой статье должны работать в других операционных системах, пока установлен Docker.
#

[[step-1 -—- install-docker-compose]] == Шаг 1. Установка Docker Compose

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

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

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

[[step-2 -—- running-a-container-with-docker-compose]] == Шаг 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

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

[[step-3 -—- remove-the-image-optional]] == Шаг 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 в действии, вы можете проверить этот практический примерHow To Configure a Continuous Integration Testing Environment with Docker and Docker Compose on Ubuntu 16.04(note: this article is for Ubuntu 16.04 rather than 18.04)