Привет Хабр! На связи Рустем, IBM Senior DevOps Engineer & Integration Architect, также являюсь официальным DevOps ментором и коучем в IBM.

Сегодня я хотел бы вывести на обзор интересную тему из экзамена Red Hat Certified System Administrator, а именно “Auto-starting Rootless Containers”

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

Сегодня я вам расскажу:

  • Как настроить учетные записи пользователей для автоматического запуска модулей systemd.

  • Как запустить безрутовый контейнер.

  • Как автоматически запустить контейнер без рута с помощью systemd.

Шаг 1: Мы создаем и настраиваем пользователя для автоматического запуска юнитов systemd

Для работы с контейнерами нам необходимо установить соответствующее программное обеспечение:

Для начала нам понадобится учетная запись пользователя без root-прав для запуска контейнеров, также не имеющих полномочий root. Мы используем следующие команды для создания условного пользователя linda и устанавливаем пароль «password»:

Затем вам нужно включить функцию linger для пользователя, которая позволяет пользователю автоматически запускать файлы системных юнитов:

Проверим linger

Шаг 2: Запускаем контейнер от имени пользователя

Теперь, когда мы настроили локальную учетную запись пользователя, нам нужно войти в систему как этот конкретный пользователь. Это должен быть настоящий логин, su не работает. Давайте используем ssh для входа на локальный хост как пользователь linda:

На данный момент мы готовы запустить контейнер. Давайте запустим контейнер nginx:

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

Шаг 3: Генерируем юнит-файл systemd для автозапуска контейнера

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

После перехода в директорию, где будет храниться файл конфигурации, мы можем сгенерировать юнит-файл systemd для автозапуска контейнера:

Предыдущая команда создала файл модуля systemd с именем container-mynginx.service. Давайте посмотрим на содержимое созданного файла модуля systemd:

Теперь убеждаемся, что systemd подхватывает новый конфигурационный файл:

Шаг 4. Указываем systemd автоматически запускать пользовательский контейнер при загрузке

Мы уже почти закончили! На этом этапе давайте передадим полный контроль systemd. Для этого нам сначала нужно остановить контейнер в podman:

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

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

Также мы проверяем, что мы все еще можем видеть контейнер в podman:

Готово, вы, мы и вон тот парень восхитительны!


В заключение рекомендую открытый урок, на котором вспомним, кто такой докер, и разберем 3 лайфхака: советы по оптимизации Dockerfile для минимального размера итогового образа, multi-stage сборка, запуск приложений в docker в обёртке из systemd unit.

В результате занятия сможете создавать легковесные Dockerfile и через это ускорить процессы доставки приложений. Разберем нюансы запуска контейнеризированных приложений через systemd, которые позволят унифицировать процессы разворачивания приложений посредствам puppet, ansible и других систем управления конфигурациями.

Комментарии (3)


  1. ky0
    08.12.2022 18:12
    +6

    Представляю, как люди пробуют повторить, перепечатывая команды со скриншотов. Печальное зрелище, Рустем.


  1. scruff
    08.12.2022 18:18

    RHCSA stands for Red Hat Certified System Administrator. Или я что-то путаю?


  1. osipov_dv
    08.12.2022 20:33

    Зачем эта перепечатка одного из вопросов RHCSA 8?