Systemd остановил демон Docker без очевидной причины.

Вопрос или проблема

Я пытаюсь разобраться, почему systemd отправил сигнал завершения в dockerd. Это связано с этой постом на stackoverflow.

$ journalctl -r

Dec 01 06:25:05 ip-10-38-4-210 dockerd[2218]: time="2020-12-01T06:25:05.867748396Z" level=info msg="Обрабатываю сигнал 'terminated'"
Dec 01 06:25:05 ip-10-38-4-210 systemd[1]: Остановка движка контейнеров Docker...
Dec 01 06:25:03 ip-10-38-4-210 CRON[23453]: pam_unix(cron:session): сессия закрыта для пользователя root
Dec 01 06:25:01 ip-10-38-4-210 systemd[1]: Запуск ежедневного обновления apt и чистки...
Dec 01 06:25:01 ip-10-38-4-210 CRON[23454]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
Dec 01 06:25:01 ip-10-38-4-210 CRON[23453]: pam_unix(cron:session): сессия открыта для пользователя root (uid=0)
Dec 01 06:17:01 ip-10-38-4-210 CRON[23441]: pam_unix(cron:session): сессия закрыта для пользователя root
Dec 01 06:17:01 ip-10-38-4-210 CRON[23442]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Dec 01 06:17:01 ip-10-38-4-210 CRON[23441]: pam_unix(cron:session): сессия открыта для пользователя root (uid=0)
Dec 01 06:06:54 ip-10-38-4-210 CRON[23406]: pam_unix(cron:session): сессия закрыта для пользователя root

Последняя запись в журнале перед остановкой docker – это CRON[23453]: pam_unix(cron:session): сессия закрыта для пользователя root, может быть, это как-то связано с вашей проблемой?

Это на Ubuntu 16.04.6 LTS на x86-64

В данном конкретном случае, причиной, заставляющей systemd остановить сервис docker, похоже, является служба автоматических обновлений Ubuntu, применяющая обновления для версии пакета containerd в Ubuntu. Есть открытая проблема, показывающая, что многие другие столкнулись с той же проблемой сегодня:

https://bugs.launchpad.net/ubuntu/+source/containerd/+bug/1870514

В связанной проблеме журнал включает:

Apr 03 06:09:31 server systemd[1]: Запуск ежедневного обновления apt и чистки...
...
Apr 03 06:09:43 server systemd[1]: Остановка движка контейнеров Docker...

Моя рекомендованная поправка – установить docker из официальных репозиториев Docker, которые, похоже, не имеют этой проблемы:

https://docs.docker.com/engine/install/ubuntu/

Я знаю, что уже есть принятый ответ, но …

Последняя запись в журнале перед остановкой docker – это CRON[23453]: pam_unix(cron:session): сессия закрыта для пользователя root, может быть, это как-то связано с вашей проблемой?

Да, это действительно кажется связанным, но не в этом контексте, все же отвечая здесь, чтобы люди, использующие docker без root, которые наткнутся на это в будущем, могли найти решение.

Я настроил docker в режиме без root и попробовал
запустить долгоживущие контейнеры docker в отключенном режиме (-d флаг) под своим пользователем ubuntu (это был экземпляр AWS Lightsail). Это привело к тому, что
мой демо́н docker и, следовательно, мои контейнеры корректно завершили работу.

Решение

Включите режим Linger

sudo loginctl enable-linger $USER

Для уверенности, отредактируйте /etc/systemd/logind.conf и добавьте следующие
строки в конец.

UserStopDelaySec=infinity
KillUserProcesses=no

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

sudo reboot

Виновник

Виновником оказалась systemd и то, как она обрабатывает процессы, запущенные сессиями входа (к которым также относятся сессии терминала SSH). По умолчанию systemd отправляет SIGTERM процессам через 10s после выхода пользователя согласно документации.

UserStopDelaySec=

Указывает, как долго хранить запись о пользователе и услуги для пользователя [email protected] после того, как он полностью вышел. Если установлено в ноль, служба для пользователя завершится немедленно, когда последняя сессия пользователя завершится. Если эта опция настроена на ненулевое значение, циклы быстрого выхода/входа ускоряются, поскольку менеджер услуг пользователя не перезапускается постоянно. Если установлено “бесконечность”, служба для пользователя никогда больше не прекращается после первого входа и продолжает работать до завершения работы системы. По умолчанию 10 секунд.

KillUserProcesses=

Принимает логическое значение. Настраивает, должны ли процессы пользователя быть убиты, когда пользователь выходит из системы. Если true, то единица областей, соответствующая сессии, и все процессы внутри этой области будут завершены. Если false, область “брошена”, смотрите systemd.scope(5), и процессы не будут убиты. По умолчанию “нет”, но смотрите параметры KillOnlyUsers= и KillExcludeUsers= ниже.

Если, конечно, режим linger не включен, документировано здесь

enable-linger [USER...], disable-linger [USER...]

Включает/выключает пользователю linger для одного или нескольких пользователей. Если включено для конкретного пользователя, менеджер пользователя создается для пользователя при загрузке и удерживается после выхода. Это позволяет пользователям, которые не вошли в систему, запускать долгоживущие службы. Принимает одно или несколько имен пользователей или числовых UID в качестве аргумента. Если аргумент не указан, включает/выключает linger для пользователя сессии вызывающего.

Я написал об этом в блоге с некоторыми подробностями, если вы хотите это проверить.

Ответ или решение

Ситуация, когда systemd неожиданно отправляет сигнал об остановке демон Docker (dockerd), может быть вызвана несколькими факторами, и важно тщательно исследовать причины.

Возможные причины остановки Docker

На основе приведённого вами лога, видно, что перед тем как Docker был остановлен, выполнялись задачи CRON, связанные с обновлениями системы. В частности, сообщение в журнале systemd гласит:

Dec 01 06:25:05 ip-10-38-4-210 dockerd[2218]: time="2020-12-01T06:25:05.867748396Z" level=info msg="Processing signal 'terminated'"
Dec 01 06:25:05 ip-10-38-4-210 systemd[1]: Stopping Docker Application Container Engine...

Это указывает на то, что действие, которое инициировало остановку Docker, может быть связано с фоновыми процессами, выполняемыми системой.

Специфика автоматических обновлений

Как вы отметили, причина остановки Docker может быть связана с сервисом автоматических обновлений в Ubuntu, который может перезагружать или останавливать некоторые службы, в том числе и Docker, если он зависит от каких-либо обновляемых пакетов (например, containerd). Это подтверждается существованием открытой проблемы, где многие пользователи сталкиваются с аналогичными проблемами:

Открытая проблема Launchpad

В данном случае рекомендуется установить Docker из официальных репозиториев Docker вместо стандартных репозиториев Ubuntu, так как это может помочь избежать данных проблем. Инструкции по установке можно найти здесь:

Документация Docker по установке на Ubuntu

Дополнительные рекомендации для решения проблем с Docker в режиме без прав суперпользователя (rootless)

Если вы используете Docker в режиме без прав суперпользователя и сталкиваетесь с его неожиданными остановками, есть несколько шагов, которые могут помочь:

  1. Включите Linger для вашего пользователя:
    Это позволит запустить сервисы для пользователя даже после выхода из системы.

    sudo loginctl enable-linger ваш_пользователь
  2. Настройка конфигурации systemd:
    Измените файл конфигурации /etc/systemd/logind.conf, добавив следующие строки в конец файла:

    UserStopDelaySec=infinity
    KillUserProcesses=no

    После внесения изменений перезагрузите систему:

    sudo reboot

Заключение

Проблемы с неожиданной остановкой Docker часто связаны с поведением systemd и его управлением процессами пользователей. Важно учитывать, что по умолчанию systemd отправляет сигнал SIGTERM процессам через 10 секунд после выхода пользователя. Настройка параметров UserStopDelaySec и KillUserProcesses может помочь устранить эту проблему, позволяя вашему Docker работать более устойчиво.

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

Оцените материал
Добавить комментарий

Капча загружается...