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



