Как правильно обрабатывать Docker-контейнер как сервис systemd?

Я работаю со многими сервисами (базами данных, веб-серверами...), реализованными через контейнеры Docker через модули systemd. Это работает, но системе требуется очень много времени для выключения, очевидно, ожидая завершения работы служб докера.

Вот пример модуля systemd, который я сделал на виртуальной машине под Debian Stretch с Docker CE:

/lib/systemd/system/mariadb.service

[Unit]
Description=MariaDB
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
Restart=always
ExecStart=/usr/bin/docker run --rm \
    --name=mariadb \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=root \
    -e MYSQL_DATABASE=test \
    -e MYSQL_USER=user \
    -e MYSQL_PASSWORD=user \
    -v /var/lib/mysql:/var/lib/mysql \
    mariadb:latest
ExecStop=-/usr/bin/docker stop mariadb # See UPDATEs 1 & 2

[Install]
WantedBy=multi-user.target

Служба запускается и останавливается правильно в считанные секунды, когда я использую команду systemctl. Но когда я выключил систему, он показывает:

Это длится более 3 минут. Это может быть дольше, если через systemd запущено много контейнеров.

Проблема не характерна для MariaDB.

Есть ли лучший способ для обработки докер-контейнеров через systemd, избегая дополнительного времени выключения?

  • ОБНОВЛЕНИЕ 1: как предложил Беннетт Хардвик в комментарии, я попытался удалить директиву ExecStop из определения службы. Кажется, лучше, так как обслуживание останавливается после 1 минуты 30, а не 3 минут.

  • ОБНОВЛЕНИЕ 2: я попытался добавить параметр -t к команде остановки докера в директиве ExecStop ( https://docs.docker.com/engine/reference/commandline/stop/). Это не имеет никакого эффекта.

1 ответ

Решение, которое больше не поддерживается, - это systemd-docker, описываемое как:

Это оболочка для запуска Docker, позволяющая разумно запускать Docker-контейнеры под systemd. Главное, что делает этот упаковщик, - это перемещает процесс контейнера из настройки cgroups, установленной Docker, в cgroup сервисного подразделения. Это обрабатывает множество других причуд, поэтому, пожалуйста, прочитайте документацию, чтобы понять все последствия запуска Docker под systemd.

Используя эту оболочку, вы можете управлять контейнерами через systemctl или интерфейс командной строки Docker, и все должно оставаться в синхронизации. Кроме того, вы можете использовать все функции cgroup для systemd и systemd-notify.

Проблема получения systemd-docker для работы с последними версиями Linux обсуждается в посте Не работает с последними выпусками systemd и / или docker, где пользователь с именем james-cxx сообщил об успехе:

Мне удалось заставить systemd-docker работать с Ubuntu 18.04:

Я предполагаю, что по умолчанию Docker не использует systemd для cgroups, потому что "проблемы с делегатами все еще существуют, и в настоящее время systemd не поддерживает набор функций cgroup, необходимый для контейнеров, запускаемых docker" (согласно файлу модуля docker.service), и я ожидаю, что systemd -docker ожидает systemd для cgroups, поэтому open /sys/fs/cgroup/system.slice/docker.service/cgroup.procs: no such file or directory ошибка. настройка --cgroups name=systemd очевидно, переопределяет стандартную настройку докера, однако я не могу сказать, какие побочные эффекты это может иметь, учитывая зловещее примечание в файле модуля docker.service.

Альтернативой systemd-docker может быть использование rkt, описанного как:

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

Другие вопросы по тегам