2

Я работаю со многими сервисами (базами данных, веб-серверами ...), реализованными посредством контейнеров 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. Но когда я выключаю систему, она показывает:

Скриншот виртуальной машины 1 Снимок экрана 2 виртуальной машины Скриншот 3 виртуальной машины

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

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

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

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

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

1 ответ1

0

Решение, которое больше не поддерживается, - это 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 - это контейнер приложений, разработанный для современных производственных облачных сред. В нем реализован собственный подход, подключаемая среда выполнения и четко определенная площадь поверхности, что делает его идеальным для интеграции с другими системами.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .