- O Docker vem sendo criticado de forma recorrente por problemas de segurança e consumo de recursos devido à sua arquitetura com daemon em segundo plano (
dockerd)
- O Podman adota uma arquitetura sem daemon, fazendo com que os contêineres sejam executados diretamente com as permissões do usuário, reduzindo a superfície de ataque e reforçando a estabilidade
- Com suporte a integração com systemd, design amigável ao Kubernetes e ferramentas separadas baseadas na filosofia Unix, como Buildah e Skopeo, a eficiência operacional aumenta
- Mantendo alta compatibilidade com a CLI do Docker, na maioria dos casos o fluxo de trabalho existente continua funcionando apenas com
alias docker=podman
- Mesmo em ambientes reais de produção, a segurança e o gerenciamento de recursos ficam mais simples, e em novos projetos o Podman está se tornando uma opção mais racional e orientada para o futuro
Limitações do Docker e problemas de segurança
- O Docker tem uma estrutura em que o daemon
dockerd está sempre em execução com privilégios de root
- Se uma vulnerabilidade for encontrada no daemon, todo o host pode ficar exposto a riscos
- Exemplos de incidentes importantes de segurança
- 2019: escape de contêiner no runC (CVE-2019-5736)
- 2022: vulnerabilidade Dirty Pipe no Linux, escape via cgroups v1
- 2024: runC “Leaky Vessels”, vulnerabilidade no BuildKit
- 2024: campanha de cryptojacking por exposição da API do Docker
- A repetição desses incidentes evidencia o risco estrutural da arquitetura baseada em daemon
A arquitetura sem daemon do Podman
- O Podman não usa daemon em segundo plano
- Ao executar
podman run, o contêiner funciona como processo filho direto de quem executou o comando
- Como roda em modo rootless, mesmo privilégios de root dentro do contêiner equivalem apenas a permissões de usuário comum no host
- Vantagens
- Segurança reforçada: em caso de escape de contêiner, o impacto é reduzido
- Mais estabilidade: se um contêiner cair, os demais não são afetados
- Eficiência de recursos: como não há daemon residente desnecessário, o uso de memória diminui
Recursos diferenciados do Podman
- Integração com systemd
podman generate systemd cria automaticamente arquivos de unidade do systemd
- Os serviços podem ser gerenciados com os comandos padrão do
systemctl
- Compatibilidade com Kubernetes
- O conceito de Pod já vem embutido por padrão, facilitando o desenvolvimento de apps com múltiplos contêineres
podman generate kube permite gerar YAML do Kubernetes diretamente
- Filosofia Unix
- O Podman foca na execução de contêineres; para build de imagens usa-se o Buildah, e para gerenciamento de registries o Skopeo
- Isso permite usar ferramentas otimizadas para cada finalidade
Processo de migração e compatibilidade
- A migração do Docker para o Podman é praticamente sem interrupções
- Como a CLI é compatível, dá para usar
podman no lugar de docker sem grandes mudanças
- Dockerfiles existentes continuam funcionando normalmente
- Diferenças
- No modo rootless, não é possível fazer bind em portas abaixo de 1024 → recomenda-se usar reverse proxy
- É necessário cuidar das permissões de volumes
- Ferramentas que dependem do socket do Docker podem usar o modo de compatibilidade com a API Docker do Podman
Aplicação prática e benefícios
- Após usar o Podman em ambiente de produção
- Redução da carga de auditorias de segurança, com segurança rootless aplicada por padrão
- O padrão de uso de recursos fica mais simples e previsível
- O Docker continua popular, mas em novos projetos ou quando há liberdade para escolher a stack, o Podman tende a ser mais adequado
- Integração natural com o ecossistema de administração Linux
- Arquitetura orientada ao Kubernetes
- Ambiente de execução de contêineres mais seguro e racional
Resumo do guia de migração para FastAPI
- É possível usar o Dockerfile existente sem alterações
- Basta substituir por
podman build e podman run
- Use
podman generate systemd para registrar o serviço no systemd
- Pods permitem dar suporte a ambientes com múltiplos serviços, como banco de dados
- Fluxos de trabalho com Docker Compose podem ser atendidos com
podman-compose ou conversão via kompose
8 comentários
Aqui dizem que é possível fazer a migração sem downtime, mas no ambiente real de operação havia várias coisas estranhas. Por exemplo, no mac, como a configuração padrão usa compressão zstd, a imagem gerada acaba ocupando bastante espaço no registro...
Tanto Docker quanto Podman....
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
securityContext:
runAsNonRoot: true
runAsUser: UID
Na prática, a compatibilidade com Docker não funciona tão bem, então a usabilidade não é lá essas coisas...
Fui para o Podman pensando no modo rootless, mas acabei voltando para o Docker.
Como outra pessoa disse, se for para usar com Kubernetes, aí é melhor simplesmente usar
containerd.Fico me perguntando se, já que o Docker Compose não funciona bem e a vantagem seria a boa compatibilidade com Kubernetes, não seria melhor simplesmente usar Kubernetes direto.
Eu também tentei usar, mas como não funcionou de primeira e também não dava para mapear portas abaixo de 1024 diretamente, acabei usando uma combinação de k3s com
nerdctlpara build de imagens.Embora eu queira trocar algum dia, quando tentei antes, ao contrário do que os desenvolvedores diziam, muitos projetos com Docker Compose simplesmente não funcionavam direito...
Nem tem suporte a rede do Docker, né.
Pelo que sei, ele também oferece suporte a recursos de rede, de forma semelhante ao Docker.
Ainda existe algo que não funciona direito?
Comentários no Hacker News
chroote jail. Meu código de distribuição executava o software fora do ambiente de jail e monitorava comptracequais arquivos o processo abria. A partir dessa saída, eu gerava uma lista de dependências e empacotava tudo. No fim, a distribuição ficou pequena, imutável e mais segura. Quando o Docker apareceu, isso me lembrou aquele método antigo, e fiquei curioso para saber se existia alguma ferramenta parecida que monitorasse o uso de arquivos de contêineres Docker para reduzir a distribuiçãogit push. Era só fazergit push live mastere o deploy acontecia. Já usei muito Docker, mas esse foi o deploy mais fácil de todos. Eu entendo as vantagens do Docker, mas configurar HTTP no Ubuntu ou no OpenBSD não é tão difícil assim. Fico me perguntando se a reprodutibilidade exclusiva do Docker realmente vale toda essa sobrecarga de manutençãoLink para o código relacionado
--connectionpara apontar para o ambiente desejado. Se necessário, o Podman também pode criar uma VM automática para isso (usando lima). O Podman Desktop também tem uma camada de compatibilidade com Docker para aliviar esses problemas.deb. Não há.deboficial, e os que encontrei estão desatualizados ou já avisam que não serão mais mantidos. Então fica a pergunta: por que o Podman não facilita mais a instalação? Minha impressão é que a RedHat não quer gastar recursos de desenvolvimento dando suporte a software de concorrentes. Faz sentido, mas fora do ecossistema RedHat a sensação é de ser tratado como cidadão de segunda classe.deboficial upstream fornecido de forma consistente impede o uso interno do Podman. Dá até inveja do Docker, que mantém muito bem seu repositório oficial.debpodman generate systemdmencionado no artigo agora está deprecated. A alternativa são os Podman Quadlets, que funcionam de forma parecida com um docker-compose.yaml definido dentro de arquivos unit do systemduidmapdo crun, userns) não funcionam bem. Fico em dúvida sobre a utilidade prática desse mapeamento por IDs secundáriosignore_chown_errorspara mapear o root para o ID do usuário de forma simples, sem precisar de mapeamentos extras/devnecessários e expor um programa bem restrito em uma rede isoladaaqui,
aqui,
e aqui