Введение
В этой лабораторной работе вы научитесь эффективно управлять контейнерами Docker с помощью команды docker stop. Мы рассмотрим базовое использование команды для остановки работающего контейнера, изучим различные параметры управления процессом остановки, включая принудительную остановку контейнера и установку таймаута для операции остановки. К концу этой лабораторной работы вы будете уверенно использовать docker stop для корректного и принудительного завершения работы ваших контейнеров Docker.
Основы использования команды docker desktop stop
На этом шаге мы изучим базовое применение команды docker stop. Эта команда используется для остановки одного или нескольких работающих контейнеров. По умолчанию команда отправляет контейнеру сигнал SIGTERM, а после периода ожидания — сигнал SIGKILL, если контейнер не остановился.
Сначала запустим простой контейнер, который будет работать постоянно. Мы используем образ ubuntu и выполним команду, которая поддерживает работу контейнера.
docker run -d ubuntu sleep infinity
Флаг -d запускает контейнер в detached mode (фоновом режиме). Команда sleep infinity заставляет контейнер работать бесконечно.
Теперь выведем список работающих контейнеров, чтобы получить ID контейнера.
docker ps
Вы увидите примерно такой вывод, отображающий ваш работающий контейнер ubuntu:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "sleep infinity" X seconds ago Up X seconds <container_name>
Замените <container_id> на реальный ID вашего контейнера из вывода docker ps. Теперь остановите контейнер с помощью команды docker stop, указав его ID.
docker stop <container_id>
После выполнения команды контейнер должен остановиться. Проверить это можно, снова выведя список работающих контейнеров.
docker ps
Теперь команда docker ps не должна отображать только что остановленный контейнер.
Чтобы увидеть все контейнеры, включая остановленные, используйте флаг -a с docker ps.
docker ps -a
Это покажет остановленный контейнер со статусом Exited.
Остановка Docker Desktop с использованием опции detach
На этом шаге мы рассмотрим остановку контейнера с использованием концепции detach (отсоединения). Хотя сама команда docker stop не имеет опции detach в том же виде, что и docker run, принцип отсоединения неявно присутствует в работе docker stop при выполнении в терминале. Команда отправляет сигнал остановки и сразу возвращает управление терминалу, позволяя продолжить работу с другими задачами.
Давайте запустим ещё один контейнер, который мы остановим. В этот раз используем образ nginx. Сначала загрузим образ nginx, если его нет локально.
docker pull nginx
Теперь запустим контейнер nginx в detached mode (фоновом режиме).
docker run -d nginx
Получим ID запущенного контейнера nginx.
docker ps
Вы увидите вывод, похожий на этот, отображающий как предыдущий контейнер ubuntu (если вы его не удалили), так и новый контейнер nginx:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<nginx_container_id> nginx "nginx -g 'daemon off" X seconds ago Up X seconds 80/tcp <nginx_container_name>
<ubuntu_container_id> ubuntu "sleep infinity" Y minutes ago Exited Y minutes ago <ubuntu_container_name>
Теперь остановим контейнер nginx, используя его ID.
docker stop <nginx_container_id>
При выполнении docker stop команда отправляет сигнал остановки и немедленно возвращает управление терминалу. Это и есть "отсоединённое" поведение с точки зрения сессии терминала — вам не нужно ждать полной остановки контейнера, чтобы ввести следующую команду.
Проверим, что контейнер nginx остановился.
docker ps
Контейнер nginx больше не должен отображаться в списке работающих контейнеров.
Принудительная остановка Docker Desktop
На этом шаге мы научимся принудительно останавливать контейнер с помощью команды docker stop. Хотя по умолчанию docker stop отправляет корректный сигнал остановки (SIGTERM), иногда контейнер может не реагировать на этот сигнал и требует принудительной остановки. Это реализуется стандартным поведением docker stop, который отправляет SIGKILL после таймаута.
Давайте запустим контейнер, который может быть сложно остановить корректно. Снова используем простой контейнер ubuntu, но на этот раз сэмулируем процесс, игнорирующий сигнал SIGTERM.
docker run -d ubuntu sh -c 'trap "" SIGTERM; sleep infinity'
В этой команде:
trap "" SIGTERMуказывает оболочке игнорировать сигналSIGTERMsleep infinityподдерживает работу контейнера
Получим ID этого нового контейнера ubuntu.
docker ps
Вы должны увидеть новый работающий контейнер ubuntu:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<force_stop_container_id> ubuntu "sh -c 'trap \"\" SIGT…" X seconds ago Up X seconds <container_name>
<nginx_container_id> nginx "nginx -g 'daemon off" Y minutes ago Exited Y minutes ago 80/tcp <nginx_container_name>
<ubuntu_container_id> ubuntu "sleep infinity" Z minutes ago Exited Z minutes ago <ubuntu_container_name>
Теперь попробуем остановить этот контейнер стандартной командой docker stop с его ID.
docker stop <force_stop_container_id>
Поскольку контейнер игнорирует сигнал SIGTERM, docker stop будет ждать стандартный период ожидания (обычно 10 секунд), а затем отправит сигнал SIGKILL, который нельзя игнорировать. Это принудительно остановит контейнер. Вы можете заметить небольшую задержку перед завершением команды.
Проверим, что контейнер остановился.
docker ps
Контейнер больше не должен отображаться в списке работающих.
Также можно явно указать таймаут 0 секунд с флагом -t, чтобы немедленно отправить сигнал SIGKILL, фактически принудительно останавливая контейнер без периода ожидания. Мы рассмотрим флаг -t в следующем шаге.
Остановка Docker Desktop с таймаутом
На этом шаге мы научимся останавливать контейнер с заданным временем ожидания, используя флаг -t или --time с командой docker stop. Это позволяет указать, сколько времени Docker должен ждать корректного завершения контейнера после отправки сигнала SIGTERM, прежде чем принудительно остановить его с помощью SIGKILL.
Давайте запустим контейнер, который будем останавливать с таймаутом. Используем образ ubuntu и скрипт, ожидающий сигнала перед завершением.
docker run -d ubuntu sh -c 'trap "exit 0" SIGTERM; sleep infinity'
Эта команда запускает контейнер ubuntu в detached mode (фоновом режиме). Часть trap "exit 0" SIGTERM настраивает обработчик, который обеспечивает корректное завершение скрипта при получении сигнала SIGTERM. sleep infinity поддерживает работу контейнера до получения сигнала.
Получим ID этого нового контейнера ubuntu.
docker ps
Вы должны увидеть новый работающий контейнер ubuntu:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<timeout_container_id> ubuntu "sh -c 'trap \"exit 0\"…" X seconds ago Up X seconds <container_name>
<force_stop_container_id> ubuntu "sh -c 'trap \"\" SIGT…" Y minutes ago Exited Y minutes ago <container_name>
<nginx_container_id> nginx "nginx -g 'daemon off" Z minutes ago Exited Z minutes ago 80/tcp <nginx_container_name>
<ubuntu_container_id> ubuntu "sleep infinity" A minutes ago Exited A minutes ago <ubuntu_container_name>
Теперь остановим этот контейнер с таймаутом 5 секунд, используя флаг -t.
docker stop -t 5 <timeout_container_id>
Docker отправит сигнал SIGTERM и будет ждать 5 секунд. Поскольку наш контейнер настроен на корректное завершение при получении SIGTERM, он должен остановиться в течение этого периода. Если остановка не произойдет за 5 секунд, Docker отправит сигнал SIGKILL.
Проверим, что контейнер остановился.
docker ps
Контейнер больше не должен отображаться в списке работающих.
Использование флага -t полезно, когда вы хотите дать контейнеру определенное время для выполнения операций очистки перед принудительной остановкой.
Резюме
В этой лабораторной работе мы изучили базовое использование команды docker stop для управления работающими контейнерами. Мы начали с понимания того, что docker stop отправляет сигнал SIGTERM, а после периода ожидания - сигнал SIGKILL. Мы попрактиковались в остановке простого контейнера ubuntu, работающего в detached mode (фоновом режиме), определив его ID с помощью docker ps и выполнив docker stop <container_id>. Мы проверили статус остановки контейнера, повторно выведя список работающих контейнеров, а также научились просматривать все контейнеры, включая остановленные, с помощью docker ps -a.



