Проблема
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 для запуска контейнеров как сервисов.
- Создайте контейнер (например, nginx):
bash
podman create --name nginx -p 80:80 nginx:alpine
- Сгенерируйте 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/
- Перезагрузите конфигурацию systemd для пользовательских юнитов и запустите сервис:
bash
systemctl --user daemon-reload
systemctl --user start container-nginx
systemctl --user enable container-nginx # автозапуск при входе пользователя
- Чтобы контейнер запускался при старте системы (даже если пользователь не залогинен), включите lingering для пользователя:
bash
sudo loginctl enable-linger $USER
Теперь контейнер будет запускаться при загрузке сервера, управляемый systemd от имени этого пользователя.
Документация: Podman systemd integration.
Шаг 5. Миграция с Docker: совместимость и алиас
Podman настолько совместим с Docker CLI, что можно просто создать алиас:
bash
alias docker=podman
Добавьте эту строку в ~/.bashrc или ~/.bash_aliases. Большинство команд (docker ps, docker run, docker 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 делают его идеальным выбором для продакшен-серверов, где безопасность и простота администрирования стоят на первом месте.







