Привет Хабр! На связи Рустем, 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 и других систем управления конфигурациями.
ky0
Представляю, как люди пробуют повторить, перепечатывая команды со скриншотов. Печальное зрелище, Рустем.