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

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

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

Введение

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

После настройки проекта вы попрактикуетесь в запуске сервисов, определённых в Compose-файле. Основная часть лабораторной работы посвящена использованию команды docker compose stop для остановки всех работающих сервисов, остановки конкретного сервиса и остановки сервисов с указанным таймаутом. Этот практический опыт даст вам навыки управления жизненным циклом многоконтейнерных Docker-приложений с помощью Docker Compose.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555093{{"Как использовать команду docker compose stop для управления сервисами"}} docker/ps -.-> lab-555093{{"Как использовать команду docker compose stop для управления сервисами"}} docker/start -.-> lab-555093{{"Как использовать команду docker compose stop для управления сервисами"}} docker/stop -.-> lab-555093{{"Как использовать команду docker compose stop для управления сервисами"}} docker/pull -.-> lab-555093{{"Как использовать команду docker compose stop для управления сервисами"}} end

Подготовка простого проекта Docker Compose

На этом шаге мы подготовим простой проект Docker Compose. Docker Compose — это инструмент для определения и запуска многоконтейнерных Docker-приложений. С помощью Compose вы используете YAML-файл для настройки сервисов вашего приложения. Затем одной командой создаёте и запускаете все сервисы из конфигурации.

Поскольку Docker Compose не предустановлен в среде LabEx, сначала нам нужно его установить. Мы скачаем бинарный файл Docker Compose и сделаем его исполняемым.

Сначала загрузим бинарный файл Docker Compose. Используем curl для скачивания последней стабильной версии.

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 для вашей архитектуры системы и сохраняет его в /usr/local/bin/docker-compose.

Далее нужно сделать скачанный бинарный файл исполняемым.

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

Эта команда добавляет права на выполнение для бинарного файла Docker Compose.

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

docker-compose --version

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

Теперь, когда Docker Compose установлен, создадим простой проект. Создадим директорию для проекта и файл docker-compose.yml внутри неё.

Сначала создадим директорию my-compose-app в домашней директории.

mkdir ~/project/my-compose-app

Перейдём в созданную директорию.

cd ~/project/my-compose-app

Теперь создадим файл docker-compose.yml. Этот файл будет определять сервисы нашего приложения. Используем nano для создания и редактирования файла.

nano docker-compose.yml

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

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  app:
    image: ubuntu:latest
    command: tail -f /dev/null

Разберём этот файл docker-compose.yml:

  • version: '3.8' — указывает версию формата файла Docker Compose.
  • services: — определяет сервисы, из которых состоит ваше приложение.
  • web: — определяет сервис с именем web.
    • image: nginx:latest — указывает, что этот сервис будет использовать Docker-образ nginx:latest. Если образ отсутствует локально, Docker Compose загрузит его из Docker Hub.
    • ports: — пробрасывает порт 80 на хосте в порт 80 контейнера web.
  • app: — определяет сервис с именем app.
    • image: ubuntu:latest — указывает, что этот сервис будет использовать Docker-образ ubuntu:latest.
    • command: tail -f /dev/null — указывает команду, которая выполняется при старте контейнера app. Эта команда поддерживает работу контейнера бесконечно без завершения.

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

Прежде чем запускать сервисы, убедимся, что необходимые Docker-образы доступны. Хотя Docker Compose загрузит образы, если они отсутствуют, рекомендуется заранее их скачать, особенно в средах с ограниченным доступом в интернет или для более быстрого старта.

Скачаем образ nginx:latest.

docker pull nginx:latest

Эта команда загружает образ nginx:latest из Docker Hub.

Затем скачаем образ ubuntu:latest.

docker pull ubuntu:latest

Эта команда загружает образ ubuntu:latest из Docker Hub.

Теперь вы успешно подготовили простой проект Docker Compose с двумя сервисами, web и app, и загрузили необходимые Docker-образы.

Запуск сервисов, определённых в Compose-файле

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

Убедитесь, что находитесь в директории ~/project/my-compose-app, где расположен ваш файл docker-compose.yml.

cd ~/project/my-compose-app

Для запуска сервисов используем команду docker-compose up. По умолчанию она запускает контейнеры в foreground-режиме и выводит логи каждого контейнера.

docker-compose up

При выполнении этой команды Docker Compose:

  1. Найдёт файл docker-compose.yml в текущей директории
  2. Соберёт или загрузит необходимые Docker-образы для каждого сервиса, если они отсутствуют
  3. Создаст и запустит контейнеры для каждого сервиса
  4. Отобразит логи всех запущенных контейнеров в терминале

Вы увидите вывод, свидетельствующий о создании сетей и контейнеров. Будут отображены логи контейнеров web (nginx) и app (ubuntu).

Чтобы продолжить работу с терминалом, нам нужно запустить сервисы в фоновом режиме. Остановите текущее выполнение, нажав Ctrl + C.

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

docker-compose up -d

Эта команда запустит сервисы в фоне и выведет имена созданных контейнеров.

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

docker ps

Вы должны увидеть два работающих контейнера: для сервиса web (на основе образа nginx) и для сервиса app (на основе образа ubuntu). В выводе будет информация о контейнерах, включая их ID, образы, статусы и порты.

Чтобы проверить доступность сервиса web, используем curl для обращения к nginx-серверу на порту 80. Так как мы пробросили порт 80 хоста в порт 80 контейнера web, можно обратиться к нему напрямую из LabEx VM.

curl http://localhost:80

Вы должны увидеть HTML-содержимое по умолчанию, которое возвращает nginx-сервер. Это подтверждает, что сервис web работает и доступен.

Остановка всех запущенных сервисов

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

Убедитесь, что находитесь в директории ~/project/my-compose-app, где расположен ваш файл docker-compose.yml.

cd ~/project/my-compose-app

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

docker-compose down

При выполнении этой команды Docker Compose:

  1. Корректно остановит работающие контейнеры
  2. Удалит остановленные контейнеры
  3. Удалит сети, созданные Docker Compose для этого проекта
  4. Удалит все тома, определённые в файле docker-compose.yml (если не указано обратное)

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

После выполнения docker-compose down можно проверить, что контейнеры больше не работают, с помощью команды docker ps.

docker ps

Эта команда выводит список работающих контейнеров. Поскольку мы остановили все сервисы, вы не должны видеть контейнеры web или app в выводе. Результат должен содержать только строку заголовков или быть пустым, если на вашей системе не запущены другие контейнеры.

Использование docker-compose down — стандартный способ очистки ресурсов Docker Compose проекта по завершении работы с ними.

Остановка конкретного сервиса

На этом шаге мы научимся останавливать отдельный сервис в рамках Docker Compose проекта, вместо полной остановки всех сервисов. Это полезно, когда требуется перезапустить или остановить только один компонент приложения.

Сначала убедимся, что сервисы запущены. Перейдём в директорию проекта и запустим сервисы в фоновом режиме.

cd ~/project/my-compose-app
docker-compose up -d

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

docker ps

Вы должны увидеть оба контейнера в списке работающих.

Теперь остановим только сервис app. Для остановки конкретного сервиса используем команду docker-compose stop с указанием имени сервиса.

docker-compose stop app

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

После выполнения команды проверим статус контейнеров снова.

docker ps

Теперь вы должны видеть только контейнер web в списке работающих. Контейнер app больше не должен отображаться среди запущенных.

Для подтверждения остановки контейнера app можно также использовать docker ps -a, который показывает все контейнеры, включая остановленные.

docker ps -a

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

Возможность остановки конкретного сервиса позволяет управлять отдельными компонентами приложения, не затрагивая остальные. Это особенно полезно во время разработки или при устранении неполадок в определённом сервисе.

Остановка сервисов с таймаутом

На этом шаге мы рассмотрим, как останавливать сервисы с указанным временем ожидания. При остановке контейнера Docker отправляет сигнал SIGTERM основному процессу в контейнере, давая ему время на корректное завершение. Если процесс не завершится в течение определённого времени, Docker отправляет сигнал SIGKILL для принудительной остановки. По умолчанию этот таймаут составляет 10 секунд. Вы можете изменить это значение с помощью флага -t или --timeout в командах docker-compose stop или docker-compose down.

Сначала убедимся, что сервисы запущены. Перейдём в директорию проекта и запустим сервисы в фоновом режиме.

cd ~/project/my-compose-app
docker-compose up -d

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

docker ps

Теперь остановим сервис web с таймаутом 5 секунд.

docker-compose stop -t 5 web

Эта команда указывает Docker Compose остановить сервис web и ждать максимум 5 секунд после отправки сигнала SIGTERM для корректного завершения контейнера. Если контейнер не остановится в течение 5 секунд, Docker отправит сигнал SIGKILL.

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

Проверим статус контейнеров снова:

docker ps

Теперь вы должны видеть только работающий контейнер app. Контейнер web должен быть остановлен.

Аналогично можно применить таймаут при остановке всех сервисов с помощью docker-compose down. Остановим все сервисы с таймаутом 3 секунды.

docker-compose down -t 3

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

Проверим, что после выполнения команды не осталось работающих контейнеров:

docker ps

Вывод должен показывать отсутствие работающих контейнеров.

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

Итоги

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

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