Podman: Containers Rootless sem Docker para PME 2026

Introdução (vs Docker)

O Podman (Pod Manager) é um motor de containers desenvolvido pela Red Hat que oferece uma alternativa directa ao Docker, com uma diferença fundamental: corre containers sem daemon e, por defeito, em modo rootless (sem privilégios de root). Para uma PME que precisa de correr aplica em containers sem expor a superfície de ataque de um daemon a correr como root, o Podman é uma escolha cada vez mais adoptada em 2026.

O comando podman é compatível com a CLI do Docker — na maioria dos casos, basta substituir docker por podman num script existente e tudo funciona. Não há daemon (dockerd), não há socket TCP exposto, e cada utilizador gere os seus próprios containers isoladamente.

Característica Docker Podman
Daemon Sim (dockerd) Não (daemonless)
Modo rootless Experimental (rootless-mode separado) Nativo, por defeito
Compatibilidade CLI Alias dockerpodman
Pods (Kubernetes-like) Não nativo Sim (podman pod)
Compose Nativo (docker compose) Via podman-compose ou podman compose
systemd integration Limitada Nativa (podman generate systemd)
Licença Apache 2.0 Apache 2.0

Para uma PME, a vantagem principal é de segurança: se um atacante comprometer um container rootless, obtém apenas os privilégios desse utilizador — não root. O Docker pode correr rootless, mas requer configuração extra (dockerd-rootless.sh), enquanto no Podman o modo rootless é o comportamento padrão.

ℹ Nota: O Podman é o motor de containers padrão no RHEL, CentOS Stream, Fedora e Rocky Linux. Em Debian/Ubuntu também está disponível via apt, mas o Docker continua a ser a escolha tradicional nessas distribuições.

Instalar Podman

A instalação do Podman é directa nas principais distribuições Linux. Não requer repositórios externos na maioria dos casos — está nos repositórios oficiais de RHEL/CentOS/Fedora, Debian e Ubuntu.

RHEL / CentOS Stream / Rocky Linux

# Instalar Podman
sudo dnf install -y podman

# Verificar instalação
podman --version
# podman version 5.x.x

Debian 12 / Ubuntu 24.04

# Instalar Podman e ferramentas associadas
sudo apt update
sudo apt install -y podman podman-docker

# O pacote podman-docker cria um alias
# para que scripts que usam "docker" funcionem

podman --version

Fedora

sudo dnf install -y podman
podman --version

Arch Linux

sudo pacman -S podman
podman --version

Após a instalação, é recomendado configurar os registos de containers. O Podman suporta múltiplos backends de armazenamento, sendo o overlay o mais comum.

# Configurar registo padrão (docker.io)
sudo mkdir -p /etc/containers
sudo tee /etc/containers/registries.conf <<EOF
[registries.search]
registries = ["docker.io"]

[registries.insecure]
registries = []
EOF

✓ Dica: Em distribuições Red Hat, o ficheiro /etc/containers/registries.conf já vem pré-configurado. Verifique antes de sobrescrever.

Modo Rootless

O modo rootless permite que um utilizador sem privilégios root corra containers. Isto é possível graças aos user namespaces do kernel Linux, que mapeiam o UID do utilizador real para um conjunto de UIDs virtuais dentro do container. O Podman gere este mapeamento automaticamente.

Configurar rootless

# 1. Garantir que o módulo kernel de user namespaces está activo
cat /proc/sys/kernel/unprivileged_userns_clone
# Deve retornar 1

# Se retornar 0, activar temporariamente:
echo 1 | sudo tee /proc/sys/kernel/unprivileged_userns_clone

# Para tornar persistente (RHEL/CentOS):
echo "user.max_user_namespaces=28633" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 2. Configurar subuid e subgid para o utilizador
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER

# 3. Inicializar o ambiente rootless
podman system migrate

# 4. Verificar configuração
podman info --format json | python3 -m json.tool | grep -A5 rootless

Correr o primeiro container rootless

# Correr um container Alpine sem root
podman run -it --rm alpine:latest echo "Olá do container rootless!"

# Correr um servidor web nginx na porta 8080
podman run -d --name web-server -p 8080:80 docker.io/library/nginx:alpine

# Verificar que o processo NÃO corre como root no host
ps aux | grep nginx
# O processo aparece com o UID do utilizador, não root

No modo rootless, o Podman cria um ambiente isolado onde o utilizador dentro do container (UID 0) é mapeado para o utilizador real no host (ex: UID 1000). As portas abaixo de 1024 não estão disponíveis sem configuração adicional — por isso usamos a porta 8080 em vez de 80.

⚠ Atenção: Em modo rootless, portas privilegiadas (< 1024) requerem setcap no binário rootlessport ou a directiva sysctl net.ipv4.ip_unprivileged_port_start=80. Para PMEs, recomenda-se usar portas altas (8080, 8443) e um reverse proxy (nginx, Caddy) à frente.

Persistência e volumes rootless

# Criar volume nomeado
podman volume create dados-app

# Correr container com volume montado
podman run -d --name app \
  -v dados-app:/var/lib/data:Z \
  -p 8080:8080 \
  docker.io/library/postgres:16-alpine

# A flag :Z aplica labels SELinux automaticamente
# (necessário em RHEL/CentOS/Fedora)

Serviços systemd para containers rootless

O Podman integra-se nativamente com o systemd, permitindo gerir containers como serviços que arrancam no boot. Para PMEs, isto significa que um container rootless pode ser tão robusto quanto um serviço tradicional.

# Gerar unit file systemd a partir de um container existente
podman generate systemd --name web-server --new > ~/.config/systemd/user/web-server.service

# Activar lingering (permite que serviços user corram sem login)
loginctl enable-linger $USER

# Recarregar systemd e activar o serviço
systemctl --user daemon-reload
systemctl --user enable --now web-server.service

# Verificar estado
systemctl --user status web-server.service

Podman Compose

O podman-compose é uma ferramenta que lê ficheiros docker-compose.yml e cria pods com múltiplos containers. Desde a versão 4.7+, o Podman também inclui o subcomando podman compose que delega no Docker Compose V2 se instalado, oferecendo compatibilidade quase total.

Instalar podman-compose

# Via pip (recomendado)
pip3 install --user podman-compose

# Via gestor de pacotes (Debian/Ubuntu)
sudo apt install -y podman-compose

# Verificar
podman-compose --version

Exemplo: stack web + base de dados

Para uma PME que precisa de uma aplicação web com base de dados PostgreSQL, o docker-compose.yml tradicional funciona directamente com podman-compose:

# docker-compose.yml
version: "3.9"
services:
  db:
    image: docker.io/library/postgres:16-alpine
    environment:
      POSTGRES_USER: appuser
      POSTGRES_PASSWORD: senha-forte-2026
      POSTGRES_DB: appdb
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  web:
    image: docker.io/library/nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:Z
    depends_on:
      - db

volumes:
  pgdata:
# Iniciar a stack
podman-compose up -d

# Verificar containers em execução
podman ps

# Ver logs
podman-compose logs -f web

# Parar e remover
podman-compose down

Podman Compose V2 (nativo)

A partir do Podman 4.7+, o subcomando podman compose integra directamente com o Docker Compose V2 se instalado no sistema. Isto oferece melhor compatibilidade com ficheiros compose existentes:

# Instalar Docker Compose V2 (binário autónomo)
sudo curl -SL https://github.com/docker/compose/releases/download/v2.32.0/docker-compose-linux-$(uname -m) \
  -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# Usar via podman compose
podman compose up -d
podman compose down

ℹ Nota: O podman-compose (Python) é mantido pela comunidade e tem algumas limitações face ao Docker Compose V2. Para PMEs que precisam de compatibilidade total, usar podman compose com o binário Docker Compose V2 é a abordagem recomendada em 2026.

Erros Comuns

A migração de Docker para Podman é geralmente transparente, mas existem armadilhas frequentes. A tabela seguinte resume os erros mais comuns, a causa e a solução.

Erro Causa Solução
cannot clone: Operation not permitted User namespaces desactivados no kernel echo 1 | sudo tee /proc/sys/kernel/unprivileged_userns_clone + sysctl -p
Error: short-name resolution enforced Imagem sem registo completo (ex: alpine em vez de docker.io/library/alpine) Usar nome completo ou configurar registries.conf com unqualified-search-registries
permission denied ao montar volume SELinux bloqueia acesso ao volume Adicionar flag :Z ou :z no mount: -v /caminho:/destino:Z
bind: permission denied na porta 80/443 Portas privilegiadas (< 1024) indisponíveis em rootless Usar portas altas (8080/8443) ou sudo sysctl net.ipv4.ip_unprivileged_port_start=80
no space left on device (mas há espaço) Limite de inodos ou storage rootless esgotado podman system prune -a + verificar ~/.local/share/containers/storage
podman-compose ignora depends_on Limitação do podman-compose (Python) Migrar para podman compose (Docker Compose V2) ou adicionar healthcheck + condition: service_healthy
Error: database storage is locked Dois processos Podman a aceder ao mesmo storage Fechar sessões duplicadas: podman system renumber ou remover ~/.local/share/containers/storage/libpod/locks
Container não arranca no boot Lingering não activado para o utilizador loginctl enable-linger $USER + systemctl --user enable
user namespace mappings not configured /etc/subuid e /etc/subgid sem entradas sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER + podman system migrate
connect: no route to host entre containers Rede rootless isolada (CNI v4) sem DNS interno Usar --network=bridge ou criar rede nomeada: podman network create minharede + --network=minharede

✓ Resumo: O Podman oferece a uma PME em 2026 uma alternativa robusta e segura ao Docker, com modo rootless nativo, compatibilidade CLI quase total, e integração com systemd. A migração é incremental — scripts Docker existentes funcionam com alterações mínimas, e o ganho de segurança (sem daemon root) é imediato.

Licença: CC BY-SA 4.0 · Fontes: Podman Rootless Tutorial (GitHub) · Podman Documentation · podman-compose (GitHub)