Привет Хабр! На связи Рустем, IBM Senior DevOps Engineer & Integration Architect, также являюсь официальным DevOps ментором и коучем в IBM.
![](https://habrastorage.org/getpro/habr/upload_files/faa/e3d/b5b/faae3db5b656e851ac165b7a82d2cbd9.png)
Сегодня я хотел бы вывести на обзор интересную тему из экзамена Red Hat Certified System Administrator, а именно “Auto-starting Rootless Containers”
В настоящее время контейнеры необходимы для большинства ИТ-сред. В этой статье мы узнаем, как запустить контейнер без рута и настроить автоматический запуск этого контейнера.
Сегодня я вам расскажу:
Как настроить учетные записи пользователей для автоматического запуска модулей systemd.
Как запустить безрутовый контейнер.
Как автоматически запустить контейнер без рута с помощью systemd.
Шаг 1: Мы создаем и настраиваем пользователя для автоматического запуска юнитов systemd
Для работы с контейнерами нам необходимо установить соответствующее программное обеспечение:
![](https://habrastorage.org/getpro/habr/upload_files/094/154/61b/09415461b82349f78d56ce9de1668287.png)
Для начала нам понадобится учетная запись пользователя без root-прав для запуска контейнеров, также не имеющих полномочий root. Мы используем следующие команды для создания условного пользователя linda и устанавливаем пароль «password»:
![](https://habrastorage.org/getpro/habr/upload_files/8e8/1ca/d08/8e81cad08c23a97fec672d60319efda6.png)
Затем вам нужно включить функцию linger для пользователя, которая позволяет пользователю автоматически запускать файлы системных юнитов:
![](https://habrastorage.org/getpro/habr/upload_files/d4c/458/c74/d4c458c74834eb2220d692f060281fb4.png)
Проверим linger
![](https://habrastorage.org/getpro/habr/upload_files/346/f02/454/346f024542fd09bdcb2dfbf78359e759.png)
Шаг 2: Запускаем контейнер от имени пользователя
Теперь, когда мы настроили локальную учетную запись пользователя, нам нужно войти в систему как этот конкретный пользователь. Это должен быть настоящий логин, su не работает. Давайте используем ssh для входа на локальный хост как пользователь linda:
![](https://habrastorage.org/getpro/habr/upload_files/647/2d2/132/6472d21329ae9258fb44b1b3e24151ef.png)
На данный момент мы готовы запустить контейнер. Давайте запустим контейнер nginx:
![](https://habrastorage.org/getpro/habr/upload_files/5e3/f2c/ff2/5e3f2cff2f38fbbbe9e9bc66c9413347.png)
Проверим, запущен ли контейнер:
![](https://habrastorage.org/getpro/habr/upload_files/b77/68f/062/b7768f0625fc5ca38d237c552127260d.png)
Шаг 3: Генерируем юнит-файл systemd для автозапуска контейнера
Теперь у нас есть работающий контейнер в podman, давайте сгенерируем файл юнита systemd для его автозапуска. Прежде чем сделать это, мы должны создать локальную директорию, в которой будет храниться конфигурация, и активировать эту директорию:
![](https://habrastorage.org/getpro/habr/upload_files/177/b77/81f/177b7781fb7efa542efbdd9bc5952a99.png)
После перехода в директорию, где будет храниться файл конфигурации, мы можем сгенерировать юнит-файл systemd для автозапуска контейнера:
![](https://habrastorage.org/getpro/habr/upload_files/2e0/8e1/8e9/2e08e18e92bddd4e9df986867d402300.png)
Предыдущая команда создала файл модуля systemd с именем container-mynginx.service. Давайте посмотрим на содержимое созданного файла модуля systemd:
![](https://habrastorage.org/getpro/habr/upload_files/222/5e8/89f/2225e889f7673c2984117f894c932cb2.png)
Теперь убеждаемся, что systemd подхватывает новый конфигурационный файл:
![](https://habrastorage.org/getpro/habr/upload_files/0ce/0db/4e2/0ce0db4e2c6f99e52134f849a2c4739d.png)
Шаг 4. Указываем systemd автоматически запускать пользовательский контейнер при загрузке
Мы уже почти закончили! На этом этапе давайте передадим полный контроль systemd. Для этого нам сначала нужно остановить контейнер в podman:
![](https://habrastorage.org/getpro/habr/upload_files/da5/42b/56f/da542b56f36b4105fbb204fa94ea058c.png)
Чтобы убедиться, что пользовательский сервис будет запущен автоматически, а также что systemd запустит его сейчас, мы используем следующую команду:
![](https://habrastorage.org/getpro/habr/upload_files/046/fa8/a89/046fa8a89e8c84c25fbd407d6d3ff222.png)
Мы можем использовать следующую команду без перезагрузки, чтобы проверить статус и убедиться, что служба пользователя включена:
![](https://habrastorage.org/getpro/habr/upload_files/45e/a15/d74/45ea15d74596be167b1fdb11f87f5285.png)
Также мы проверяем, что мы все еще можем видеть контейнер в podman:
![](https://habrastorage.org/getpro/habr/upload_files/0b4/f09/328/0b4f09328ad45d10fd3e087da0efbc03.png)
Готово, вы, мы и вон тот парень восхитительны!
В заключение рекомендую открытый урок, на котором вспомним, кто такой докер, и разберем 3 лайфхака: советы по оптимизации Dockerfile для минимального размера итогового образа, multi-stage сборка, запуск приложений в docker в обёртке из systemd unit.
В результате занятия сможете создавать легковесные Dockerfile и через это ускорить процессы доставки приложений. Разберем нюансы запуска контейнеризированных приложений через systemd, которые позволят унифицировать процессы разворачивания приложений посредствам puppet, ansible и других систем управления конфигурациями.
ky0
Представляю, как люди пробуют повторить, перепечатывая команды со скриншотов. Печальное зрелище, Рустем.