Введение
В этой лабораторной работе вы научитесь использовать команду docker compose stop для управления сервисами, определёнными в файле Docker Compose. Мы начнём с подготовки простого проекта Docker Compose, который включает установку Docker Compose и создание базового файла docker-compose.yml.
После настройки проекта вы попрактикуетесь в запуске сервисов, определённых в Compose-файле. Основная часть лабораторной работы посвящена использованию команды docker compose stop для остановки всех работающих сервисов, остановки конкретного сервиса и остановки сервисов с указанным таймаутом. Этот практический опыт даст вам навыки управления жизненным циклом многоконтейнерных Docker-приложений с помощью Docker Compose.
Подготовка простого проекта 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:
- Найдёт файл
docker-compose.ymlв текущей директории - Соберёт или загрузит необходимые Docker-образы для каждого сервиса, если они отсутствуют
- Создаст и запустит контейнеры для каждого сервиса
- Отобразит логи всех запущенных контейнеров в терминале
Вы увидите вывод, свидетельствующий о создании сетей и контейнеров. Будут отображены логи контейнеров 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:
- Корректно остановит работающие контейнеры
- Удалит остановленные контейнеры
- Удалит сети, созданные Docker Compose для этого проекта
- Удалит все тома, определённые в файле
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. Это включало запуск всех сервисов, остановку всех работающих сервисов, остановку конкретного сервиса и остановку сервисов с указанным временем ожидания.



