No cenário da virtualização e conteinerização, é comum encontrar o Podman e o Docker. Surge então a questão: quais as diferenças entre eles?
Neste artigo, vamos analisar as distinções entre Docker e Podman, buscando entender qual a melhor opção para cada situação!
Docker
O Docker é uma tecnologia de conteinerização que simplifica a gestão de dependências dentro de um projeto, tanto na fase de desenvolvimento quanto na de implementação.
Disponível em Linux, Windows e macOS, o Docker opera com base em contêineres e sua orquestração, diferenciando-se da virtualização.
O Docker é construído em dois pilares principais: a interface de linha de comando (CLI) e o daemon.
Daemon Docker:
É um processo contínuo que roda em segundo plano, responsável por gerenciar imagens, contêineres, redes e volumes de armazenamento do Docker. A comunicação com o daemon é feita através da API REST do Docker Engine, acessada via protocolo HTTP.
Docker CLI:
Crédito da imagem: Redhat
É a interface de linha de comando que permite a interação com o daemon Docker. É através dela que os comandos do Docker são executados.
O funcionamento do Docker se baseia no kernel Linux e em suas funcionalidades, como cgroups e namespaces. Estas funções isolam os processos, permitindo que sejam executados de forma independente. O objetivo dos contêineres é executar múltiplos processos e aplicações de forma separada.
Isto possibilita otimizar o uso da infraestrutura sem comprometer a segurança, mantendo a separação entre os sistemas.
Todas as ferramentas de contêineres, incluindo o Docker, utilizam um modelo de implantação baseado em imagens. Este modelo facilita o compartilhamento de aplicações ou serviços entre diferentes ambientes.
Adicionalmente, o Docker automatiza a implantação de aplicações em ambientes conteinerizados. Com este conjunto de ferramentas, os usuários têm total controle sobre as aplicações, podendo acelerar a implantação, controlar versões e gerenciar suas distribuições.
Podman
O Podman (POD MANager) é uma ferramenta que permite construir, executar e gerenciar contêineres e imagens OCI. Desenvolvido pela Red Hat, inicialmente para o Linux 8 corporativo, é usado para o gerenciamento de contêineres, sendo considerado o sucessor do Docker.
A Red Hat descontinuou o suporte ao Docker, garantindo que a transição para o Podman seria fácil para os usuários, dado que o Podman é baseado no Docker, embora inicialmente fosse uma ferramenta de depuração.
O Podman gerencia todo o ecossistema de contêineres através da biblioteca libpod. Como o Podman opera apenas em plataformas Linux, uma API REST e clientes estão em desenvolvimento para permitir o uso em sistemas macOS e Windows.
No entanto, um cliente remoto baseado em Varlink já permite a comunicação remota com um servidor Podman baseado em Linux em sistemas macOS e Windows. A biblioteca libpod oferece suporte a diversos métodos para realizar o upload seguro de imagens, incluindo a verificação de confiança da imagem.
O Podman também suporta pods para gerenciar grupos de contêineres em conjunto, além de suportar formatos de imagem OCI e Docker.
Em ambientes menores e gerenciáveis, o Podman pode atuar como um precursor do Kubernetes, preenchendo a lacuna entre o gerenciamento de instâncias individuais e a orquestração moderna com Kubernetes.
Usuários que exploram o uso de contêineres podem aproveitar o conceito de pods. A construção e operação de um cluster Kubernetes não são mais mandatórias. Pods recém-criados podem ser testados e melhorados em operações individuais. A migração para o Kubernetes é possível posteriormente.
O comando `podman generate kube` gera os arquivos de configuração correspondentes, que podem ser usados como entrada na ferramenta `kubectl` do Kubernetes.
As versões atuais do Podman também podem gerar arquivos de configuração para o systemd, que é um facilitador para quem utiliza o sucessor do init para orquestração de contêineres.
Podman vs Docker: Diferenças
O Docker se consolidou como a principal ferramenta para gerenciamento de contêineres, oferecendo vantagens como um vasto repositório de imagens, mas também apresentando riscos de segurança. Além disso, o Docker não é mais suportado como contêiner para o Kubernetes.
A característica dos contêineres de não exigirem seu próprio kernel é vista como uma grande vantagem. No entanto, no Docker, isso representa um risco de segurança, pois os contêineres Docker só podem ser executados com privilégios de root.
Isto possibilita que processos em execução nos contêineres acessem o kernel com privilégios de root, permitindo um ataque ao sistema hospedeiro.
Uma diferença notável é observada logo no primeiro uso. Enquanto o Docker requer que o daemon Docker seja iniciado previamente, um contêiner Podman pode ser iniciado diretamente na linha de comando. Portanto, não há um processo em segundo plano, e o aplicativo é executado apenas quando necessário.
Do ponto de vista da segurança, isso é vantajoso, pois o Podman é menos vulnerável a ataques, já que o daemon não precisa rodar 24/7 com privilégios de superusuário. O Podman não necessita de um processo em segundo plano devido à sua arquitetura, que é fundamentalmente diferente do Docker.
Enquanto o Docker segue o modelo cliente-servidor, com o cliente Docker se comunicando com o daemon Docker através de uma API, o Podman segue o modelo fork-exec. Cada contêiner é executado como um processo filho do Podman.
Um namespace de usuário é criado no primeiro uso, quando o Podman é executado com privilégios normais de usuário. Dentro do namespace do usuário, o Podman é executado com privilégios de root, tendo permissão para montar sistemas de arquivos e criar contêineres.
O contêiner Podman, portanto, possui apenas as permissões do usuário que o executou. Usar namespaces de usuário significa que cada usuário pode criar e gerenciar seus próprios contêineres, sem que eles sejam visíveis para outros usuários ou para o superusuário.
Como o Podman opera de forma independente do Docker, desenvolvedores têm mais liberdade para atender às demandas da comunidade. Adições interessantes ao Podman incluem os comandos `mount/unmount` e a integração com o systemd.
O host pode usar o comando `mount/unmount` para montar o sistema de arquivos do contêiner, por exemplo, para acessar ou alterar arquivos, e depois desmontá-lo.
Embora o monitoramento de contêineres via systemd não funcione devido ao daemon no Docker, com Podman, os contêineres podem ser iniciados, monitorados e reiniciados via systemd.
Além disso, o Podman oferece o comando `podman generate systemd`, que cria um serviço systemd para o respectivo contêiner, dispensando o usuário da criação manual do serviço, facilitando a integração com o sistema host.
Outra diferença importante é que o Podman não altera as regras de firewall ou a instalação do dnsmasq, devido à sua capacidade de criar uma rede interna. Por outro lado, o Docker precisa sobrescrever as regras do firewall para permitir a comunicação entre contêineres.
Podman | Docker | |
Arquitetura | Sem Daemon | Daemon |
Gerenciamento de Serviços | Systemd | Docker Engine |
Compatibilidade com firewall | Respeita regras de firewall | Substitui regras de firewall |
Plataforma | Suporte nativo para linux | Linux, Windows e Mac |
Quando migrar do Docker para o Podman
Se você estiver implementando contêineres em um ambiente RHEL, a escolha natural é o Podman, já que ele é nativo do sistema. Você também pode considerar o Podman em substituição ao Docker em implantações menores, com poucos contêineres.
No entanto, se suas necessidades forem mais complexas, com múltiplos contêineres e uma pilha coordenada com docker-compose/podman-compose em rede, o Docker pode ser a melhor opção, pois ele lida melhor com a rede.
Da mesma forma, se você está começando no mundo dos contêineres, o Docker é uma opção mais adequada, pois é estável, bem estabelecido, com vasta documentação e uma curva de aprendizado mais suave do que o Podman, que ainda carece de estabilidade e documentação.
Migração de Podman para Docker
Para quem utiliza a linha de comando, a transição do Docker Engine para o Podman é bastante simples. Na forma mais básica, um alias `$ alias docker=podman` costuma funcionar na maioria dos casos.
Evidentemente, isso pressupõe que o software esteja instalado no sistema. Em distribuições Linux, isso não é um problema; pacotes prontos estão disponíveis.
Windows e macOS não estão entre os sistemas operacionais suportados. A abordagem do alias funciona porque muitos comandos do Docker têm um equivalente no Podman.
Existem algumas exceções, já que certos comandos do Docker não possuem equivalentes no Podman. Alguns comandos podem ter um comportamento diferente no Docker e no Podman. No momento, isso afeta apenas o gerenciamento de volumes que já foram configurados.
A mudança se torna mais complexa quando ferramentas gráficas como o Docker Desktop são utilizadas. Isso impacta, especialmente, desenvolvedores que trabalham com Windows ou macOS.
Usuários do Docker Desktop precisarão se habituar com a linha de comando, e o mesmo se aplica ao Docker Compose. No entanto, existe o projeto podman-compose, escrito em Python, que serve como um substituto para o Docker Compose.
Considerações Finais
A substituição do Docker pelo Podman pode ser considerada praticamente concluída. Para usuários e administradores, a maioria dos aspectos dessa transição é simples. Muitos recursos do Docker têm equivalentes idênticos no Podman.
A ausência de um daemon e privilégios de root é uma vantagem, assim como o uso de grupos de contêineres. É importante notar que o Docker ainda é a tecnologia dominante no mundo dos contêineres, mas essa situação pode mudar a longo prazo.
Você também pode explorar alguns comandos do Docker para gerenciar contêineres.