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
- Documentação oficial do Podman — Guia completo de instalação, configuração e uso do Podman, incluindo exemplos detalhados de modo rootless
- Red Hat: Introduction to Podman — Artigo técnico da Red Hat explicando a arquitetura sem daemon e as vantagens do Podman sobre o Docker
- Podman Rootless Tutorial — Tutorial oficial no GitHub sobre configuração e execução de containers rootless com Podman
- Podman vs Docker: Complete Comparison — Comparativo detalhado entre Podman e Docker, com tabelas de comandos equivalentes e cenários de uso
- Using Podman as a Docker Alternative — Artigo da Red Hat Developers sobre migração prática do Docker para Podman, com dicas de scripts e CI/CD
- Podman Compose Documentation — Repositório oficial do podman-compose com exemplos de uso e compatibilidade com arquivos docker-compose.yml
- Container Security with Podman — Guia de segurança da OpenShift abordando seccomp, capabilities e hardening de containers rootless