Как Docker обрабатывает завершение работы системы?

Как Docker обрабатывает завершение работы системы?

Этот вопрос уже задавался ранее.здесь на SOиздесь на Reddit. Однако ответ на этот вопрос так и не получен.

У меня есть наши Atlassian сервисы, работающие внутри контейнеров Docker. Однако мне интересно, что происходит, когда я даю shutdownкомандугостья. Он пытается изящно завершить работу контейнеров или пытается немедленно их убить? Каким-то образом я, похоже, не могу найти реальных ресурсов по этому вопросу, возможно, потому что я новичок в Docker.

Представьте себе следующее:

  1. У меня есть работающие контейнеры
  2. Я даю shutdownкоманду на выключениегостья безявно выдающийdocker stop

Что делает docker в таком случае? Могу ли я безопасно выполнить команду shutdownи ожидать, что мои контейнеры будут корректно завершены до того, как что-либо произойдет?

В моем случае я использую экземпляр Ubuntu Server 19.04, если это имеет значение, но вопрос касается более общего сценария / охватывающего основные дистрибутивы.

решение1

Ваши контейнеры должны получить сигнал SIGTERM, как и все другие процессы в системе.

Загвоздка в том, что SIGTERM получает главный процесс в контейнере (тот, который запущен ENTRYPOINT). Если контейнер запускает скрипт для запуска двоичного файла, это важно для execдвоичного файла, чтобы он стал процессом контейнера, в противном случае SIGTERM получает интерпретатор оболочки, который обычно не пересылает его дочернему процессу.

AFAIK docker stopсначала пытается отправить SIGTERM на контейнер и ожидает, что он выйдет в течение 10 секунд, если нет, то отправляет SIGKILL. Так что если ваши контейнеры быстро останавливаются, то все docker stopдолжно быть в порядке.

решение2

Есть теоретический подход (от @xenoid), и практический.

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

  1. Консоль.Хотя сеть может быть немедленно отключена, последовательность выключения все еще может занять некоторое время. Наблюдайте с консоли (некоторые хостинг-провайдеры предоставляют виртуальную консоль), как это происходит - сколько времени на самом деле занимает последовательность выключения, и что происходит между тем?

  2. Журналы.Из того, что я видел, контейнер базы данных часто вызывает беспокойство. Будет ли он убит или изящно завершен? Правда в журналах. Внимательно их изучите. Если вы загрузите систему и увидите эти журналы с временными метками выключения, то все будет хорошо:

.

2023-08-11 14:43:21 0 [Note] InnoDB: Starting shutdown...
[...]
2023-08-11 14:43:21 0 [Note] mariadbd: Shutdown complete
  1. Конфигурация времени выключения.Вы также можете изучить подробнее, как изменить параметры времени перезагрузки. Смотрите man systemd-system.confи проверьте этот параграф: DefaultTimeoutStartSec=, DefaultTimeoutStopSec=, DefaultTimeoutAbortSec=, DefaultRestartSec=. Значение по умолчанию — 90 секунд.

Связанный контент