Используйте Docker для остановки контейнеров без ненужных проблем!

Имеете проблемы с остановкой контейнеров 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 mystifying_hofstadter
# Остановить контейнер по идентификатору (тот же контейнер)
docker stop fb66ed50209
Stopping a single Docker container via the container name or container ID.

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

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

# Перечислить все запущенные контейнеры
docker ps
# Остановить следующие контейнеры Docker по идентификатору контейнера
docker stop a427a21c5558 e9dbd816f24c 31269ef5999e
Listing all running containers and then stopping them

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

# Создать три контейнера. Точка с запятой разделяет каждую команду
docker run -d -t ubuntu; docker run -d -t ubuntu; docker run -d -t ubuntu
# Перечислить все запущенные контейнеры
docker ps -q
# Извлечь все запущенные идентификаторы контейнеров и передать их в docker stop
docker stop $(docker ps -q)
Stopping multiple Docker containers at once.

Конструкция $(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.
docker run -d -t --stop-signal SIGQUIT ubuntu
Specifying 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 2aa318273db5

Остановка всех контейнеров и удаление их с помощью команды docker kill $(docker ps -q). Обратите внимание, что (docker ps -q) здесь является подвыражением.

Остановка и удаление контейнера с помощью docker rm

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

Если контейнер должен сохранить измененные внутренние файлы или его состояние должно быть сохранено, то удаление контейнера уничтожит эти изменения. Остерегайтесь потенциальных накладок!

В следующем примере, возможно, вы запустили контейнер, который был назван kind_galileo. Перед удалением контейнера контейнер должен быть остановлен, как показано ниже. Команда docker ps -a отображает статус Exited для примера контейнера.

Listing all containers, including stopped containers.

Теперь, когда контейнер остановлен, выполнение команды docker rm полностью удалит контейнер.

docker rm kind_galileo

Вместо того чтобы останавливать контейнер, а затем удалять его, комбинация --force и docker rm остановит и удалит контейнер одновременно. Контейнер laughing_elion больше не будет доступен для запуска.

docker rm --force laughing_elion

Если вы не укажете команду --force, вы столкнетесь с сообщением об ошибке Error response from daemon: You cannot remove a running container...

Stopping and removing a container.

Остановка контейнеров Docker с помощью Docker Compose

Команды Docker обычно используются для одного контейнера, но вы можете создать службу с несколькими контейнерами, работающими в согласовании друг с другом. Инструмент Docker Compose позволяет настраивать службу, состоящую из нескольких контейнеров, чтобы они работали вместе.

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

Если у вас работает служба с несколькими контейнерами, [docker-compose stop] останавливает службу без удаления контейнеров или самой службы. Продолжайте далее, чтобы создать службу Docker Compose, запустить службу и в конечном итоге грациозно остановить службу.

1. Создайте каталог для хранения файла конфигурации. В этом примере файл будет храниться в каталоге C:\Articles\Ubuntu.

mkdir C:\Articles\Ubuntu

2. Затем создайте файл docker-compose.yml, содержащий следующую конфигурацию. Приведенный ниже файл Docker Compose создает службу с двумя контейнерами Ubuntu, и при их запуске контейнеры не завершаются немедленно.

# Спецификация версии docker-compose
version: "3.9"
# Набор приложений, составляющих эту службу
services:
  # Первый контейнер Ubuntu
  container1:
    image: ubuntu
    # То же самое, что и опция -t, и выделяет псевдо-TTY, чтобы контейнер не завершался немедленно.
    tty: true
  # Второй контейнер Ubuntu
  container2:
    image: ubuntu
    tty: true

3. В сеансе терминала перейдите в каталог вашего пользовательского файла конфигурации Docker, который в этом примере находится в C:\Articles\Ubuntu. Запустите docker-compose up -d, чтобы создать и запустить службу, созданную на предыдущем шаге, в фоновом режиме, как указано опцией -d.

Starting a Docker Compose service.

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

Stopping a Docker Compose service.

Команда docker-compose, подобно команде docker, также имеет параметры rm --force и kill. Параметры docker-compose работают с службой вместо отдельного контейнера. Команда docker-compose kill также принимает параметр -s, чтобы указать сигнал остановки.

Заключение

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

Имея эти знания, теперь вы знаете все тонкости остановки контейнеров Docker и как не накосячить, когда наступает время остановки запущенных контейнеров. Как вы планируете останавливать свои контейнеры теперь, обладая этими новыми знаниями?

Source:
https://adamtheautomator.com/docker-stop-containers/