Podman
| Разработчик | Red Hat и сообщество (проект Containers) |
|---|---|
| Первый выпуск | 2018 (1.0 — январь 2019) |
| Язык | Go |
| Лицензия | Apache 2.0 |
| Архитектура | без демона (fork/exec), rootless |
| Совместимость | CLI Docker, образы OCI, Docker API |
| Связанные инструменты | Buildah, Skopeo, CRI-O |
| Платформы | Linux; macOS и Windows через виртуальную машину |
Podman (Pod Manager) — программа для сборки, запуска и управления контейнерами в Linux, альтернатива Docker. Его главные отличия — отсутствие постоянно работающего демона и запуск контейнеров от обычного пользователя без прав root (rootless). Команды Podman повторяют Docker настолько точно, что многие пользователи просто делают alias docker=podman. Podman по умолчанию входит в Red Hat Enterprise Linux, Fedora и CentOS Stream.
История
Podman вырос в Red Hat из проекта libpod в 2017–2018 годах как часть набора инструментов, разбирающих монолитный Docker на независимые части: Buildah — сборка образов, Skopeo — копирование и проверка образов в реестрах, CRI-O — среда выполнения для Kubernetes, Podman — запуск контейнеров.[1] Версия 1.0 вышла в 2019 году. С версии 2.0 Podman предоставляет REST API, совместимый с Docker, а Podman Desktop — графический интерфейс для macOS и Windows.
Архитектура
| Docker | Podman | |
|---|---|---|
| Демон | dockerd работает постоянно от root |
нет: каждый контейнер — дочерний процесс команды |
| Права | по умолчанию root (есть rootless-режим) | rootless по умолчанию для пользователя |
| Поды | нет (только в Compose/Kubernetes) | встроенные поды, как в Kubernetes |
| Автозапуск | политика restart демона | systemd через Quadlet |
| Сборка | BuildKit | Buildah (встроен) |
Без демона нет единой точки отказа и привилегированного сокета: доступ к /var/run/docker.sock фактически равен правам root на хосте, а у Podman такого сокета по умолчанию нет. Каждый контейнер запускается через небольшой процесс-монитор conmon и низкоуровневую среду выполнения (crun или runc), совместимую со стандартом OCI.[2]
Rootless-контейнеры
В rootless-режиме Podman использует пространства имён пользователей (user namespaces, см. Namespaces и cgroups): root внутри контейнера отображается на непривилегированного пользователя хоста через диапазоны из /etc/subuid и /etc/subgid.[3] Даже при выходе из контейнера злоумышленник получит только права этого пользователя. Сеть в rootless-режиме обеспечивает pasta (раньше slirp4netns). Ограничения: без дополнительных настроек нельзя слушать порты ниже 1024, а файлы в смонтированных томах могут получить неожиданные UID.
Основные команды
podman run -d --name web -p 8080:80 docker.io/library/nginx:alpine
podman ps
podman logs -f web
podman build -t myapp . # тот же Dockerfile (Containerfile)
podman images
podman push myapp registry.example.com/myapp:1.0
Короткие имена образов (nginx) Podman разрешает по списку реестров в /etc/containers/registries.conf; надёжнее всегда указывать полный адрес, например docker.io/library/nginx. Файл сборки может называться Containerfile, но Dockerfile тоже подходит, включая многоэтапную сборку.
Поды
Как и в Kubernetes, под — группа контейнеров с общим сетевым пространством имён:
podman pod create --name app -p 8080:80
podman run -d --pod app docker.io/library/postgres:17
podman run -d --pod app myapp
podman kube generate app > app.yaml # манифест Kubernetes
podman kube play app.yaml # и обратно
Это удобно для локальной разработки: связку контейнеров можно отладить на ноутбуке и получить заготовку манифеста для Pod в кластере.
Интеграция с systemd
Для сервисов на сервере Podman предлагает Quadlet: контейнер описывается декларативным файлом .container, из которого systemd сам генерирует юнит.[4]
# ~/.config/containers/systemd/web.container
[Container]
Image=docker.io/library/nginx:alpine
PublishPort=8080:80
AutoUpdate=registry
[Install]
WantedBy=default.target
После systemctl --user daemon-reload контейнер управляется как обычная служба: запуск при загрузке, перезапуск при сбое, логи в journald. podman auto-update обновляет такие контейнеры при появлении новой версии образа.
Совместимость с Docker
podman composeвызывает docker-compose или podman-compose; Docker Compose-файлы в большинстве случаев работают без изменений.- Включив сокет (
systemctl --user enable --now podman.socket), можно направить на Podman инструменты, ожидающие Docker API, черезDOCKER_HOST. - На macOS и Windows Podman, как и Docker Desktop, запускает Linux в виртуальной машине (
podman machine).
Отличия проявляются в деталях: сетевые настройки, поведение томов в rootless-режиме и отсутствие Docker Swarm.