К основному содержимому

Podman без root вместо Docker: когда оправдано

Облако и DevOps · 09.11.2026 · 5 мин чтения

Что такое rootless Podman и чем он отличается от Docker

Podman запускает контейнеры от обычного пользователя, без привилегий root. При этом он не держит постоянный демон-root: контейнеры запускаются как дочерние процессы пользователя. У Docker есть rootless-режим, но это отдельный демон dockerd, который работает от пользователя внутри пользовательского пространства имён.

Podman тоже опирается на subuid и subgid, а добавлять строки в эти файлы может только root. Код проекта лежит в репозитории podman-container-tools/podman; старый адрес containers/podman отвечает перенаправлением.

Когда это оправдано, а когда нет

Rootless оправдан, когда сервис не должен получать root на хосте даже при взломе контейнера: веб-приложение, бот, фоновый воркер. Он не оправдан, если вам нужны привилегированные порты без обходных настроек, исходные IP клиентов в логах без доработок или сложные compose-файлы, которые нельзя проверить заранее.

Если на сервере уже работает Docker, переезд не обязателен. Базовую настройку Docker на сервере разбирает статья про настройку Docker на VDS, а общую картину образов и контейнеров — материал про образ и контейнер Docker.

Версии и что в них менялось

На 9 ноября 2026 года текущая стабильная версия Podman — 6.1.4 от 12 октября 2026 года; рядом поддерживается ветка 5.8.9. Ниже четыре вехи для rootless-схемы по заметкам выпусков проекта.

ВерсияДатаЧто изменилось
4.4.01 февраля 2023Появился Quadlet: генератор systemd-юнитов
5.0.019 марта 2024Для rootless-сети умолчанием стал pasta вместо slirp4netns
6.0.024 июня 2026Удалены slirp4netns, CNI и cgroups v1
6.1.412 октября 2026Текущая стабильная версия

Какая версия есть в вашем дистрибутиве

Версия из пакетного репозитория почти всегда старее текущей, и это решает, есть ли у вас Quadlet. Он появился в 4.4, поэтому в Ubuntu 22.04 и Debian 12 его нет, а в Ubuntu 24.04 и Debian 13 есть. Версии пакетов на 9 ноября 2026 года взяты из каталогов Debian и Ubuntu.

ДистрибутивВерсия PodmanQuadlet
Ubuntu 22.043.4.4Нет
Ubuntu 24.044.9.3Есть
Debian 124.3.1Нет
Debian 135.4.2Есть

Версии пакетов быстро устаревают, поэтому проверяйте свою командой podman --version.

Установка и первый запуск

Установка занимает одну команду из репозитория дистрибутива, а контейнер запускается от обычного пользователя. Для этого в файлах subuid и subgid должна быть строка с вашим именем; обычно её создаёт сам системный администратор при добавлении пользователя.

sudo apt install podman
grep "$USER" /etc/subuid /etc/subgid
podman run --rm -d --name web -p 8080:80 docker.io/library/nginx:stable
podman ps
curl -sI http://127.0.0.1:8080/

Если grep ничего не вывел, попросите администратора добавить диапазоны: без них rootless-контейнер не запустится.

Ограничения rootless-режима

Главная цена rootless — сеть. Порты ниже 1024 по умолчанию недоступны, а при публикации портов через rootlessport сервис теряет исходный IP клиента. Это не баги, а следствие того, что у процесса нет прав настраивать сеть хоста.

  • Привилегированные порты: в документации проекта сказано, что Podman не может привязать контейнер к портам ниже 1024.
  • Исходный IP: rootless-сети типа bridge по умолчанию используют rootlessport, который теряет адрес клиента. Режим rootless_port_forwarder="pasta" его сохраняет, но в 6.0.0 он отмечен как экспериментальный.

Обход для портов — понизить порог для непривилегированных процессов командой sysctl net.ipv4.ip_unprivileged_port_start=443 (значение из документации проекта); чтобы оно пережило перезагрузку, запишите его в файл в /etc/sysctl.d/. Помните: настройка действует для всех пользователей хоста, а не только для Podman.

Альтернатива без изменения ядра — держать контейнер на высоком порту, а на 80 и 443 поставить обратный прокси. Про взаимодействие Docker с межсетевым экраном читайте в статье про обход firewall через Docker и UFW; для Podman проверьте поведение на своём стенде.

Quadlet: контейнер как служба systemd

Quadlet превращает файлы .container, .pod, .network и .volume в юниты systemd, поэтому контейнер перезапускается, пишет логи в журнал и стартует при загрузке. Для rootless файлы кладут в каталог ~/.config/containers/systemd/.

  1. Создайте файл ~/.config/containers/systemd/web.container с содержимым ниже.
  2. Выполните systemctl --user daemon-reload, чтобы systemd подхватил файл.
  3. Запустите службу и проверьте её состояние.
  4. Разрешите пользователю работать без входа в систему: loginctl enable-linger.
[Unit]
Description=Web container

[Container]
Image=docker.io/library/nginx:stable
PublishPort=8080:80

[Install]
WantedBy=default.target

Совместимость с командами и compose-файлами Docker

Команды podman повторяют команды docker, но совместимость неполная. podman compose — тонкая обёртка над внешним провайдером, то есть docker-compose или podman-compose; если установлены оба, берётся docker-compose.

Сокет с Docker-совместимым API включается одной командой, а клиентам Docker указывают его адрес через переменную DOCKER_HOST. В документации Podman это описано как слой совместимости с API Docker версии 1.40; с версии 6.1.0 его дорабатывают под версию 1.44.

systemctl --user enable --now podman.socket
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/podman/podman.sock
docker ps

Частые вопросы

Можно ли просто заменить docker на podman в скриптах?

Часто да, но проверять нужно каждый скрипт. Базовые команды совпадают, а вот сеть, привилегированные порты и часть полей compose ведут себя иначе.

Почему мои старые инструкции со slirp4netns не работают?

В Podman 5.0.0 умолчанием стал pasta, а в 6.0.0 поддержку slirp4netns удалили. На версии 6 и новее используйте pasta.

Что делать клиентам ZevsHost?

Podman ставят на VPS или выделенном сервере с доступом root; на общем хостинге серверной частью занимается панель. Установку, subuid и subgid, порты и службы systemd настраиваете вы.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке