Como usar podman como alternativa ao Docker sem daemon root

1. Introdução ao Podman e sua arquitetura sem daemon

O Podman (Pod Manager) surgiu como uma alternativa moderna ao Docker, desenvolvido pela Red Hat, com uma diferença arquitetural fundamental: ele não utiliza um daemon centralizado. Enquanto o Docker depende de um processo dockerd rodando como root para gerenciar containers, o Podman opera através de um modelo fork-exec, onde cada container é um processo filho direto do comando podman.

Essa arquitetura sem daemon traz benefícios significativos de segurança e simplicidade. O modelo rootless permite que usuários comuns executem containers sem qualquer privilégio elevado, utilizando namespaces de usuário do Linux para mapear o usuário root do container para um usuário não privilegiado no host.

A compatibilidade com o ecossistema Docker é um dos pontos fortes do Podman. Ele aceita imagens no formato OCI (Open Container Initiative) e Docker, e seus comandos são quase idênticos. É possível criar um alias simples para substituir Docker por Podman:

alias docker=podman

2. Instalação e configuração inicial do Podman

A instalação do Podman é direta na maioria das distribuições Linux modernas:

Ubuntu/Debian:

sudo apt update
sudo apt install podman

Fedora/CentOS/RHEL:

sudo dnf install podman

Arch Linux:

sudo pacman -S podman

Para executar containers em modo rootless, é necessário configurar os arquivos /etc/subuid e /etc/subgid com o intervalo de IDs de usuário e grupo que o Podman pode utilizar:

echo "seu_usuario:100000:65536" | sudo tee -a /etc/subuid
echo "seu_usuario:100000:65536" | sudo tee -a /etc/subgid

Verifique a instalação com:

podman info

O comando exibirá informações detalhadas sobre o ambiente, incluindo o suporte a rootless e os namespaces configurados.

3. Comandos básicos e gerenciamento de containers

Os comandos do Podman são praticamente idênticos aos do Docker. Execute um container Nginx:

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

Liste containers em execução:

podman ps

Acesse o terminal do container:

podman exec -it meu-nginx /bin/sh

O gerenciamento de portas e volumes funciona de forma similar, mas com diferenças sutis em modo rootless. Para montar um volume:

podman run -d --name app-dados -v /home/usuario/dados:/app/data nginx:alpine

Em modo rootless, o mapeamento de usuários pode causar problemas de permissão em volumes. O UID do usuário root dentro do container (0) é mapeado para o UID do usuário no host (geralmente 1000). Isso significa que arquivos criados no container aparecerão como propriedade do seu usuário no host.

4. Gerenciamento de imagens e registries

Baixe imagens Docker normalmente:

podman pull docker.io/library/nginx:alpine
podman images
podman rmi nginx:alpine

Construa imagens com Dockerfiles existentes:

podman build -t minha-app:1.0 .

Configure registries alternativos editando /etc/containers/registries.conf:

[registries.search]
registries = ['docker.io', 'quay.io', 'registry.fedoraproject.org']

[registries.insecure]
registries = ['meuregistro.local:5000']

Para autenticação em registries privados, utilize podman login:

podman login docker.io

5. Redes e volumes em ambientes rootless

O Podman oferece três modos de rede padrão: bridge, host e none. Em modo rootless, a rede bridge utiliza slirp4netns, que tem desempenho inferior e algumas limitações:

  • Containers rootless não podem se comunicar diretamente entre si via bridge
  • Portas abaixo de 1024 não podem ser expostas diretamente

Para expor portas, utilize o redirecionamento via socat:

socat TCP-LISTEN:80,fork,reuseaddr TCP:localhost:8080

Gerenciamento de volumes nomeados:

podman volume create dados-app
podman run -v dados-app:/app/data nginx:alpine

6. Pods e orquestração simples com Podman

Pods no Podman agrupam múltiplos containers que compartilham o mesmo namespace de rede e de PID, similar aos pods do Kubernetes:

podman pod create --name meu-pod -p 3000:3000
podman run -d --pod meu-pod --name backend node:18
podman run -d --pod meu-pod --name frontend nginx:alpine

Para orquestração mais complexa, utilize o podman-compose, uma alternativa compatível com arquivos docker-compose.yml:

pip install podman-compose
podman-compose up -d

Outra abordagem moderna são os quadlets, que permitem definir serviços systemd diretamente a partir de arquivos de configuração:

# ~/.config/containers/systemd/meu-servico.container
[Container]
Image=docker.io/nginx:alpine
PublishPort=8080:80

[Install]
WantedBy=default.target

7. Segurança e isolamento avançado

O Podman oferece recursos avançados de segurança mesmo em modo rootless. Configure seccomp para restringir chamadas de sistema:

podman run --security-opt seccomp=/path/to/seccomp.json nginx:alpine

Defina capabilities específicas:

podman run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx:alpine

Limite recursos com cgroups:

podman run --cpus=1 --memory=512m nginx:alpine

Práticas recomendadas para hardening:
- Utilize imagens oficiais e minimalistas (alpine, distroless)
- Execute containers com usuário não-root interno
- Evite montar volumes com permissões amplas
- Utilize rótulos SELinux ou AppArmor quando disponíveis

8. Migração prática do Docker para Podman

Tabela de comandos equivalentes:

Docker Podman
docker run podman run
docker ps podman ps
docker build podman build
docker-compose up podman-compose up
docker logs podman logs
docker exec podman exec

Para scripts e CI/CD, configure a variável de ambiente:

export DOCKER_HOST=unix:///run/user/1000/podman/podman.sock

Problemas comuns e soluções:

Permissão negada em volumes:

# Use a flag :Z para ajustar automaticamente o contexto SELinux
podman run -v /host/path:/container/path:Z nginx:alpine

Porta já em uso:

# Verifique processos usando a porta
sudo lsof -i :8080
# Ou utilize portas acima de 1024 em modo rootless
podman run -p 8081:80 nginx:alpine

Falha ao puxar imagem:

# Configure DNS do container
podman run --dns 8.8.8.8 nginx:alpine

O Podman oferece uma transição suave do Docker, mantendo compatibilidade enquanto elimina a necessidade de um daemon root. Sua arquitetura moderna e foco em segurança o tornam uma escolha sólida para ambientes de desenvolvimento e produção que exigem isolamento sem privilégios elevados.

Referências