Автозапуск контейнеров Podman

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

Это не означает, что Podman идеален и не имеет проблем. Одной из таких проблем является политика перезапуска. Контейнеры не будут автоматически перезапускаться после перезагрузки вашего сервера.

Podman

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

Если вы посмотрите на man-страницу podman-run, вы заметите, что опция --restart не запустит контейнер(ы) снова при перезагрузке системы.

Там сказано: "Обратите внимание, что опция --restart не перезапускает контейнеры после перезагрузки системы".

Это отличается от того, к чему вы, возможно, привыкли - от Docker. Причиной такого поведения является архитектура Podman без демонов.

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

Но отсутствие демона означает, что Podman не запускается при загрузке, поэтому контейнеры также не запускаются при загрузке.

Решение: systemd

Любите вы его или ненавидите, но выбранный вами дистрибутив наверняка использует systemd в качестве системы инициализации. Лучше всего использовать ее с пользой!

Запуск контейнера

Запустить контейнер можно разными способами. Возможно, вам нужен простой контейнер, и вы используете команду podman run. Вы можете использовать файл docker, если у вас сложная конфигурация.

Для демонстрации я создам контейнер на основе образа контейнера mariadb и назову свой контейнер chitragupta-db.

Теперь, когда контейнер запущен, я приступаю к следующему шагу.

Создайте службу systemd

Как я уже говорил, Podman - это программное обеспечение для управления контейнерами без демонов. Следовательно, запуск контейнеров, управляемых podman, должен управляться извне.

Я продемонстрирую, как это сделать, используя systemd.

systemd - это система init, которая управляет службами/демонами в операционных системах на базе Linux. Поэтому она является идеальным кандидатом для решения нашей проблемы.

Файл systemd unit для вашего контейнера не нужно создавать вручную. Для этого существует удобная команда. Это команда podman generate systemd, синтаксис которой следующий:

Чтобы создать файл systemd unit для вашего контейнера, используйте команду podman generate systemd вместе с именем вашего контейнера.

В моем случае я назвал свой контейнер test-d, поэтому я буду использовать это имя.

Как видите, эта конкретная команда podman сделала всю работу за нас. Но это не особенно полезно... пока.

Вывод podman generate systemd - это то, что вы должны иметь в файле unit для вашей службы. Но зачем копировать? Команда podman также поставляется с удобной опцией --files (или -f для краткости).

Использование опции --files позволит заполнить файл необходимым содержимым вместо того, чтобы выводить его на консоль/терминал. Использование этой опции создаст файл с именем container-CONTAINER_NAME.service в вашем текущем рабочем каталоге.

В моем случае имя моего контейнера - test-d, он создал файл container-test-d.service в моем текущем рабочем каталоге.

Поскольку команда podman generate systemd создает файл systemd unit, вы также можете использовать опции --after=, --requires=, --wants=, чтобы указать соответствующие зависимости для вашего контейнера(ов).

Как вы могли заметить, указанная команда podman создаст новый файл systemd unit в вашем текущем рабочем каталоге. Но поскольку контейнер (по крайней мере, в моем случае) не имеет root, его нужно запустить от имени обычного пользователя, а не от root.

Для этого созданный файл systemd unit должен быть помещен в каталог ~/.config/systemd/user/. Смените каталог и сгенерируйте файл systemd в указанном каталоге.

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

Теперь осталось только включить его.

Включение службы systemd

Теперь, когда podman автоматически создал файл systemd unit в нужном месте (~/.config/systemd/user/), пришло время включить эту службу.

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

Для этого используйте следующий синтаксис команды:

Ваш результат должен быть похож на то, что показано ниже:

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

Не беспокойтесь о том, что статус службы неактивен (мертв). Контейнер test-d все еще работает, и вы еще не перезагрузились ;)

Включение режима ожидания пользователя

Как вы уже знаете, эта служба запускается обычным пользователем (в моем случае это user), а не пользователем root. Это означает, что данный пользователь должен быть зарегистрирован при загрузке и оставаться активным, даже если он вышел из сеанса GUI или TTY.

Этого можно добиться с помощью команды loginctl. В терминальной сессии пользователя выполните следующую команду:

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

Наконец, был включен повторный запуск контейнеров, управляемых Podman, при загрузке. При перезагрузке автоматически перезапускаются контейнеры, для которых вы создали файл systemd unit и включили их.

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

Заключение

Это руководство поможет вам в процессе создания файлов модулей systemd для управления автозапуском контейнеров, управляемых Podman, при загрузке. Использование systemd помогает администратору следить за контейнерами с помощью знакомого многим интерфейса systemd.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий