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

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

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

Введение

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

Затем вы изучите различные способы использования команды docker compose kill: принудительная остановка всех сервисов, принудительная остановка конкретного сервиса и принудительная остановка сервисов с использованием другого сигнала. Этот практический опыт даст вам полезные знания по управлению сервисами Docker Compose с помощью команды kill.


Skills Graph

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

Подготовка простого файла Compose с несколькими сервисами

На этом шаге мы подготовим простой файл Docker Compose, определяющий несколько сервисов. Docker Compose — это инструмент, позволяющий определять и запускать многоконтейнерные приложения Docker. Хотя Docker предустановлен на этой виртуальной машине, Docker Compose отсутствует. Сначала мы его установим.

Сначала установим Docker Compose. Загрузим последнюю стабильную версию и сделаем её исполняемой.

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
sudo chmod +x /usr/local/bin/docker-compose

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

docker-compose --version

В консоли должна отобразиться информация о версии, подтверждающая корректную установку Docker Compose.

Далее создадим директорию для нашего проекта и перейдём в неё.

mkdir ~/project/my-compose-app
cd ~/project/my-compose-app

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

nano docker-compose.yml

В редакторе nano вставим следующее содержимое. Этот файл определяет два сервиса: web и redis. Сервис web использует образ nginx и пробрасывает 80-й порт контейнера на 8080-й порт хоста. Сервис redis использует образ redis.

version: "3.8"
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  redis:
    image: redis

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

Перед запуском сервисов необходимо загрузить образы, указанные в файле docker-compose.yml. Это можно сделать с помощью команды docker pull.

docker pull nginx
docker pull redis

Эти команды загрузят образы nginx и redis из Docker Hub.

Запуск сервисов с помощью docker compose up

На этом шаге мы запустим сервисы, определённые в файле docker-compose.yml, используя команду docker compose up. Эта команда собирает, (пере)создаёт, запускает и подключается к контейнерам сервиса.

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

cd ~/project/my-compose-app

Теперь выполните следующую команду для запуска сервисов. Флаг -d запускает контейнеры в detached mode (фоновом режиме), что означает их работу в фоне без блокировки терминала.

docker-compose up -d

Вы увидите вывод, указывающий на создание и запуск сетей, томов (если есть) и контейнеров.

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

docker ps

Эта команда выводит список всех запущенных контейнеров. Вы должны увидеть записи для контейнеров web (nginx) и redis.

Также можно проверить логи сервисов с помощью команды docker-compose logs.

docker-compose logs

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

Наконец, поскольку мы пробросили 80-й порт контейнера nginx на 8080-й порт хоста, вы можете получить доступ к стандартной странице приветствия Nginx, используя curl для обращения к localhost на порту 8080.

curl localhost:8080

В выводе вы должны увидеть HTML-содержимое страницы приветствия Nginx.

Принудительная остановка сервисов с помощью docker compose kill

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

Убедитесь, что находитесь в директории ~/project/my-compose-app.

cd ~/project/my-compose-app

Для принудительной остановки всех сервисов просто выполните команду docker compose kill без указания имён сервисов. По умолчанию эта команда отправляет сигнал SIGKILL контейнерам.

docker-compose kill

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

Чтобы убедиться, что контейнеры остановлены, снова используйте команду docker ps.

docker ps

На этот раз вы не должны видеть контейнеры web (nginx) и redis в списке, так как они были остановлены.

Также можно использовать docker ps -a для просмотра всех контейнеров, включая остановленные. Вы должны увидеть контейнеры my-compose-app-web-1 и my-compose-app-redis-1 со статусом "Exited".

docker ps -a

Принудительная остановка конкретного сервиса с помощью docker compose kill

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

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

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

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

docker ps

Теперь принудительно остановим только сервис web. Для этого добавим имя сервиса web после команды docker compose kill.

docker-compose kill web

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

Чтобы убедиться, что остановлен только контейнер web, снова используйте команду docker ps.

docker ps

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

Также можно использовать docker ps -a для просмотра всех контейнеров, включая остановленные. Контейнер my-compose-app-web-1 должен иметь статус "Exited", а my-compose-app-redis-1 - оставаться в статусе "Up".

docker ps -a

Принудительная остановка сервисов с другим сигналом через docker compose kill -s

На этом шаге мы рассмотрим, как использовать команду docker compose kill с флагом -s для отправки конкретного сигнала контейнерам. По умолчанию docker compose kill отправляет сигнал SIGKILL, который немедленно завершает процесс. Однако иногда требуется отправить другой сигнал, например SIGTERM, который запрашивает корректное завершение процесса.

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

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

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

docker ps

Теперь принудительно остановим все сервисы с сигналом SIGTERM. Используем флаг -s с указанием имени сигнала.

docker-compose kill -s SIGTERM

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

Для подтверждения остановки контейнеров используйте команду docker ps.

docker ps

Ни контейнер web, ни redis не должны отображаться в списке работающих.

Команда docker ps -a покажет, что контейнеры завершили работу.

docker ps -a

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

Наконец, для очистки остановленных контейнеров и сети, созданной Docker Compose, можно использовать команду docker compose down.

docker-compose down

Эта команда остановит и удалит контейнеры, сети и тома, определённые в файле docker-compose.yml.

Итоги

В этой лабораторной работе мы научились подготавливать простой файл Docker Compose с определением нескольких сервисов (web и redis) и устанавливать Docker Compose. Затем мы запустили эти сервисы с помощью команды docker compose up. Далее мы изучили, как принудительно остановить все запущенные сервисы, определённые в файле Compose, используя docker compose kill, а также как остановить конкретный сервис командой docker compose kill <имя_сервиса>. В завершение мы узнали, как отправить другой сигнал сервисам во время принудительной остановки с помощью флага -s, например docker compose kill -s SIGKILL.