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

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

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

Введение

В этой лабораторной работе вы научитесь корректно останавливать Docker-контейнеры с помощью команды docker container 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-555124{{"Как использовать команду docker container stop для корректной остановки контейнеров"}} docker/ps -.-> lab-555124{{"Как использовать команду docker container stop для корректной остановки контейнеров"}} docker/stop -.-> lab-555124{{"Как использовать команду docker container stop для корректной остановки контейнеров"}} docker/pull -.-> lab-555124{{"Как использовать команду docker container stop для корректной остановки контейнеров"}} end

Создание и запуск простого контейнера

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

Сначала загрузим простой образ из Docker Hub. Мы будем использовать образ hello-world, который представляет собой очень маленький образ, просто выводящий сообщение и завершающий работу.

docker pull hello-world

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

Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

Теперь, когда у нас есть образ, мы можем запустить контейнер на его основе. Используйте команду docker run:

docker run hello-world

При выполнении этой команды Docker создаст новый контейнер из образа hello-world. Контейнер выполнит команду, определённую в образе, которая в данном случае выводит сообщение в консоль.

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Этот вывод подтверждает, что ваша установка Docker работает корректно, и вы успешно запустили свой первый контейнер. Контейнер выполнил программу hello-world и завершил работу.

Чтобы увидеть все запущенные контейнеры, включая завершённые, используйте команду docker ps -a:

docker ps -a

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

CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                      PORTS     NAMES
<container_id>   hello-world   "/hello"   About a minute ago   Exited (0) About a minute ago             <container_name>

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

Остановка контейнера с использованием сигнала и таймаута по умолчанию

На этом шаге вы узнаете, как остановить работающий Docker-контейнер с использованием сигнала и таймаута по умолчанию. При остановке контейнера Docker отправляет сигнал основному процессу внутри контейнера. По умолчанию Docker отправляет сигнал SIGTERM, который указывает процессу завершить работу корректно. Если процесс не завершается в течение стандартного периода ожидания (обычно 10 секунд), Docker отправляет сигнал SIGKILL для принудительного завершения процесса.

Сначала запустим контейнер, который будет работать продолжительное время. Мы будем использовать образ ubuntu и выполним простую команду, которая поддерживает работу контейнера.

docker pull ubuntu

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

Using default tag: latest
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

Теперь запустим контейнер ubuntu в detached-режиме (-d), чтобы он работал в фоновом режиме, и выполним команду, которая будет поддерживать его работу бесконечно (например, tail -f /dev/null).

docker run -d ubuntu tail -f /dev/null

Эта команда выведет ID контейнера.

<container_id>

Вы можете проверить, что контейнер работает, с помощью команды docker ps:

docker ps

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

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Up About a minute ago             <container_name>

Теперь остановим этот работающий контейнер с помощью команды docker stop. Вы можете использовать либо ID контейнера, либо его имя. Замените <container_id> на фактический ID вашего работающего контейнера.

docker stop <container_id>

Команда выведет ID остановленного контейнера.

<container_id>

После выполнения команды docker stop контейнер получит сигнал SIGTERM. Docker будет ждать в течение стандартного таймаута (10 секунд) для корректной остановки контейнера. Если контейнер не остановится за это время, будет отправлен сигнал SIGKILL.

Вы можете проверить, что контейнер остановлен, снова выполнив команду docker ps.

docker ps

Контейнер ubuntu больше не должен отображаться в выводе docker ps (который показывает только работающие контейнеры). Чтобы увидеть все контейнеры, включая остановленные, используйте docker ps -a.

docker ps -a

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

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Exited (0) About a minute ago             <container_name>

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

Остановка контейнера с пользовательским таймаутом

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

Мы будем использовать тот же образ ubuntu и команду из предыдущего шага для запуска долгоиграющего контейнера.

Сначала запустим контейнер ubuntu в detached-режиме (-d) с командой tail -f /dev/null:

docker run -d ubuntu tail -f /dev/null

Эта команда выведет ID контейнера.

<container_id>

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

docker ps

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

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Up About a minute ago             <container_name>

Теперь остановим контейнер командой docker stop, но на этот раз укажем таймаут с помощью флага -t или --time. Установим таймаут в 5 секунд. Замените <container_id> на фактический ID вашего работающего контейнера.

docker stop -t 5 <container_id>

Команда выведет ID остановленного контейнера.

<container_id>

При использовании docker stop -t 5 Docker отправляет сигнал SIGTERM и ожидает 5 секунд для остановки контейнера. Если контейнер продолжает работать после 5 секунд, Docker отправит сигнал SIGKILL.

Проверим, что контейнер остановлен, выполнив команду docker ps -a:

docker ps -a

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

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Exited (0) About a minute ago             <container_name>

Вы успешно остановили контейнер с пользовательским таймаутом в 5 секунд.

Остановка контейнера с пользовательским сигналом

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

Мы снова будем использовать образ ubuntu и команду tail -f /dev/null для поддержания работы контейнера.

Запустим контейнер ubuntu в detached-режиме (-d):

docker run -d ubuntu tail -f /dev/null

Эта команда выведет ID контейнера.

<container_id>

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

docker ps

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

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Up About a minute ago             <container_name>

Теперь остановим контейнер командой docker stop, указав пользовательский сигнал с помощью флага --signal. Например, отправим сигнал SIGKILL напрямую. Замените <container_id> на фактический ID вашего работающего контейнера.

docker stop --signal SIGKILL <container_id>

Команда выведет ID остановленного контейнера.

<container_id>

При использовании docker stop --signal SIGKILL Docker немедленно отправляет сигнал SIGKILL основному процессу в контейнере. Этот сигнал не может быть перехвачен или проигнорирован процессом, поэтому он завершается принудительно без периода корректного завершения.

Проверим, что контейнер остановлен, выполнив команду docker ps -a:

docker ps -a

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

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Exited (137) About a minute ago             <container_name>

Обратите внимание, что код завершения может отличаться (например, 137) при остановке контейнера с помощью SIGKILL, так как это указывает на некорректное завершение работы.

Вы успешно остановили контейнер, отправив пользовательский сигнал.

Итоги

В этой лабораторной работе вы изучили основные этапы работы с Docker-контейнерами. Вы начали с загрузки простого образа (hello-world) из Docker Hub, а затем запустили контейнер на основе этого образа. Это продемонстрировало базовый процесс создания и выполнения контейнера, а вы проверили его успешное завершение, проверив статус контейнера с помощью команды docker ps -a.

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