Введение
Podman (Pod Manager) — это современный инструмент для работы с контейнерами, разработанный компанией Red Hat как альтернатива Docker. Podman позиционируется как daemonless-решение для управления контейнерами и Pod'ами, совместимое с образами и контейнерами OCI (Open Container Initiative).
Основное преимущество Podman заключается в его архитектуре без демона, повышенной безопасности и возможности запуска контейнеров без привилегий root. В этой статье мы разберем ключевые отличия Podman от Docker и рассмотрим практические примеры работы с этим инструментом.
Архитектурные отличия
Docker: клиент-серверная архитектура
Docker использует архитектуру клиент-сервер с центральным демоном (dockerd), который работает с привилегиями root. Все операции с контейнерами проходят через этот демон:
Docker CLI → Docker Daemon (dockerd) → containerd → runc → Container
Podman: daemonless-архитектура
Podman работает напрямую с runc/crun, без промежуточного демона:
Podman CLI → runc/crun → Container
Это означает, что каждая команда Podman выполняется как отдельный процесс, контейнеры становятся дочерними процессами команды `podman`, а не демона.
Ключевые преимущества Podman
1. Rootless-контейнеры
Podman позволяет запускать контейнеры от имени обычного пользователя без привилегий root:
Запуск контейнера без root
podman run -d --name nginx-rootless -p 9080:80 nginx:latest
Проверка процессов - контейнер принадлежит вашему пользователю
ps aux | grep nginx
Скриншот вывода:

Docker требует членства в группе docker (что фактически эквивалентно root-доступу) или использования сложных настроек rootless-режима.
2. Совместимость с Docker
Podman полностью совместим с Docker на уровне CLI. Большинство команд идентичны:
Docker команды:
docker run -d --name web nginx
docker ps
docker stop web
docker rm web
Podman аналогичный команды:
podman run -d --name web nginx
podman ps
podman stop web
podman rm web
3. Работа с Pod'ами
Podman нативно поддерживает концепцию Pod'ов (как в Kubernetes) — группы контейнеров, использующих общее сетевое пространство:
Создание Pod'а:
podman pod create --name my-app-pod -p 9080:80
Добавление контейнеров в Pod:
podman run -d --pod my-app-pod --name nginx nginx:latest
podman run -d --pod my-app-pod --name redis redis:latest
Контейнеры в Pod'е могут общаться через localhost
nginx может обращаться к redis по адресу localhost:6379
Просмотр Pod'ов:
podman pod ps
Управление всем Pod'ом:
podman pod stop my-app-pod
podman pod start my-app-pod
podman pod rm my-app-pod
4. Генерация манифестов Kubernetes
Podman может генерировать YAML-манифесты для Kubernetes напрямую из запущенных контейнеров:
Запуск контейнера:
podman run -d --name web-app -p 9080:80 nginx:latest
Генерация Kubernetes YAML:
podman generate kube web-app > web-app-deployment.yaml
Сгенерированого YAML:

Полученный YAML можно сразу применить в Kubernetes:
kubectl apply -f web-app-deployment.yaml
Для Pod'а:
podman pod create --name app-pod -p 9080:80
podman run -d --pod app-pod --name nginx nginx
podman run -d --pod app-pod --name redis -v redis-data:/data redis
podman generate kube app-pod > app-pod.yaml
Сгенерированный YAML:

Полученный YAML можно сразу применить в Kubernetes:
kubectl apply -f app-pod.yaml
5. Интеграция с systemd
Podman отлично интегрируется с systemd для управления контейнерами как сервисами:
Генерация systemd unit-файла:
podman run -d --name nginx-service -p 9080:80 nginx:latest
podman generate systemd --new --files --name nginx-service
Для rootless - копируем в пользовательский каталог:
mkdir -p ~/.config/systemd/user/
mv container-nginx-service.service ~/.config/systemd/user/
Если это rootless режим, и до этого не настривался systemctl --user для этого пользователя:
sudo loginctl enable-linger $USER && export XDG_RUNTIME_DIR=/run/user/$(id -u) && for file in ~/.bashrc ~/.zshrc; do [ -f "$file" ] && echo 'export XDG_RUNTIME_DIR=/run/user/$(id -u)' >> "$file" || echo "$file не існує"; done && sudo mkdir -p /run/user/$(id -u) && sudo chown $(id -u):$(id -g) /run/user/$(id -u) && sudo chmod 700 /run/user/$(id -u)
Активация сервиса:
systemctl --user daemon-reload
systemctl --user enable container-nginx-service.service
systemctl --user start container-nginx-service.service
Проверка статуса:
systemctl --user status container-nginx-service.service
Теперь контейнер автоматически запускается при загрузке системы и перезапускается при сбое.
Когда выбирать Podman?
Выбирайте Podman, если:
- Требуется повышенная безопасность (rootless-режим)
- Работаете в Red Hat/Fedora/CentOS окружении
- Планируете миграцию в Kubernetes
- Нужна интеграция с systemd
- Хотите избежать единой точки отказа (демон)
Оставайтесь с Docker, если:
- Используете Docker Desktop с его GUI
- Требуется поддержка Docker Swarm
- Команда уже имеет обширный опыт работы с Docker
- Используются специфические возможности Docker, отсутствующие в Podman
Заключение
Podman представляет собой современную альтернативу Docker с акцентом на безопасность, простоту и совместимость с Kubernetes. Архитектура без демона, нативная поддержка rootless-контейнеров и Pod'ов делают Podman привлекательным выбором для production-окружений, особенно в энтерпрайз-сегменте.
Благодаря высокой совместимости с Docker CLI, переход на Podman в большинстве случаев происходит практически безболезненно. При этом вы получаете дополнительные возможности по безопасности и интеграции с современными инструментами оркестрации контейнеров.