Как использовать команду docker compose wait для ожидания остановки сервисов

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы научитесь эффективно использовать команду docker compose wait для управления жизненным циклом ваших сервисов Docker Compose. Мы начнём с настройки базового файла docker-compose.yml с несколькими сервисами и наблюдения за их начальным состоянием после запуска.

Затем вы изучите основную функциональность команды docker compose wait, которая блокирует выполнение до тех пор, пока все сервисы в вашем проекте не остановятся. Далее мы продемонстрируем, как использовать эту команду для ожидания остановки конкретных сервисов, и, наконец, как комбинировать docker compose wait с опцией --down-project для полного завершения работы проекта и операции ожидания.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") subgraph Lab Skills docker/ps -.-> lab-555097{{"Как использовать команду docker compose wait для ожидания остановки сервисов"}} docker/stop -.-> lab-555097{{"Как использовать команду docker compose wait для ожидания остановки сервисов"}} docker/rm -.-> lab-555097{{"Как использовать команду docker compose wait для ожидания остановки сервисов"}} docker/logs -.-> lab-555097{{"Как использовать команду docker compose wait для ожидания остановки сервисов"}} docker/create -.-> lab-555097{{"Как использовать команду docker compose wait для ожидания остановки сервисов"}} docker/volume -.-> lab-555097{{"Как использовать команду docker compose wait для ожидания остановки сервисов"}} end

Создание простого docker-compose.yml с несколькими сервисами

На этом шаге мы создадим простой файл docker-compose.yml, определяющий два сервиса. Перед началом нам необходимо установить Docker Compose, так как он не предустановлен в данной среде.

Сначала загрузим бинарный файл Docker Compose. Мы скачаем версию v2.20.2, совместимую с установленной версией Docker.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Эта команда загружает бинарный файл Docker Compose с официальной страницы релизов GitHub и сохраняет его в /usr/local/bin/docker-compose. Части $(uname -s) и $(uname -m) автоматически определяют вашу операционную систему и архитектуру.

Далее необходимо предоставить загруженному бинарному файлу права на выполнение.

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

Теперь проверим корректность установки Docker Compose, запросив его версию.

docker-compose version

Вы должны увидеть вывод с указанием установленной версии Docker Compose.

Теперь, когда Docker Compose установлен, мы можем создать наш файл docker-compose.yml. Этот файл использует формат YAML для определения сервисов, сетей и томов вашего приложения. Мы создадим простой файл с двумя сервисами: веб-сервером и базой данных.

Перейдите в директорию вашего проекта.

cd ~/project

Создадим файл с именем docker-compose.yml с помощью редактора nano.

nano docker-compose.yml

Вставьте следующее содержимое в редактор:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: mysecretpassword

Разберём этот файл:

  • version: '3.8' указывает версию формата файла Docker Compose.
  • services: определяет различные сервисы, составляющие ваше приложение.
  • web: определяет сервис с именем web.
    • image: nginx:latest указывает, что этот сервис будет использовать последний образ nginx из Docker Hub.
    • ports: сопоставляет порт 80 на хосте с портом 80 в контейнере web, позволяя обращаться к веб-серверу из браузера.
  • db: определяет сервис с именем db.
    • image: postgres:latest указывает, что этот сервис будет использовать последний образ postgres из Docker Hub.
    • environment: устанавливает переменные окружения внутри контейнера. Здесь мы задаём POSTGRES_PASSWORD, требуемый образом PostgreSQL.

Сохраните файл, нажав Ctrl + X, затем Y, и затем Enter.

Теперь вы успешно создали файл docker-compose.yml, определяющий два сервиса.

Запуск сервисов и наблюдение за их состоянием

На этом шаге мы запустим сервисы, определённые в нашем файле docker-compose.yml, и проанализируем их состояние.

Сначала убедитесь, что находитесь в директории ~/project, где был создан файл docker-compose.yml.

cd ~/project

Теперь используйте команду docker-compose up для запуска сервисов. Флаг -d запускает контейнеры в detached mode (фоновом режиме).

docker-compose up -d

При первом выполнении этой команды Docker Compose загрузит необходимые образы (nginx:latest и postgres:latest), если они ещё не присутствуют в вашей системе. Это может занять некоторое время в зависимости от скорости интернет-соединения. После загрузки будут созданы и запущены контейнеры для сервисов web и db.

В выводе вы увидите информацию о создании сетей, томов (если они определены, хотя в нашем простом примере их нет) и запуске контейнеров.

Для проверки состояния запущенных сервисов используйте команду docker-compose ps.

docker-compose ps

Эта команда выводит список контейнеров, управляемых Docker Compose в текущей директории. Вы должны увидеть оба сервиса web и db с состоянием Up.

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

docker ps

Ищите контейнеры, имена которых начинаются с названия директории (project в данном случае) и имени сервиса (например, project-web-1, project-db-1).

Для просмотра логов сервисов используйте команду docker-compose logs. Например, для просмотра логов сервиса web:

docker-compose logs web

И для сервиса db:

docker-compose logs db

Это полезно для отладки и понимания происходящего внутри ваших контейнеров.

Теперь вы успешно запустили сервисы, определённые в файле docker-compose.yml, и проанализировали их состояние с помощью docker-compose ps.

Использование docker compose wait для ожидания остановки сервисов

На этом шаге мы рассмотрим команду docker compose wait, которая используется для блокировки выполнения до достижения сервисами определённого состояния. По умолчанию docker compose wait ожидает остановки сервисов.

Сначала убедитесь, что ваши сервисы запущены из предыдущего шага. Это можно проверить с помощью docker-compose ps.

cd ~/project
docker-compose ps

Вы должны увидеть оба сервиса web и db с состоянием Up.

Теперь откройте новое окно терминала или вкладку. Оставьте текущее окно терминала открытым, так как мы будем использовать его позже для остановки сервисов.

В новом окне терминала перейдите в директорию ~/project.

cd ~/project

Выполните команду docker compose wait. Эта команда будет заблокирована и будет ожидать, пока все сервисы, определённые в файле docker-compose.yml текущей директории, не остановятся.

docker compose wait

Вы заметите, что команда как будто "зависла". Это ожидаемо, так как сервисы в данный момент работают. Команда docker compose wait ожидает их остановки.

Теперь вернитесь в исходное окно терминала, где работают сервисы. Мы остановим сервисы с помощью команды docker-compose down. Эта команда останавливает и удаляет контейнеры, сети и тома, созданные командой docker-compose up.

cd ~/project
docker-compose down

Наблюдайте вывод в исходном окне терминала. Вы увидите сообщения об остановке и удалении контейнеров.

Теперь вернитесь в новое окно терминала, где выполнялась команда docker compose wait. Поскольку сервисы были остановлены командой docker-compose down в другом терминале, команда docker compose wait в этом окне обнаружит, что сервисы остановлены, и завершит свою работу.

Вы должны увидеть возврат командной строки в новом окне терминала. Это демонстрирует, как docker compose wait блокирует выполнение до остановки указанных сервисов (по умолчанию - всех сервисов).

Вы успешно использовали docker compose wait для ожидания остановки всех сервисов в вашем проекте.

Использование docker compose wait с указанием конкретных сервисов

В предыдущем шаге мы использовали docker compose wait для ожидания остановки всех сервисов. В этом шаге мы научимся использовать docker compose wait для ожидания перехода конкретных сервисов в определённое состояние.

Сначала давайте снова запустим наши сервисы с помощью docker-compose up -d. Убедитесь, что находитесь в директории ~/project.

cd ~/project
docker-compose up -d

Проверьте, что оба сервиса работают, используя docker-compose ps.

docker-compose ps

Теперь откройте новое окно терминала или вкладку. Мы будем использовать этот новый терминал для демонстрации ожидания конкретного сервиса.

В новом окне терминала перейдите в директорию ~/project.

cd ~/project

Мы можем указать, для каких именно сервисов нужно ожидать остановку, добавив их имена после команды docker compose wait. Например, чтобы ожидать остановки только сервиса web:

docker compose wait web

Как и в предыдущем шаге, эта команда заблокирует выполнение, так как сервис web в данный момент работает.

Теперь вернитесь в исходное окно терминала. Мы остановим только сервис web. Для этого используем команду docker stop с именем контейнера. Имя контейнера можно узнать с помощью docker ps. Оно будет выглядеть примерно как project-web-1.

cd ~/project
docker stop project-web-1

Замените project-web-1 на фактическое имя контейнера, если оно отличается.

Наблюдайте вывод в исходном окне терминала. Вы увидите сообщение об остановке контейнера web.

Теперь вернитесь в новое окно терминала, где выполнялась команда docker compose wait web. Поскольку сервис web остановлен, команда docker compose wait web завершит свою работу.

Вы должны увидеть возврат командной строки в новом окне терминала. Обратите внимание, что команда docker compose wait web завершилась, несмотря на то что сервис db продолжает работать.

Чтобы убедиться, что сервис db всё ещё работает, вернитесь в исходный терминал и выполните docker-compose ps.

cd ~/project
docker-compose ps

Вы должны увидеть сервис db в состоянии Up, в то время как сервис web либо отсутствует в списке, либо отображается как остановленный.

Наконец, остановим оставшийся сервис db.

cd ~/project
docker-compose down

Вы успешно использовали docker compose wait для ожидания остановки конкретного сервиса.

Использование docker compose wait с опцией --down-project

В этом завершающем шаге мы рассмотрим использование опции --down-project с командой docker compose wait. Эта опция полезна, когда вам нужно дождаться остановки сервисов и затем автоматически завершить работу всего проекта.

Сначала убедимся, что наши сервисы остановлены после предыдущего шага. Это можно проверить с помощью docker-compose ps.

cd ~/project
docker-compose ps

Если какие-либо сервисы всё ещё работают, остановите их с помощью docker-compose down.

docker-compose down

Теперь снова запустим сервисы в фоновом режиме.

cd ~/project
docker-compose up -d

Проверим, что оба сервиса работают.

docker-compose ps

Теперь мы используем команду docker compose wait с опцией --down-project. Эта команда будет ожидать остановки всех сервисов, а затем автоматически выполнит docker-compose down.

docker compose wait --down-project

Как и в предыдущих примерах с docker compose wait, эта команда заблокирует выполнение, так как сервисы в данный момент работают.

Теперь откройте новое окно терминала или вкладку. В этом новом терминале мы вручную остановим сервисы.

В новом окне терминала перейдите в директорию ~/project.

cd ~/project

Остановите сервисы с помощью docker-compose down.

docker-compose down

Наблюдайте вывод в новом окне терминала. Вы увидите сообщения об остановке и удалении контейнеров.

Теперь вернитесь в исходное окно терминала, где выполнялась команда docker compose wait --down-project. Когда команда docker-compose down в другом терминале остановит сервисы, команда docker compose wait обнаружит это. Благодаря использованию опции --down-project, она автоматически продолжит завершение работы проекта, что в данном случае означает удаление контейнеров, сетей и томов.

В исходном окне терминала вы увидите вывод, аналогичный тому, что появляется при ручном выполнении docker-compose down. После завершения работы проекта команда docker compose wait завершит своё выполнение.

Вы успешно использовали docker compose wait с опцией --down-project для ожидания остановки сервисов и автоматического завершения работы проекта.

Итоги

В этой лабораторной работе мы изучили, как использовать команду docker compose wait для ожидания остановки сервисов. Мы начали с установки Docker Compose и создания простого файла docker-compose.yml, определяющего два сервиса: web и db. Эта конфигурация предоставила необходимую среду для демонстрации функциональности команды wait.

Затем мы рассмотрели, как использовать docker compose wait для блокировки выполнения до остановки всех сервисов, определённых в файле docker-compose.yml. Мы также научились применять эту команду с указанием конкретных имён сервисов для ожидания остановки только этих сервисов, а также как использовать опцию --down-project для ожидания полного завершения работы проекта. Эти шаги продемонстрировали гибкость и полезность команды docker compose wait для управления жизненным циклом сервисов Docker Compose.