coldwa.st
Todos os guiasProgramaçãoWebDadosFerramentasBases de dadosHaskellConceitosCabal e buildsToolchainCompiladorDesempenhoEditor e HLS

Programação · DevOps · Contentores

Docker vs Podman: que motor de contentores, e quando?

Por ColdwastAtualizado a 27 jun 20269 min de leitura#docker#podman#contentores
Render 3D de três unidades de servidor pretas idênticas lado a lado, com luzes de estado verdes
O Docker e o Podman executam ambos os mesmos contentores no formato OCI — aqui três unidades de servidor idênticas. As verdadeiras diferenças estão na forma como cada ferramenta arranca e gere esses contentores, não nos contentores em si.

Resposta rápida: O Docker e o Podman fazem o mesmo trabalho de base — construir e executar contentores — e usam o mesmo formato de imagem, pelo que uma imagem construída com um corre no outro. A principal diferença é a arquitetura: o Docker executa os contentores através de um daemon central de longa duração (dockerd) que normalmente corre como root, enquanto o Podman é sem daemon e rootless por conceção, lançando cada contentor como um simples processo filho. As suas linhas de comandos são suficientemente próximas para que alias docker=podman cubra grande parte do uso diário. Escolhe o Podman quando queres dispensar o daemon root e ter uma integração estreita com o systemd; fica com o Docker quando dependes do Docker Desktop, de um fluxo Compose maduro ou de um ecossistema mais amplo.

Se estás a começar com qualquer um deles, ajuda perceber primeiro o que são o Docker e os contentores. Este guia parte daí e foca-se no que distingue os dois motores.

Arquitetura: com daemon vs sem daemon

O Docker assenta num modelo cliente-servidor. O comando docker que escreves é um cliente que fala com um serviço em segundo plano, o daemon do Docker (dockerd), que na verdade cria e executa os teus contentores. Esse daemon corre continuamente e, na configuração predefinida, como root. É cómodo — um único serviço gere tudo — mas também é um único processo privilegiado que possui todos os contentores do host.

O Podman segue outro caminho. Sem daemon central: quando executas um contentor, o Podman faz fork e depois exec dele diretamente como processo filho da tua shell, usando as mesmas primitivas do Linux (namespaces, cgroups). Cada contentor é apenas uma árvore de processos normal. Esse modelo sem daemon significa que não há um serviço root sempre ativo a comprometer, e que uma falha num contentor não passa por um daemon partilhado.

Contentores rootless e segurança

Essa diferença de arquitetura leva à diferença de segurança que mais importa. O Podman foi construído para correr em rootless: um utilizador sem privilégios pode construir e executar contentores sem root, usando user namespaces para mapear os UID do contentor para o host. O Docker também pode correr em rootless, e suporta-o há anos, mas a sua instalação predefinida continua centrada no daemon root, pelo que o rootless é um modo opcional e não a base.

Não ter um daemon root reduz a superfície de ataque: não há um serviço privilegiado em segundo plano que uma fuga de contentor pudesse visar para tomar conta do host. Para servidores multiutilizador e runners de CI, essa propriedade de «sem daemon root» é uma razão concreta e real para passar para o Podman. Não é magia — os contentores continuam a precisar de configuração cuidadosa — mas a postura predefinida é mais conservadora.

Um grande navio de carga carregado de contentores marítimos empilhados num porto à noite
A palavra «contentor» vem do transporte marítimo: caixas padronizadas que se movem da mesma forma em qualquer navio ou grua. Os contentores de software pegam na ideia — e tanto o Docker como o Podman usam o mesmo padrão OCI, pelo que as caixas são intercambiáveis.

As mesmas imagens, CLI quase idêntica

Esta é a parte que torna a mudança indolor: ambas as ferramentas seguem os padrões OCI (Open Container Initiative) para imagens e execução. Uma imagem construída com o Docker corre sob o Podman e vice-versa, e ambos descarregam dos mesmos registos (Docker Hub, GitHub Container Registry, Quay e outros). Não existe um formato de imagem exclusivo do Docker ou do Podman.

As linhas de comandos são deliberadamente próximas. podman run, podman build, podman ps e podman pull espelham os seus equivalentes do Docker, com as mesmas opções comuns. Muita gente simplesmente define um alias:

alias docker=podman

e mantém os seus hábitos. Os Dockerfiles também funcionam tal como estão sob o Podman. A CLI não é idêntica a 100 % em todos os casos limite, mas para construir e executar no dia a dia é próxima o suficiente para a memória muscular se transferir.

Pods: o agrupamento ao estilo Kubernetes do Podman

O Podman tira o nome do pod — um conceito que pede emprestado ao Kubernetes. Um pod é um grupo de contentores que partilham recursos como um namespace de rede, de modo a comunicarem entre si por localhost como se estivessem na mesma máquina. O Podman pode criar e gerir esses pods diretamente, o que aproxima o desenvolvimento local da forma como as coisas correm num cluster Kubernetes. O Docker não tem uma primitiva «pod» nativa no mesmo sentido; as montagens multicontentor compõem-se com as redes do Compose.

Integração com o systemd

Como os contentores do Podman são processos filhos normais em vez de filhos de um daemon, encaixam naturalmente no systemd, o gestor de serviços do Linux. Historicamente podias executar podman generate systemd para produzir um ficheiro de unit por contentor; a abordagem atual recomendada é o Quadlet, que permite descrever os contentores em ficheiros declarativos ao estilo de unit que o systemd gere diretamente — arrancando-os no boot, reiniciando-os em caso de falha e seguindo-os como qualquer outro serviço. Para servidores que já usam o systemd para tudo o resto, é uma forma limpa de manter os contentores sob o mesmo supervisor sem um daemon adicional.

Compose: docker compose vs podman

Muitos projetos apoiam-se no Compose para subir vários contentores a partir de um único ficheiro YAML. O Docker inclui docker compose (o plugin Compose v2) como ferramenta de primeira classe e bem mantida. O Podman também suporta fluxos Compose: pode trabalhar com a ferramenta separada podman-compose, e o Podman disponibiliza ainda um socket com o qual o tooling Compose padrão consegue falar, pelo que ficheiros compose.yaml existentes correm muitas vezes com pouca ou nenhuma alteração. Na prática, a experiência de Compose do Docker é a mais madura e polida das duas, o que explica porque equipas com uso intensivo de Compose às vezes ficam no Docker.

Licença do Docker Desktop vs modelo open source do Podman

No Windows e no macOS, o Docker usa-se normalmente através do Docker Desktop. O Docker Desktop é gratuito para uso pessoal, educação e pequenas empresas, mas exige uma subscrição paga para organizações maiores (acima do limiar de dimensão publicado pela Docker). Essa mudança de licença é uma verdadeira questão de orçamento e conformidade para as empresas maiores.

O Podman é totalmente open source e gratuito, sem licença por posto. O seu companheiro de ambiente de trabalho, o Podman Desktop, é também open source. Para as organizações que querem evitar uma licença de desktop comercial — ou simplesmente preferir uma stack open source de ponta a ponta — essa diferença conta tanto como qualquer diferença técnica.

Então, qual usar?

CritérioDockerPodman
ArquiteturaDaemon central (dockerd)Sem daemon (fork/exec por contentor)
RootlessSuportado, opcionalRootless por conceção (predefinido)
Formato de imagemOCIOCI — intercambiável com o Docker
CLICLI de referênciaQuase idêntica (alias docker=podman)
PodsSem primitiva pod nativaPods nativos (estilo Kubernetes)
systemdCorre sob o daemonUnits nativas via Quadlet
Composedocker compose (maduro)podman-compose / Compose via socket
Licença de desktopDocker Desktop pago para orgs grandesOpen source, gratuito (Podman Desktop)

Não há um vencedor universal. Escolhe o Podman quando queres dispensar o daemon root, ter contentores rootless por omissão, uma gestão systemd/Quadlet nativa, ou evitar a licença do Docker Desktop. Fica com o Docker quando dependes do Docker Desktop, de um fluxo Compose maduro, ou da amplitude do seu ecossistema e documentação. Como ambos falam OCI, também os podes misturar — construir com um, executar com o outro — ou experimentar o Podman sem deitar fora as tuas imagens e Dockerfiles existentes. E se mais tarde precisares de orquestrar muitos contentores em várias máquinas, isso é tarefa do Kubernetes, que se situa acima de ambos.