Podman – инструмент для управления контейнерами и контейнерными образами, совместимый с экосистемой OCI (Open Container Initiative). Он предназначен для запуска, сборки, управления и удаления контейнеров и контейнерных подов как в интерактивном режиме, так и в автоматизированных сценариях.
Одной из особенностей Podman является отсутствие постоянно работающего демона. В отличие от Docker, Podman работает по принципу daemonless. Это означает, что каждая команда запускается как отдельный процесс. При этом Podman умеет генерировать unit-файлы systemd для контейнеров и pod’ов, что позволяет обеспечить управление контейнерами через стандартные средства системы инициализации.
Ещё одна особенность – это то, что Podman позволяет запускать контейнеры от имени обычного пользователя без использования привилегий суперпользователя. Благодаря этому значительно снижаются потенциальные риски безопасности.
В статье разберём, как установить Podman на виртуальный выделенный сервер, работающий под управлением CentOS Stream 10 или Rocky Linux 9. Также рассмотрим установку контейнера и настройку его автоматического запуска на примере веб-сервера Nginx.
Как установить Podman на CentOS Stream и Rocky Linux
В CentOS Stream 10 и Rocky Linux 9 пакет Podman доступен для установки из стандартного репозитория. Значит, для инсталляции можно использовать пакетный менеджер DNF:
$ sudo dnf install podman
По окончании установки проверьте версию установленного программного обеспечения:
$ podman --version

Чтобы протестировать работоспособность Podman, запустите следующую команду:
$ podman run --rm docker.io/library/alpine echo "Podman works"
Данная команда создаёт и запускает одноразовый контейнер на основе минимального образа Alpine Linux. Затем выполняет внутри него команду echo "Podman works" и выводит результат в терминал. Сразу после завершения команда автоматически удаляет контейнер. Если результат выполнения команды – выведенное в терминале Podman works, значит тест пройден успешно.

Как запустить контейнер при помощи Podman
На данном этапе Podman готов к работе. В качестве примера можно запустить веб-сервер Nginx с помощью официально поддерживаемого образа, размещённого в реестре Docker Hub.
Следующая команда создаст и запустит контейнер в фоновом режиме на основе образа Nginx:
$ podman run -d --name nginx -p 8080:80 docker.io/library/nginx
Внутри контейнера Nginx прослушивает порт 80, при этом Podman пробрасывает его в хостовую систему на порт 8080. При этом порт 8080 не относится к привилегированным. Это позволяет запустить контейнер без использования прав суперпользователя, поскольку в Linux порты с номерами меньше 1024 доступны только процессам с соответствующими привилегиями.
Чтобы убедиться в корректном запуске, выведите на экран список работающих в системе контейнеров:
$ podman ps
Если контейнер работает, он будет находиться в выведенном списке.

Сразу после запуска Nginx отображает свою стандартную тестовую страницу даже при отсутствии настроенного виртуального хоста. При запуске контейнера Podman пробрасывает порт 80 Nginx на порт 8080 хоста, благодаря чему веб-сервер становится доступен извне. При этом для просмотра страницы в браузере необходимо открыть на сервере порт 8080. Для чего добавьте соответствующее разрешающее правило в брандмауэр Firewalld:
$ sudo firewall-cmd --permanent --add-port=8080/tcp
Чтобы новое правило было применено, перезапустите брандмауэр:
$ sudo firewall-cmd --reload
После чего откройте браузер и перейдите на http://X.X.X.X:8080, где вместо X.X.X.X укажите IP-адрес сервера.

Как настроить автозапуск контейнера Podman после перезагрузки системы
Podman, в отличие от Docker, не использует постоянно работающий демон. Вследствие чего контейнеры, запущенные вручную, не стартуют автоматически после перезагрузки системы. Для обеспечения их автозапуска и корректного управления жизненным циклом в Podman применяется интеграция с systemd. Использование systemd-юнитов позволяет автоматически запускать контейнеры при старте системы, контролировать их состояние, перезапускать при сбоях и централизованно просматривать логи. Это делает данный подход рекомендуемым для серверов в реальной эксплуатационной среде.
Также рекомендуется не использовать root-доступ при работе с контейнерами, поэтому настройку systemd следует выполнять с правами обычного пользователя, а не root.
Как правило, пользовательские процессы завершаются, когда пользователь выходит из системы. Но если включить linger, то его пользовательские службы смогут продолжать работать и после завершения сеанса. Следующая команда включает linger для текущего пользователя:
$ sudo loginctl enable-linger $USER
После выполнения команды проверьте, включён ли сейчас linger для текущего пользователя:
$ loginctl show-user $USER | grep Linger
Вывод должен содержать значение yes.

Далее создайте unit-файл для контейнера Podman с именем nginx:
$ podman generate systemd --name nginx --files --new
В данном случае:
--files– указывает на то, что Podman должен записать unit-файл на диск;--new– указывает на то, чтоsystemdбудет создавать контейнер при запуске сервиса, а не управлять уже существующим контейнером.
В результате после выполнения команды можно будет подключить службу к systemd, чтобы обеспечить автозапуск контейнера при старте системы.
На следующем шаге создайте директорию для пользовательских unit-файлов:
$ mkdir -p ~/.config/systemd/user
После чего переместите в неё созданный ранее unit-файл container-nginx.service:
$ mv container-nginx.service ~/.config/systemd/user/
Затем сообщите системе инициализации о появлении нового unit-файла:
$ systemctl --user daemon-reload
И включите автозапуск контейнера при старте пользовательской сессии с одновременным его запуском без перезагрузки сессии:
$ systemctl --user enable --now container-nginx
Чтобы убедиться в успешном запуске пользовательской службы container-nginx, выведите на экран её текущее состояние:
$ systemctl --user status container-nginx

Также выведите список всех активных unit-файлов пользователя с фильтром по nginx, чтобы увидеть, что нужная служба включена:
$ systemctl --user list-units | grep nginx

Если это так, перезагрузите сервер:
$ sudo reboot
После старта сервера выведите на экран список запущенных контейнеров, чтобы убедиться, что нужный контейнер работает:
$ podman ps
Также откройте браузер и проверьте доступность тестовой страницы Nginx.
