Podman: управление контейнерами без демона как альтернатива Docker

Проблема

Docker стал стандартом де-факто для контейнеризации, но его архитектура вызывает всё больше вопросов у администраторов, заботящихся о безопасности и ресурсах. Монолитный демон dockerd работает с правами root, запущенные контейнеры фактически обладают привилегиями демона, а сам демон единая точка отказа: если он падает, останавливаются все контейнеры. Для серверов, где нужно изолировать контейнеры разных пользователей или просто уменьшить поверхность атаки, хочется иметь инструмент, не требующий привилегированного фонового процесса и позволяющий запускать контейнеры от имени обычных пользователей. Альтернатива Docker должна не просто повторять команды, но и обеспечивать более высокую безопасность и бесшовную интеграцию с системными механизмами вроде systemd.

Решение

Podman это контейнерный движок, разработанный Red Hat и полностью совместимый с командным интерфейсом Docker, но работающий без демона. Он не требует постоянно висящего фонового процесса: каждый контейнер запускается непосредственно как дочерний процесс podman, что позволяет запускать контейнеры без прав root (rootless) и легко интегрировать их с systemd для автоматического запуска и управления жизненным циклом. Podman использует ту же экосистему образов (OCI-совместимые образы с Docker Hub), поддерживает pod’ы (группы контейнеров, как в Kubernetes) и может генерировать systemd-юниты для любых контейнеров. Официальная документация доступна на podman.io и в Podman Documentation, а руководство по rootless-запуску — в Rootless Podman.

Пошаговая инструкция

Шаг 1. Установка Podman

На Ubuntu 24.04 или Debian 12 Podman доступен в штатном репозитории, но рекомендуется подключать репозиторий Kubic для свежих версий.

bash

sudo apt update
sudo apt install podman -y

После установки Podman сразу готов к работе без дополнительных настроек. Проверьте версию:

bash

podman --version

Для rootless-режима (запуск от обычного пользователя) убедитесь, что пакет uidmap установлен (обычно уже есть):

bash

sudo apt install uidmap -y

Шаг 2. Запуск первого контейнера (root)

Podman полностью повторяет синтаксис Docker:

bash

sudo podman run -d --name web -p 80:80 nginx:alpine

Проверьте, что контейнер работает:

bash

sudo podman ps
curl http://localhost

Остановка и удаление:

bash

sudo podman stop web
sudo podman rm web

Шаг 3. Rootless-запуск (без привилегий)

Обычный пользователь может запускать контейнеры без sudo. Для этого просто выполните команды без sudo:

bash

podman run -d --name mynginx -p 8080:80 nginx:alpine

Если возникает ошибка с network, возможно, нужно настроить slirp4netns (обычно устанавливается автоматически). Rootless-контейнеры используют пользовательские неймспейсы и не требуют привилегий. Проверьте:

bash

podman ps
curl http://localhost:8080

Подробности о rootless-режиме в Rootless Tutorial.

Шаг 4. Генерация systemd-юнитов для контейнеров

Podman умеет автоматически создавать юниты systemd для запуска контейнеров как сервисов.

  1. Создайте контейнер (например, nginx):

bash

podman create --name nginx -p 80:80 nginx:alpine
  1. Сгенерируйте systemd-юнит в пользовательскую директорию:

bash

mkdir -p ~/.config/systemd/user
podman generate systemd --name nginx --files --new

Эта команда создаст файл container-nginx.service в текущей директории. Перенесите его:

bash

mv container-nginx.service ~/.config/systemd/user/
  1. Перезагрузите конфигурацию systemd для пользовательских юнитов и запустите сервис:

bash

systemctl --user daemon-reload
systemctl --user start container-nginx
systemctl --user enable container-nginx  # автозапуск при входе пользователя
  1. Чтобы контейнер запускался при старте системы (даже если пользователь не залогинен), включите lingering для пользователя:

bash

sudo loginctl enable-linger $USER

Теперь контейнер будет запускаться при загрузке сервера, управляемый systemd от имени этого пользователя.

Документация: Podman systemd integration.

Шаг 5. Миграция с Docker: совместимость и алиас

Podman настолько совместим с Docker CLI, что можно просто создать алиас:

bash

alias docker=podman

Добавьте эту строку в ~/.bashrc или ~/.bash_aliases. Большинство команд (docker psdocker rundocker compose) будут работать через Podman. Для Docker Compose используйте podman-compose (устанавливается отдельно):

bash

sudo apt install podman-compose -y

Также Podman поддерживает работу с Docker Hub без изменений:

bash

podman pull nginx

Шаг 6. Работа с подами (pod) — аналог docker-compose на уровне Podman

Podman поддерживает pod’ы группы контейнеров с общей сетью и пространством имён. Создадим pod и добавим в него два контейнера:

bash

# Создаём pod
podman pod create --name myapp -p 8080:80

# Запускаем контейнеры в этом pod'е
podman run -d --pod myapp --name web nginx:alpine
podman run -d --pod myapp --name db -e POSTGRES_PASSWORD=secret postgres:16

# Проверяем
podman pod ps

Это удобная замена docker-compose для простых сценариев и нативная интеграция с Kubernetes через генерацию YAML (podman generate kube).

Устранение распространённых проблем

СимптомВероятная причинаРешение
podman run без sudo выдаёт «Error: rootless network setup failed»Не установлен пакет slirp4netns или пользователь не имеет правУстановите slirp4netns (sudo apt install slirp4netns) и перелогиньтесь. Проверьте podman info на наличие rootless-поддержки.
Контейнер, запущенный в rootless-режиме, не видит порты ниже 1024Ограничение ядра: непривилегированные пользователи не могут слушать привилегированные портыИспользуйте порт выше 1024 (например, 8080), либо настройте sysctl net.ipv4.ip_unprivileged_port_start=80 (менее безопасно).
После генерации systemd-юнита контейнер не запускается («no such container»)Неправильно указано имя или контейнер не создан (только run)Создайте контейнер командой podman create, а не podman run, перед генерацией юнита.
Docker-алиас работает, но docker compose не распознаёт службыPodman не полностью эмулирует Docker Compose APIИспользуйте podman-compose или перепишите конфигурацию на использование pod’ов.
При запуске podman run образ загружается очень медленноОтсутствует кеш, или сеть ограниченаИспользуйте локальный реестр или предварительно загрузите образы (podman pull).

Podman это не просто «альтернатива Docker», а более современный и безопасный способ управления контейнерами. Отсутствие центрального демона устраняет единую точку отказа и снижает привилегии, необходимые для запуска рабочих нагрузок. Возможность генерировать systemd-юниты превращает контейнеры в обычные системные службы, управляемые привычными командами systemctl start/stop/enable. Для администратора, желающего избавиться от демона Docker и связанных с ним рисков, переход на Podman практически бесшовен благодаря полной совместимости CLI и поддержке Docker Hub. Rootless-режим и интеграция с systemd делают его идеальным выбором для продакшен-серверов, где безопасность и простота администрирования стоят на первом месте.

Menu