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 docker → podman |
| 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)