При работе со сложными приложениями, зависящими от нескольких сервисов, управлять контейнерами и синхронизировать их работу – задача довольно непростая. Docker Compose – это инструмент, разработанный сообществом, который позволяет вам запускать мультиконтейнерные приложения, основанные на определениях из фала YAML. Определения сервисов позволяют собирать гибкие пользовательские среды с большим количеством контейнеров, которые могут совместно использовать сети и тома данных.
Данный мануал поможет установить Docker Compose в Ubuntu 20.04 и научит использовать его.
Установить Docker Compose можно из официального репозитория Ubuntu, однако тогда вы получите не самую свежую версию, потому лучше установить программу из GitHub-репозитория Docker.
Найдите ссылку на свежий релиз на этой странице. На данный момент это версия 1.26.0.
Следующая команда загрузит эту версию и сохранит исполняемый файл в /usr/local/bin/docker-compose, что сделает его глобально доступным как docker-compose:
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Теперь установите права и сделайте файл исполняемым:
sudo chmod +x /usr/local/bin/docker-compose
Запросите версию программы, чтобы убедиться, что установка прошла успешно:
docker-compose --version
Команда должна вернуть примерно следующее:
docker-compose version 1.26.0, build 8a1c60f6
Инструмент Docker Compose успешно установлен. Теперь можно настроить файл docker-compose.yml, чтобы инструмент смог запускать контейнеризованные системы.
Чтобы продемонстрировать, как настроить файл docker-compose.yml и работать с Docker Compose, мы создадим тестовую среду для веб-сервера, используя официальный образ Nginx из Docker Hub, публичного реестра Docker. Эта контейнерная среда будет обслуживать один статический HTML-файл.
Создайте в домашнем каталоге новый каталог, а затем перейдите в него:
mkdir ~/compose-demo cd ~/compose-demo
В этом каталоге создайте папку приложения, которая будет корневым каталогом для вашей среды Nginx:
mkdir app
Используя любой удобный текстовый редактор, создайте новый файл index.html в папке app:
nano app/index.html
В этом файле помещаем html-код.
Теперь создайте файл docker-compose.yml:
nano docker-compose.yml
Вставьте в файл такие строки:
version: '3.7' services: web: image: nginx:alpine ports: - "8000:80" volumes: - ./app:/usr/share/nginx/html
Файл docker-compose.yml обычно начинается с определения версии. Так Docker Compose узнает, какую версию конфигурации мы используем.
Затем идет блок services, где можно настроить сервисы, которые являются частью этой среды. У нас есть только один сервис, который называется web. Этот сервис использует образ nginx:alpine и устанавливает перенаправление портов с помощью директивы ports. Все запросы на порт 8000 хоста (системы, в которой вы запускаете Docker Compose) будут перенаправлены на порт 80 контейнера web, где будет работать Nginx.
Директива volume создаст общий том между хостом и контейнером. Это поделит локальную папку app с контейнером, а том будет расположен в папке /usr/share/nginx/html внутри контейнера, что затем перезапишет корневой каталог Nginx по умолчанию.
Сохраните и закройте файл.
Мы создали тестовую страницу и файл docker-compose.yml, который запустит контейнерную среду веб-сервера для ее обслуживания.
Подготовив файл docker-compose.yml, мы можем запустить Docker Compose, чтобы активировать среду. Следующая команда загрузит необходимые образы Docker, создаст контейнер для сервиса web и запустит контейнерную среду в фоновом режиме:
docker-compose up -d
Сначала Docker Compose ищет определенный образ в вашей локальной системе, и, если он не может найти его, он загружает его из Docker Hub. Вы увидите такой вывод:
Creating network "compose-demo_default" with the default driver Pulling web (nginx:alpine)... alpine: Pulling from library/nginx cbdbe7a5bc2a: Pull complete 10c113fb0c77: Pull complete 9ba64393807b: Pull complete c829a9c40ab2: Pull complete 61d685417b2f: Pull complete Digest: sha256:57254039c6313fe8c53f1acbf15657ec9616a813397b74b063e32443427c5502 Status: Downloaded newer image for nginx:alpine Creating compose-demo_web_1 ... done
Теперь среда работает в фоновом режиме. Чтобы убедиться, что контейнер активен, вы можете запустить эту команду:
docker-compose ps
Она покажет вам информацию о запущенных контейнерах и их состоянии, а также о всех перенаправлениях портов, которые происходят в настоящее время:
Name Command State Ports --------------------------------------------------------------- compose-demo_web_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:8000->80/tcp
Теперь вы можете получить доступ к тестовому приложению, указав в браузере localhost:8000, если вы запускаете его на локальном компьютере, или your_server_domain_or_IP:8000, если вы запускаете его на удаленном сервере. Вы должны увидеть такую страницу:
This is a Docker Compose Demo Page. This content is being served by an Nginx container.
Общий том, который вы настроили в файле docker-compose.yml, синхронизирует файлы из папки app с корневым каталогом контейнера. Если вы внесете какие-либо изменения в файл index.html, они будут автоматически собраны контейнером и отражены в вашем браузере после обновления страницы.
Далее мы расскажем, как управлять вашей контейнерной средой с помощью команд Docker Compose.
Теперь вы знаете, как настроить файл docker-compose.yml и запустить вашу среду. Давайте посмотрим, как использовать другие команды Docker Compose, предназначенные для управления и взаимодействия с вашей контейнерной средой.
Чтобы проверить логи, созданные контейнером Nginx, вы можете использовать команду logs:
docker-compose logs Attaching to compose-demo_web_1 web_1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration web_1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ web_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh web_1 | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf web_1 | 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf web_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh web_1 | /docker-entrypoint.sh: Configuration complete; ready for start up web_1 | 172.22.0.1 - - [02/Jun/2020:10:47:13 +0000] "GET / HTTP/1.1" 200 353 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" "-"
Чтобы поставить выполнение среды на паузу, не изменяя при этом текущего состояния контейнеров, используйте команду:
docker-compose pause Pausing compose-demo_web_1 ... done
Чтобы восстановить работу среды, используйте:
docker-compose unpause Unpausing compose-demo_web_1 ... done
Команда stop прервет работу контейнера, но сохранит все данные, связанные с ним.
docker-compose stop Stopping compose-demo_web_1 ... done
Если вы хотите удалить контейнеры, сети и тома, связанные с этой контейнерной средой, используйте команду down:
docker-compose down Removing compose-demo_web_1 ... done Removing network compose-demo_default
Обратите внимание, это не удалит базовый образ, используемый Docker Compose для запуска вашей среды (в нашем случае nginx: alpine). Таким образом, всякий раз, когда вы снова запускаете свою среду с помощью docker-compose up, процесс будет запускаться намного быстрее, поскольку образ уже находится в вашей системе.
Если вы хотите удалить базовый образ из вашей системы, вы можете использовать эту команду:
docker image rm nginx:alpine Untagged: nginx:alpine Untagged: nginx@sha256:b89a6ccbda39576ad23fd079978c967cecc6b170db6e7ff8a769bf2259a71912 Deleted: sha256:7d0cdcc60a96a5124763fddf5d534d058ad7d0d8d4c3b8be2aefedf4267d0270 Deleted: sha256:05a0eaca15d731e0029a7604ef54f0dda3b736d4e987e6ac87b91ac7aac03ab1 Deleted: sha256:c6bbc4bdac396583641cb44cd35126b2c195be8fe1ac5e6c577c14752bbe9157 Deleted: sha256:35789b1e1a362b0da8392ca7d5759ef08b9a6b7141cc1521570f984dc7905eb6 Deleted: sha256:a3efaa65ec344c882fe5d543a392a54c4ceacd1efd91662d06964211b1be4c08 Deleted: sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a
Теперь вы умеете устанавливать Docker Compose и управлять контейнерами с помощью этого инструмента.
Данное руководство охватывает только основы работы с Docker Compose. Больше информации об этом инструменте вы найдете в его официальной документации.