Имеете проблемы с остановкой контейнеров Docker? Найти правильный способ остановить контейнер сложно, учитывая возможность создания множества различных контейнеров. В этой статье вы узнаете команды Docker для остановки отдельного контейнера или всех контейнеров.
Читайте далее, чтобы узнать больше!
Предварительные требования
Для следования этому руководству убедитесь, что у вас есть следующее:
- Windows 10 – В данном руководстве используется Windows для запуска Docker, но вы также можете применить те же самые общие шаги для Linux или macOS.
- Docker Desktop – В данном руководстве используется версия 3.5.2. Docker engine доступен, если вы используете Linux, так как GUI отсутствует.
- A running Docker container or containers.
Остановка контейнеров с помощью команды docker stop Containers
Давайте начнем с первой команды: команды docker stop
containers и как она осуществляет остановку контейнеров.
Например, предположим, что вам нужно остановить работающий контейнер с именем mystifying_hofstadter
и ID fb66ed502096
. Как показано в приведенном ниже примере, остановите контейнер с помощью команды docker stop containers
.

Что если у вас есть несколько запущенных контейнеров, и вы хотели бы остановить их? Команда docker stop
поддерживает остановку нескольких идентификаторов контейнеров по одному.
Сначала перечислите все контейнеры с помощью команды docker ps
и передайте идентификаторы контейнеров в команду docker stop
, как показано ниже.

Что если вы хотите остановить все запущенные контейнеры, не извлекая идентификаторы контейнеров вручную и не передавая их в docker stop
? Команда docker ps -q
выполнит это. Параметр -q
команды docker ps
выводит только идентификаторы контейнеров.

Конструкция
$(docker ps -q)
выше является подвыражением как в Bash на Linux, так и в PowerShell на Windows. Подвыражение указывает оболочке обработать один набор командdocker ps -q
сначала, а затем вернуть набор результатов исходной командеdocker stop
.
Команда docker stop
контейнеров использует сигнал SIGTERM. Сигналы Linux информируют процесс о событии, но решение о том, как действовать на данный сигнал, остается за процессом.
При использовании сигнала SIGTERM Docker использует сигнал для грациозной остановки процесса, ожидая стандартные 10
секунд перед отправкой сигнала SIGKILL, который немедленно завершает процесс.
Остановка контейнера с использованием сигналов процесса
Вы узнали о стандартном поведении Docker (сигнал остановки) с помощью команды docker stop
контейнеров при остановке контейнера. Но вам может не понравиться стандартное поведение. Вместо этого вы можете настроить Docker на использование альтернативных сигналов остановки.
С флагом --stop-signal
команды docker run
вы можете указать сигнал остановки при запуске контейнера. Этот флаг устанавливает сигнал, который будет отправлен работающему контейнеру, когда вы захотите его остановить.
В приведенном ниже примере флаг --stop-signal
принимает значение SIGQUIT
, что указывает Docker отправлять сигнал SIGQUIT при необходимости остановить контейнер. В примере также используются следующие параметры:
d
– Runs the container in detached (background) mode. The detached mode will not allow the container to be immediately interacted with by the user since the process is running in the background.t
– allocates a Pseudo-TTY (PTY) console, which emulates a real terminal console in the container and stops the Ubuntu container from immediately exiting. The Ubuntu container in the example requires a PTY console to stay active in the background.- “имя образа” – какой образ Docker использовать для создания контейнера, в данном случае образ
ubuntu
.

SIGQUIT
as the signal when starting and then stopping a Docker container. Вы также можете указать сигнал остановки, используя файл Dockerfile, который указывает Docker, как собирать контейнер. Вы можете добавить запись в Dockerfile, указывающую сигнал остановки с помощью
STOPSIGNAL SIGQUIT
, например. Вы можете заменитьSIGQUIT
на любой сигнал остановки, который вам нравится.
Немедленное завершение контейнеров с помощью docker kill
Бывают моменты, когда вам захочется немедленно завершить контейнеры без предоставления им периода грации. Команда docker kill
немедленно останавливает контейнер.
В приведенном ниже примере контейнер с идентификатором 2aa318273db5
передается в docker kill
. Контейнер немедленно завершится по сигналу SIGKILL. Контейнеру не будет предоставлен период грации для завершения. В результате выполнения команды контейнер завершится, и будет показан его идентификатор.
Остановка всех контейнеров и удаление их с помощью команды
docker kill $(docker ps -q)
. Обратите внимание, что(docker ps -q
) здесь является подвыражением.
Остановка и удаление контейнера с помощью docker rm
По умолчанию, при создании контейнера этот контейнер создается таким же, как и раньше: он идемпотентен. Удаление контейнера будет иметь минимальное воздействие, и с этим в виду, docker rm
может принудительно остановить и удалить контейнер. Docker отправляет сигнал SIGKILL
основному процессу и удаляет контейнер из списка доступных контейнеров в вашей установке Docker.
Если контейнер должен сохранить измененные внутренние файлы или его состояние должно быть сохранено, то удаление контейнера уничтожит эти изменения. Остерегайтесь потенциальных накладок!
В следующем примере, возможно, вы запустили контейнер, который был назван kind_galileo
. Перед удалением контейнера контейнер должен быть остановлен, как показано ниже. Команда docker ps -a
отображает статус Exited
для примера контейнера.

Теперь, когда контейнер остановлен, выполнение команды docker rm
полностью удалит контейнер.
Вместо того чтобы останавливать контейнер, а затем удалять его, комбинация --force
и docker rm
остановит и удалит контейнер одновременно. Контейнер laughing_elion
больше не будет доступен для запуска.
Если вы не укажете команду
--force
, вы столкнетесь с сообщением об ошибкеError response from daemon: You cannot remove a running container...

Остановка контейнеров Docker с помощью Docker Compose
Команды Docker обычно используются для одного контейнера, но вы можете создать службу с несколькими контейнерами, работающими в согласовании друг с другом. Инструмент Docker Compose позволяет настраивать службу, состоящую из нескольких контейнеров, чтобы они работали вместе.
Поскольку контейнеры в рамках службы предназначены для совместной работы, лучше всего остановить саму службу целиком, а не отдельный контейнер.
Если у вас работает служба с несколькими контейнерами, [docker-compose stop]
останавливает службу без удаления контейнеров или самой службы. Продолжайте далее, чтобы создать службу Docker Compose, запустить службу и в конечном итоге грациозно остановить службу.
1. Создайте каталог для хранения файла конфигурации. В этом примере файл будет храниться в каталоге C:\Articles\Ubuntu.
2. Затем создайте файл docker-compose.yml, содержащий следующую конфигурацию. Приведенный ниже файл Docker Compose создает службу с двумя контейнерами Ubuntu, и при их запуске контейнеры не завершаются немедленно.
3. В сеансе терминала перейдите в каталог вашего пользовательского файла конфигурации Docker, который в этом примере находится в C:\Articles\Ubuntu. Запустите docker-compose up -d
, чтобы создать и запустить службу, созданную на предыдущем шаге, в фоновом режиме, как указано опцией -d
.

4. В том же сеансе терминала и каталоге введите команду docker-compose stop
, чтобы завершить службу и контейнеры корректно.

Команда
docker-compose
, подобно командеdocker
, также имеет параметрыrm --force
иkill
. Параметрыdocker-compose
работают с службой вместо отдельного контейнера. Командаdocker-compose kill
также принимает параметр-s
, чтобы указать сигнал остановки.
Заключение
Контейнеры Docker – мощный инструмент для создания уникальных и сегментированных сред для разработки и использования в производстве. В этой статье вы узнали несколько способов остановки одного или нескольких контейнеров, даже всех. Вы также узнали о сигнале остановки по умолчанию, используемом Docker, и о том, как его изменить.
Имея эти знания, теперь вы знаете все тонкости остановки контейнеров Docker и как не накосячить, когда наступает время остановки запущенных контейнеров. Как вы планируете останавливать свои контейнеры теперь, обладая этими новыми знаниями?
Source:
https://adamtheautomator.com/docker-stop-containers/