Docker — это отличный инструмент для автоматизации развертывания приложений Linux внутри контейнеров ПО, но для использования всех его возможностей необходимо, чтобы каждый компонент приложения запускался в своем собственном контейнере. Для сложных приложений с большим количеством компонентов, организация совместных запуска, коммуникации и остановки всех контейнеров может быстро стать очень непростой и запутанной задачей.
Сообщество Docker предложило популярное решение, которое называется Fig и позволяет вам использовать единый файл YAML для организации совместной работы всех ваших контейнеров и конфигураций. Оно стало настолько популярным, что команда Docker решила создать Docker Compose на базе исходного кода Fig, который в настоящее является устаревшим инструментом и не поддерживается. Docker Compose упрощает организацию процессов контейнеров Docker, включая запуск, остановку и настройку связей и томов внутри контейнера.
В этом обучающем модуле мы расскажем вам, как установить последнюю версию Docker Compose для управления приложениями с несколькими контейнерами.
Для выполнения этого руководства вам потребуется сервер Ubuntu 18.04 и следующее:
После установки всех необходимых компонентов мы сможем двигаться дальше.
Примечание. Хотя в предварительных условиях содержатся указания по установке Docker в Ubuntu 18.04 команды docker
в этой статье должны работать в других операционных системах, где установлен Docker.
Хотя мы можем установить 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».
В общедоступном реестре Docker, Docker Hub, содержится образ Hello World, используемый для демонстрации и тестирования. Он демонстрирует минимальные параметры конфигурации, необходимые для запуска контейнера с помощью Docker Compose: файл YAML, вызывающий отдельный образ:
Сначала мы создадим директорию для файла YAML и перейдем в нее:
- mkdir hello-world
- cd hello-world
Затем мы создадим в этой директории файл YAML:
- nano 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
Так мы можем получить информацию, которая нам потребуется для удаления контейнера, когда мы закончим работать с ним.
Чтобы избежать необязательного использования дискового пространства, мы удалим локальный образ. Для этого нам потребуется удалить все контейнеры, которые содержат образ, с помощью команды 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)
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.