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

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

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

Введение

В этой лабораторной работе вы научитесь эффективно управлять контейнерами Docker с помощью команды docker stop. Мы рассмотрим базовое использование команды для остановки работающего контейнера, изучим различные параметры управления процессом остановки, включая принудительную остановку контейнера и установку таймаута для операции остановки. К концу этой лабораторной работы вы будете уверенно использовать docker stop для корректного и принудительного завершения работы ваших контейнеров Docker.


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/stop("Stop Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555150{{"Как использовать команду docker desktop stop для управления Docker Desktop"}} docker/ps -.-> lab-555150{{"Как использовать команду docker desktop stop для управления Docker Desktop"}} docker/stop -.-> lab-555150{{"Как использовать команду docker desktop stop для управления Docker Desktop"}} docker/pull -.-> lab-555150{{"Как использовать команду docker desktop stop для управления Docker Desktop"}} end

Основы использования команды docker 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 указывает оболочке игнорировать сигнал SIGTERM
  • sleep 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.