Переход с Docker на Podman: rootless запуск, Pod'ы и интеграция с systemd
- Требование безопасности запускать контейнеры без прав root (Rootless) и без постоянного демона с повышенными привилегиями.
- Необходимость управления жизненным циклом контейнеров через стандартные механизмы Linux Systemd.
- Ограничения архитектуры Docker Daemon как единой точки отказа (Single Point of Failure).
1. Установка Podman и настройка сопоставления UID/GID
# RHEL / Rocky / AlmaLinux
dnf install -y podman podman-docker
# Ubuntu / Debian
apt-get install -y podman podman-docker
# Настройка диапазонов суб-UID для непривилегированного пользователя
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 devops_user2. Настройка бесшовного алиаса для Docker CLI
Пакет podman-docker создает симлинк /usr/bin/docker -> /usr/bin/podman. Также включите эмуляцию сокета для сторонних утилит (например, Docker Compose):
systemctl --user enable --now podman.socket
export DOCKER_HOST="unix:///run/user/$UID/podman/podman.sock"3. Запуск группы контейнеров в едином Pod (аналог Kubernetes Pod)
# 1. Создание пода с пробросом портов
podman pod create --name web-stack -p 8080:80
# 2. Добавление контейнеров внутрь пода (разделяют один network namespace)
podman run -d --pod web-stack --name nginx-front nginx:alpine
podman run -d --pod web-stack --name app-api my-api:latest4. Автогенерация Systemd-юнитов через Podman Quadlets
Создайте файл ~/.config/containers/systemd/myapp.container:
[Unit]
Description=My Rootless App
After=network-online.target
[Container]
Image=docker.io/library/nginx:alpine
PublishPort=8080:80
Restart=always
[Install]
WantedBy=default.targetАктивируйте сервис пользователя:
systemctl --user daemon-reload
systemctl --user enable --now myapp.service
# Разрешить автозапуск сервисов пользователя при загрузке без активной SSH-сессии
loginctl enable-linger devops_user Частые вопросы (FAQ)
Поддерживает ли Podman утилиту docker-compose?
Да. Podman поддерживает как нативный podman-compose, так и стандартный docker-compose v2 через запущенный сокет эмуляции API podman.socket.
Может ли rootless контейнер в Podman слушать 80 и 443 порты?
По умолчанию в Linux порты ниже 1024 привилегированные. Чтобы разрешить пользователю занимать их, выполните: sysctl -w net.ipv4.ip_unprivileged_port_start=80.