Podman

Материал из llmdocs — справочник разработчика
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.

См. также

Источники

  1. Podman — официальный сайт
  2. Podman Documentation
  3. Podman — Rootless tutorial
  4. podman-systemd.unit(5) — Quadlet
  5. Buildah — официальный сайт