opened image

Что такое Podman и чем он лучше Docker?

Введение

 

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

 

Скриншот вывода:

 

Что такое Podman и чем он лучше Docker 1


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:

 

Что такое Podman и чем он лучше Docker 2
 

Полученный 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:

 

Что такое Podman и чем он лучше Docker 3

 

Полученный 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 в большинстве случаев происходит практически безболезненно. При этом вы получаете дополнительные возможности по безопасности и интеграции с современными инструментами оркестрации контейнеров.