DevOps & CI/CD

Guia Completo de Podman e Alternativas ao Docker: Daemonless Containers na Prática

13 min de leitura

Guia Completo de Podman e Alternativas ao Docker: Daemonless Containers na Prática

Entendendo Containers Tradicionais vs. Daemonless A história dos containers começa com o Docker, que revolucionou a forma como empacotamos e distribuímos aplicações. No entanto, a arquitetura tradicional do Docker depende de um daemon — um processo sempre rodando com privilégios elevados no servidor. Esse daemon centraliza todas as operações de container, desde sua criação até gerenciamento de redes e volumes. Essa abordagem traz segurança como principal preocupação: se alguém comprometer o daemon, compromete toda a infra de containers daquele host. O Podman (Pod Manager) apresenta uma filosofia radicalmente diferente. Em vez de usar um daemon central, cada container é gerenciado diretamente pelo usuário ou processos específicos. Isso significa que quando você executa um container no Podman, não há um serviço daemon rodando continuamente. A arquitetura é modular, permitindo que cada componente funcione de forma isolada e independente, reduzindo a superfície de ataque e simplificando a manutenção. Essa mudança fundamental muda não apenas a segurança, mas também como pensamos sobre orquestração

<h2>Entendendo Containers Tradicionais vs. Daemonless</h2>

<p>A história dos containers começa com o Docker, que revolucionou a forma como empacotamos e distribuímos aplicações. No entanto, a arquitetura tradicional do Docker depende de um daemon — um processo sempre rodando com privilégios elevados no servidor. Esse daemon centraliza todas as operações de container, desde sua criação até gerenciamento de redes e volumes. Essa abordagem traz segurança como principal preocupação: se alguém comprometer o daemon, compromete toda a infra de containers daquele host.</p>

<p>O Podman (Pod Manager) apresenta uma filosofia radicalmente diferente. Em vez de usar um daemon central, cada container é gerenciado diretamente pelo usuário ou processos específicos. Isso significa que quando você executa um container no Podman, não há um serviço daemon rodando continuamente. A arquitetura é modular, permitindo que cada componente funcione de forma isolada e independente, reduzindo a superfície de ataque e simplificando a manutenção. Essa mudança fundamental muda não apenas a segurança, mas também como pensamos sobre orquestração e controle de privilégios em ambientes containerizados.</p>

<h2>Podman: Arquitetura e Diferenciais Técnicos</h2>

<h3>Como Funciona o Podman</h3>

<p>O Podman utiliza a biblioteca <code>libpod</code>, que abstrai as operações de baixo nível necessárias para gerenciar containers usando tecnologias Linux como cgroups, namespaces e SELinux. Diferentemente do Docker, o Podman não precisa de um daemon externo. Quando você executa <code>podman run</code>, você está invocando diretamente o binário do Podman, que cria um novo processo container sem intermediários. Isso também significa que os containers são propriedade do usuário que os criou, não de um daemon centralizado.</p>

<p>Uma vantagem prática desse design: você pode usar <code>systemd</code> para gerenciar containers como serviços de primeira classe. Containers não desaparecem quando você faz logout ou quando a sessão SSH encerra. O Podman também é totalmente compatível com a OCI (Open Container Initiative), o padrão de imagens Docker, permitindo migração quase direta de scripts e workflows.</p>

<h3>Instalação e Configuração Básica</h3>

<p>Para instalar o Podman em um sistema baseado em Debian/Ubuntu, execute:</p>

<pre><code class="language-bash">sudo apt-get update

sudo apt-get install -y podman podman-docker</code></pre>

<p>Para Red Hat/Fedora:</p>

<pre><code class="language-bash">sudo dnf install -y podman podman-docker</code></pre>

<p>O pacote <code>podman-docker</code> fornece um alias que mapeia comandos <code>docker</code> para <code>podman</code>, permitindo usar scripts antigos sem modificação. Após a instalação, teste com:</p>

<pre><code class="language-bash">podman --version

podman run --rm hello-world</code></pre>

<p>Se você receber erros de permissão, configure rootless containers. O Podman suporta execução sem privilégios root através de user namespaces. Para habilitar, adicione seu usuário ao grupo de subuid/subgid:</p>

<pre><code class="language-bash"># Verificar se já tem subuids configurados

grep $(whoami) /etc/subuid /etc/subgid

Se não tiver, configure manualmente

sudo usermod --add-subuids 100000-165535 $USER

sudo usermod --add-subgids 100000-165535 $USER</code></pre>

<h3>Executando Containers com Podman</h3>

<p>A sintaxe é praticamente idêntica à do Docker, mas com diferenças importantes no comportamento. Aqui, criaremos um container simples com uma aplicação web:</p>

<pre><code class="language-bash"># Container simples

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

Verificar status

podman ps

Ver logs

podman logs meu-nginx

Executar comando dentro do container

podman exec -it meu-nginx bash</code></pre>

<p>Agora, um exemplo mais realista com volumes e variáveis de ambiente:</p>

<pre><code class="language-bash"># Container com volume e variáveis

podman run -d \

--name postgres-db \

-e POSTGRES_PASSWORD=senhaSegura123 \

-e POSTGRES_USER=appuser \

-v dados_postgres:/var/lib/postgresql/data \

-p 5432:5432 \

postgres:15-alpine</code></pre>

<p>O Podman cria automaticamente o volume <code>dados_postgres</code> se não existir. Para inspecionar volumes:</p>

<pre><code class="language-bash">podman volume ls

podman volume inspect dados_postgres</code></pre>

<p>Uma diferença importante: no Podman, você pode parar um container e ele continua existindo. Para removê-lo completamente:</p>

<pre><code class="language-bash">podman rm meu-nginx

podman volume rm dados_postgres</code></pre>

<h2>Alternativas e Comparação com Docker</h2>

<h3>LXC (Linux Containers)</h3>

<p>LXC é a tecnologia de containers mais antiga, funcionando em nível de sistema operacional. Ao contrário de containers de aplicação (como Docker), LXC cria máquinas virtuais leves que comportam todo um sistema operacional. O LXC é gerenciado pelo daemon <code>lxd</code> e é ideal quando você precisa de isolamento total ou executar serviços que exigem múltiplos processos por container.</p>

<pre><code class="language-bash"># Instalação do LXD (daemon do LXC)

sudo snap install lxd

Inicializar

sudo lxd init --auto

Criar container LXC

lxc launch ubuntu:22.04 meu-container

Executar comando

lxc exec meu-container -- apt update</code></pre>

<p>A principal diferença: LXC é &quot;system container&quot; (VM leve), enquanto Docker/Podman são &quot;application container&quot; (um processo isolado). Escolha LXC se precisar de múltiplos serviços por container ou ambiente completo; escolha Podman se quer aplicações isoladas e leves.</p>

<h3>Containerd</h3>

<p>Containerd é um runtime de containers de baixo nível, mantido pela CNCF e baseado em padrões OCI. Diferentemente do Docker (que usa containerd internamente mas adiciona camadas), containerd é mais minimalista. É gerenciado por um daemon, assim como Docker, mas com menos overhead e mais controle fino.</p>

<pre><code class="language-bash"># Instalação (exemplo em Ubuntu)

wget https://github.com/containerd/containerd/releases/download/v1.7.0/containerd-1.7.0-linux-amd64.tar.gz

sudo tar Czxvf containerd-1.7.0-linux-amd64.tar.gz -C /usr/local

Criar arquivo de serviço systemd

sudo mkdir -p /etc/containerd

containerd config default | sudo tee /etc/containerd/config.toml

Iniciar daemon

sudo systemctl start containerd</code></pre>

<p>Usar containerd requer <code>nerdctl</code> como CLI:</p>

<pre><code class="language-bash"># Instalação do nerdctl

wget https://github.com/containerd/nerdctl/releases/download/v1.4.0/nerdctl-1.4.0-linux-amd64.tar.gz

sudo tar Czxvf nerdctl-1.4.0-linux-amd64.tar.gz -C /usr/local/bin/

Uso (sintaxe similar a Docker)

nerdctl run -d --name app nginx:latest

nerdctl ps</code></pre>

<h3>Comparação Rápida</h3>

<div class="table-wrap"><table><thead><tr><th>Característica</th><th>Docker</th><th>Podman</th><th>LXC</th><th>Containerd</th></tr></thead><tbody><tr><td>Daemon</td><td>Sim</td><td>Não</td><td>Sim (lxd)</td><td>Sim</td></tr><tr><td>Root obrigatório</td><td>Sim</td><td>Não (rootless)</td><td>Não</td><td>Não</td></tr><tr><td>Tipo de Container</td><td>Application</td><td>Application</td><td>System</td><td>Application</td></tr><tr><td>Curva aprendizado</td><td>Baixa</td><td>Baixa</td><td>Média</td><td>Média/Alta</td></tr><tr><td>Ecossistema</td><td>Maior</td><td>Crescente</td><td>Estável</td><td>Crescente</td></tr></tbody></table></div>

<h2>Podman em Produção: Orquestração e Melhores Práticas</h2>

<h3>Usando Podman Compose</h3>

<p>Para orquestrar múltiplos containers, o <code>podman-compose</code> é a alternativa nativa do Podman ao Docker Compose. Ele lê arquivos <code>docker-compose.yml</code> e funciona sem daemon centralizado.</p>

<p>Instale o Podman Compose:</p>

<pre><code class="language-bash">sudo curl -o /usr/local/bin/podman-compose https://raw.githubusercontent.com/containers/podman-compose/main/podman-compose

sudo chmod +x /usr/local/bin/podman-compose</code></pre>

<p>Crie um arquivo <code>docker-compose.yml</code>:</p>

<pre><code class="language-yaml">version: &#039;3.9&#039;

services:

app:

image: python:3.11-slim

container_name: minha-app

command: python -m http.server 8000

ports:

  • &quot;8000:8000&quot;

volumes:

  • ./app:/app

working_dir: /app

environment:

  • DEBUG=True

networks:

  • app-network

banco:

image: postgres:15-alpine

container_name: app-postgres

environment:

POSTGRES_DB: appdb

POSTGRES_USER: appuser

POSTGRES_PASSWORD: senha123

volumes:

  • pg_data:/var/lib/postgresql/data

networks:

  • app-network

healthcheck:

test: [&quot;CMD-SHELL&quot;, &quot;pg_isready -U appuser -d appdb&quot;]

interval: 10s

timeout: 5s

retries: 5

volumes:

pg_data:

networks:

app-network:

driver: bridge</code></pre>

<p>Execute com:</p>

<pre><code class="language-bash">podman-compose up -d

podman-compose logs -f app

podman-compose ps

podman-compose down</code></pre>

<h3>Containers como Serviços Systemd</h3>

<p>Uma vantagem única do Podman é integração nativa com systemd. Em vez de orquestração centralizada, crie arquivos de serviço para containers individuais:</p>

<pre><code class="language-ini"># /etc/systemd/system/container-app.service

[Unit]

Description=Minha Aplicação em Container

After=network-online.target

Wants=network-online.target

[Service]

Type=simple

User=appuser

Restart=always

RestartSec=10

ExecStart=/usr/bin/podman run --rm \

--name app-container \

-p 8000:8000 \

-v /home/appuser/app:/app:z \

-e APP_ENV=production \

python:3.11-slim \

python -m http.server 8000

ExecStop=/usr/bin/podman stop app-container

[Install]

WantedBy=multi-user.target</code></pre>

<p>Ative e inicie:</p>

<pre><code class="language-bash">sudo systemctl daemon-reload

sudo systemctl enable container-app.service

sudo systemctl start container-app.service

sudo systemctl status container-app.service</code></pre>

<p>Agora o container é gerenciado como qualquer outro serviço Linux, com logs centralizados em journald:</p>

<pre><code class="language-bash">journalctl -u container-app.service -f</code></pre>

<h3>Segurança no Podman</h3>

<p>O Podman rootless é significativamente mais seguro. Containers rodando como usuário normal não conseguem afetar o sistema hospedeiro. Porém, há considerações:</p>

<pre><code class="language-bash"># Rodar container em modo rootless (padrão para usuário normal)

podman run -d --name app-seguro nginx:latest

Verificar owner do processo

ps aux | grep nginx

Verificar namespaces isolados

podman inspect app-seguro | grep -A 10 &#039;SecurityOpt&#039;</code></pre>

<p>Para máxima segurança, use SELinux labels (se disponível):</p>

<pre><code class="language-bash">podman run -d \

--security-opt label=type:svirt_apache_t \

--name app-hardened \

nginx:latest</code></pre>

<p>Use sempre imagens de fontes confiáveis e escaneie vulnerabilidades:</p>

<pre><code class="language-bash"># Com ferramentas como Trivy

trivy image nginx:latest</code></pre>

<h2>Conclusão</h2>

<p>Três pontos fundamentais aprendidos nesta aula: Primeiro, o Podman representa uma evolução arquitetural genuína ao eliminar o daemon centralizado, oferecendo melhor segurança, isolamento de privilégios e gerenciamento direto via systemd. Segundo, a compatibilidade com ferramentas Docker (docker-compose, OCI) torna a migração praticamente transparente, sem reescrever workflows existentes. Terceiro, você não precisa escolher uma única solução — Docker continua dominante em desenvolvimento, Podman em ambientes de segurança elevada, containerd em orquestração cloud-native, e LXC quando você realmente precisa de system containers completos. A decisão deve ser baseada em requisitos específicos: segurança, escalabilidade e modelo de governança.</p>

<h2>Referências</h2>

<ol>

<li><a href="https://podman.io/docs" target="_blank" rel="noopener noreferrer">Documentação Oficial do Podman</a></li>

<li><a href="https://github.com/containers/podman-compose" target="_blank" rel="noopener noreferrer">Podman Compose no GitHub</a></li>

<li><a href="https://opencontainers.org/" target="_blank" rel="noopener noreferrer">Open Container Initiative (OCI) Spec</a></li>

<li><a href="https://developers.redhat.com/articles/podman-next-generation-linux-container-tools" target="_blank" rel="noopener noreferrer">Red Hat: Introduction to Podman</a></li>

<li><a href="https://containerd.io/docs/" target="_blank" rel="noopener noreferrer">Containerd Documentation</a></li>

</ol>

<p>&lt;!-- FIM --&gt;</p>

Comentários

Mais em DevOps & CI/CD

O que Todo Dev Deve Saber sobre Terraform com AWS: VPC, EC2, RDS e IAM na Prática
O que Todo Dev Deve Saber sobre Terraform com AWS: VPC, EC2, RDS e IAM na Prática

Fundamentos do Terraform e AWS O Terraform é uma ferramenta de Infrastructure...

Como Usar Azure para DevOps: AKS, Azure Pipelines e Resource Groups em Produção
Como Usar Azure para DevOps: AKS, Azure Pipelines e Resource Groups em Produção

Azure Resource Groups: Fundação da Organização em Nuvem Um Resource Group (Gr...

Como Usar Docker Fundamentos: Imagens, Containers, Volumes e Redes em Produção
Como Usar Docker Fundamentos: Imagens, Containers, Volumes e Redes em Produção

Docker Fundamentos: Compreendendo o Ecossistema de Containerização Docker é u...