Podman Quadlet vs Docker Compose para serviços Linux

Escolha o fluxo de trabalho de contêineres adequado.

Conteúdo da página

Docker Compose e Podman Quadlet resolvem problemas sobrepostos, mas vêm de centros de design diferentes, e a escolha entre eles depende de você pensar em pilhas de aplicativos ou em serviços Linux.

A distinção é importante para qualquer pessoa que execute contêineres em um host Linux além de uma tarde de experimentação. O Compose descreve serviços, redes e volumes em um arquivo YAML e os inicia com docker compose up. O Quadlet descreve contêineres em arquivos de unidade estilo systemd e permite que o gerenciador de serviços do sistema possua o ciclo de vida.

configuração do docker compose

Ambas as abordagens funcionam para serviços auto-hospedados, ferramentas internas e servidores pequenos. A escolha certa depende do seu modelo operacional, familiaridade da equipe e se você prefere um formato de pilha amigável para desenvolvedores ou um modelo de serviço nativo do systemd. Esta comparação cobre as diferenças práticas: formatos de arquivo, propriedade do ciclo de vida, contêineres sem privilégios de root (rootless), logs, atualizações, rede, segurança e caminhos de migração. Faz parte de Ferramentas de Desenvolvimento: O Guia Completo para Fluxos de Trabalho Modernos de Desenvolvimento.

Recomendação Rápida

Use Docker Compose quando:

  • Você deseja o fluxo de trabalho multi-contêiner mais rápido.
  • Você já usa Docker Engine.
  • Você compartilha pilhas com desenvolvedores.
  • Você precisa de um compose.yaml familiar para desenvolvimento local.
  • Você implanta pequenos serviços com Docker em um único host.
  • Você usa exemplos de Compose existentes de projetos.

Use Podman Quadlet quando:

  • Você deseja serviços de contêiner nativos do systemd.
  • Você prefere contêineres rootless (sem privilégios de root).
  • Você não quer um daemon Docker central.
  • Você executa serviços de longa duração em um host Linux.
  • Você quer systemctl, journalctl, timers, dependências e auto-inicialização.
  • Você está construindo um servidor auto-hospedado ou de laboratório caseiro (homelab) baseado em systemd.
  • Você quer que os contêineres se encaixem no modelo de serviço Linux normal.

A regra prática:

Docker Compose é melhor para pilhas de aplicativos.
Podman Quadlet é melhor para serviços Linux.

Isso não é uma lei. É um padrão útil.

Tabela de Comparação

Área Docker Compose Podman Quadlet
Modelo principal Aplicação multi-contêiner Serviço de contêiner gerenciado pelo systemd
Formato de arquivo YAML Arquivos de unidade semelhantes ao systemd
Runtime Docker Engine Podman
Daemon Usa o daemon Docker Modelo Podman sem daemon
Gerenciador de serviços Compose gerencia o ciclo de vida da pilha systemd gerencia o ciclo de vida
Melhor ajuste Pilhas de dev, bundles de app, implantações simples Serviços Linux de longa execução
Suporte rootless Possível, mas não o modelo mental padrão Forte ajuste
Logs docker compose logs journalctl e podman logs
Inicialização na boot Geralmente via wrapper systemd ou política de restart Unidade systemd nativa
Atualizações docker compose pull && docker compose up -d Auto-atualização do Podman ou fluxos de trabalho systemd
Portabilidade Muito alta entre ambientes Docker Melhor no Linux com systemd
Curva de aprendizado Mais fácil para a maioria dos desenvolvedores Mais fácil para usuários do systemd
Exemplos de ecossistema Enorme Menor, mas em crescimento

Nenhum deles é Kubernetes. A maioria dos pequenos serviços não precisa de um cluster. Eles precisam de uma maneira entediantemente compreensível de iniciar, parar, atualizar, logar e recuperar.

No que o Docker Compose é Bom

O Docker Compose é uma ferramenta para definir e executar aplicativos multi-contêiner. Um arquivo Compose típico descreve serviços, imagens, contextos de build, portas, volumes, redes, variáveis de ambiente, verificações de saúde, dependências e perfis.

services:
  web:
    image: nginx:stable
    ports:
      - "8080:80"
    restart: unless-stopped
    volumes:
      - ./html:/usr/share/nginx/html:ro

  redis:
    image: redis:7
    restart: unless-stopped

Execute-o:

docker compose up -d

Verifique o status:

docker compose ps

Leia os logs:

docker compose logs -f

Pare-o:

docker compose down

O Compose é direto e produtivo. É especialmente bom quando a unidade de pensamento é “este aplicativo tem vários contêineres”. Para uma referência abrangente de comandos e padrões do Compose, veja o Docker Compose Cheatsheet. Para comandos Docker além do Compose — imagens, volumes, redes e limpeza — veja o Docker Cheatsheet.

No que o Podman Quadlet é Bom

O Podman Quadlet é uma maneira de definir contêineres Podman usando arquivos estilo systemd. Em vez de escrever um serviço systemd gerado manualmente, você escreve um arquivo declarativo:

[Unit]
Description=Exemplo de contêiner web
After=network-online.target
Wants=network-online.target

[Container]
Image=docker.io/library/nginx:stable
PublishPort=8080:80
Volume=/opt/example/html:/usr/share/nginx/html:ro

[Service]
Restart=always

[Install]
WantedBy=multi-user.target

Salve-o como /etc/containers/systemd/example.container, então recarregue o systemd:

sudo systemctl daemon-reload

Inicie-o:

sudo systemctl enable --now example.service

Verifique-o:

systemctl status example.service
journalctl -u example.service -f

O apelo principal do Quadlet: o contêiner torna-se um serviço Linux normal.

A Diferença Filosófica

Docker Componse Pensa em Pilhas

O Compose pergunta: Quais serviços compõem este aplicativo?

Um projeto Compose geralmente vive perto do código do aplicativo:

myapp/
  compose.yaml
  .env
  app/
  db/

Você inicia o projeto como uma unidade:

docker compose up -d

Você atualiza o projeto como uma unidade:

docker compose pull
docker compose up -d

Isso é simples, visível e portátil.

Podman Quadlet Pensa em Serviços

O Quadlet pergunta: Quais contêineres este host Linux deve executar como serviços?

Os arquivos Quadlet vivem em caminhos de contêiner relacionados ao systemd:

/etc/containers/systemd/
~/.config/containers/systemd/

Você gerencia serviços gerados com systemd:

systemctl status myapp.service
systemctl restart myapp.service
journalctl -u myapp.service -f

Isso parece mais nativo em um servidor Linux. Para padrões gerais de serviço systemd, veja Executar qualquer Executável como Serviço no Linux.

A Diferença Importante: Quem Possui o Ciclo de Vida?

Com o Docker Compose, o Compose possui o ciclo de vida do aplicativo. Com o Quadlet, o systemd possui o ciclo de vida do serviço.

Isso afeta o comportamento de boot, comportamento de desligamento, política de restart, ordenação de dependências, logs, visibilidade de saúde, serviços de usuário, atualizações, integração com timers e integração com outros serviços do host.

Se você já usa systemd para gerenciar tudo no host, o Quadlet se encaixa perfeitamente. Se você pensa principalmente em termos de pilhas de aplicativos, o Compose é geralmente mais confortável.

Docker Compose Sob systemd vs Quadlet

Você pode executar o Docker Compose como um serviço systemd. Isso é frequentemente um bom padrão. Exemplo de unidade systemd:

[Unit]
Description=Minha Pilha MyApp Docker Compose
Requires=docker.service
After=docker.service network-online.target
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/docker compose up -d --remove-orphans
ExecReload=/usr/bin/docker compose up -d --remove-orphans
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=0
TimeoutStopSec=120

[Install]
WantedBy=multi-user.target

Isso funciona bem. Mas ainda é um wrapper ao redor do Compose. O systemd inicia o comando Compose, enquanto o Docker e o Compose lidam com os contêineres por trás.

Com o Quadlet, a geração de unidade é projetada para Podman e systemd diretamente. Você escreve arquivos de unidade orientados a contêineres, e o systemd gerencia os serviços gerados.

A distinção é sutil, mas importante:

Docker Compose sob systemd:
  systemd gerencia um comando Compose.

Podman Quadlet:
  systemd gerencia serviços de contêiner gerados.

Para um walkthrough detalhado deste padrão, veja Executar Docker Compose como Serviço Linux com systemd.

Comparação de Formato de Arquivo

YAML do Docker Compose

O Compose usa YAML. É compacto, popular e fácil de compartilhar. Também é sensível à indentação e pode ficar bagunçado quando uma pilha se torna grande.

services:
  app:
    image: ghcr.io/example/app:1.0.0
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      APP_ENV: production
    volumes:
      - app-data:/data

volumes:
  app-data:

Arquivos de Unidade Quadlet

O Quadlet usa arquivos semelhantes ao systemd. Eles são mais verbosos quando você tem muitos serviços, mas legíveis se você já entende systemd.

[Unit]
Description=Contêiner de exemplo app
After=network-online.target
Wants=network-online.target

[Container]
Image=ghcr.io/example/app:1.0.0
PublishPort=8080:8080
Environment=APP_ENV=production
Volume=app-data.volume:/data

[Service]
Restart=always

[Install]
WantedBy=multi-user.target

E um arquivo de volume:

[Volume]
VolumeName=app-data

Salvo como app.container e app-data.volume no diretório de contêiner systemd apropriado.

Mapeando Conceitos do Docker Compose para Quadlet

Conceito Compose Equivalente Quadlet
services Arquivos .container ou .pod mais .container
volumes Arquivos .volume ou bind mounts
networks Arquivos .network
ports PublishPort=
environment Environment= ou EnvironmentFile=
restart [Service] Restart=
depends_on systemd After=, Wants=, Requires=
healthcheck Opções de healthcheck do Podman
profiles Habilitação systemd e unidades separadas
docker compose logs journalctl -u service e podman logs
docker compose up -d systemctl start service
docker compose down systemctl stop service
diretório do projeto diretório de unidade de contêiner systemd

A migração é conceitualmente simples, mas não mecânica. O Compose descreve uma pilha. O Quadlet descreve serviços.

Contêineres Rootless

Contêineres rootless são uma das razões mais fortes para olhar para o Podman e Quadlet.

Com o Docker, muitos usuários se adicionam ao grupo docker. Isso é conveniente, mas o acesso ao daemon Docker é efetivamente um acesso poderoso ao host. Em uma estação de trabalho pessoal, isso pode ser aceitável. Em servidores compartilhados, isso merece mais cautela.

O Podman foi projetado com o uso rootless como um fluxo de trabalho de primeira classe. Um Quadlet rootless vive sob o diretório de configuração do usuário:

~/.config/containers/systemd/whoami.container

Então gerencie-o com systemd do usuário:

systemctl --user daemon-reload
systemctl --user enable --now whoami.service
systemctl --user status whoami.service
journalctl --user -u whoami.service -f

Para permitir que o serviço do usuário continue rodando após o logout:

sudo loginctl enable-linger "$USER"

Este é um modelo limpo para serviços pertencentes ao usuário.

Comparação Rootless

Área Docker Compose Podman Quadlet
Configuração comum padrão Daemon Docker com privilégios de root Podman amigável a rootless
Modelo de serviço de usuário Possível, mas menos nativo Nativo com systemctl --user
Risco de acesso ao daemon O socket Docker é poderoso Nenhum daemon root central por padrão
Bind de porta baixa Simples como Docker com privilégios de root Precisa de configuração extra quando rootless
Integração com host Muito comum Mais nativo do Linux
Ajuste para servidor compartilhado Precisa de cuidado Forte ajuste

Rootless não é mágica. Tem compensações em torno de rede, comportamento privilegiado e portas baixas. Mas para serviços de longa duração pertencentes ao usuário, o Quadlet é um modelo muito elegante.

Comportamento de Inicialização e Boot

Docker Compose

O Compose por si só não cria um serviço de boot. Geralmente você confia em políticas de restart do Docker, um wrapper systemd ao redor de docker compose up -d, um script de implantação ou uma ferramenta de nível superior.

Exemplo de política de restart Compose:

services:
  app:
    image: example/app:stable
    restart: unless-stopped

Um wrapper systemd dá a você um serviço em nível de host. Isso é bom, mas ainda é um wrapper extra. Veja Executar Docker Compose como Serviço Linux com systemd para o padrão completo.

Podman Quadlet

O Quadlet já é orientado ao systemd. Habilite na boot:

sudo systemctl enable myapp.service

Para rootless:

systemctl --user enable myapp.service
sudo loginctl enable-linger "$USER"

O comportamento de boot não é um complemento. É o modelo.

Comportamento de Restart

O Compose comumente usa restart: unless-stopped no YAML. O Quadlet comumente usa comportamento de restart do systemd:

[Service]
Restart=always

Ou:

[Service]
Restart=on-failure

Isso move a lógica de restart para o gerenciador de serviços. A preferência: use políticas de restart Compose/Docker para pilhas Compose, use políticas de restart do systemd para Quadlet e não empilhe muitos supervisores. Mantenha um proprietário claro do comportamento de restart.

Comparação de Logs

Logs do Docker Compose

docker compose logs -f
docker compose logs -f app

Isso é excelente para desenvolvedores.

Logs do Quadlet

Os serviços Quadlet usam logs do systemd:

journalctl -u app.service -f

Para unidades rootless:

journalctl --user -u app.service -f

Você ainda pode usar logs do Podman:

podman logs -f container-name

Para operações de servidor, a integração com journalctl é uma grande vantagem. Seus contêineres se encaixam no mesmo fluxo de trabalho de logs que outros serviços Linux.

Atualizações

Atualizando Docker Compose

Um fluxo de atualização comum:

cd /opt/myapp
docker compose pull
docker compose up -d --remove-orphans
docker image prune -f

Fácil de envolver em um script:

#!/usr/bin/env bash
set -euo pipefail

cd /opt/myapp

docker compose config --quiet
docker compose pull
docker compose up -d --remove-orphans
docker image prune -f
docker compose ps

Atualizando Podman Quadlet

Um fluxo manual simplificado:

sudo podman pull ghcr.io/example/app:1.0.1
sudo systemctl restart app.service

Ou para rootless:

podman pull ghcr.io/example/app:1.0.1
systemctl --user restart app.service

O Podman pode suportar fluxos de auto-atualização quando os contêineres são configurados com os rótulos e a política de imagem corretos. A vantagem do Quadlet não é que as atualizações sejam sempre mais simples. A vantagem é que as atualizações são nativas do gerenciador de serviços.

Filosofia de Auto-Atualização

Auto-atualizações são convenientes. Elas também são um risco. Para serviços de homelab de baixo risco, atualizações automáticas de contêineres podem ser aceitáveis. Para bancos de dados, apps com estado ou serviços de negócios, o fluxo preferido é:

  1. Backup.
  2. Pull.
  3. Recriar ou restart.
  4. Verificar saúde.
  5. Prune mais tarde.

O Compose torna isso explícito. O Quadlet e o Podman podem torná-lo nativo do systemd. Nenhuma ferramenta remove a necessidade de um plano de rollback.

Volumes e Dados Persistentes

Volumes Compose

O Compose suporta volumes nomeados:

services:
  db:
    image: postgres:16
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

E bind mounts:

services:
  app:
    image: example/app
    volumes:
      - ./config:/config:ro
      - ./data:/data

Volumes Quadlet

O Quadlet pode usar bind mounts:

[Container]
Volume=/opt/app/config:/config:ro
Volume=/opt/app/data:/data

Ou um arquivo .volume:

[Volume]
VolumeName=app-data

Então referencie-o:

[Container]
Volume=app-data.volume:/data

O Compose é mais compacto para armazenamento em nível de pilha. O Quadlet está mais alinhado com unidades de serviço gerenciadas independentemente.

Secrets e Arquivos de Ambiente

Compose

O Compose frequentemente usa env_file ou environment no YAML. Para um pequeno serviço privado, .env é comum. Para sistemas sérios, trate .env como sensível e mantenha-o fora do Git.

Quadlet

O Quadlet pode usar:

[Container]
Environment=APP_ENV=production
EnvironmentFile=/opt/app/app.env

Restrinja permissões:

chmod 600 /opt/app/app.env

Nem o Compose nem o Quadlet são um sistema completo de gerenciamento de secrets por si só. Não confunda “não na linha de comando” com “seguro”.

Rede

Rede Compose

O Compose cria uma rede de projeto padrão e dá nomes DNS aos serviços baseados nos nomes dos serviços:

services:
  app:
    image: example/app
    depends_on:
      - db

  db:
    image: postgres:16

O app geralmente pode alcançar o banco de dados em db. A rede de aplicativos multi-contêiner parece natural. Esta é uma das características mais fortes do Compose.

Rede Quadlet

O Quadlet pode definir redes separadamente com arquivos .network ou usar opções de rede do Podman:

[Network]
NetworkName=appnet

Arquivo de contêiner:

[Container]
Image=example/app:stable
Network=appnet.network

Isso é mais explícito e semelhante ao systemd. Para um ou dois contêineres, está bem. Para uma pilha de app grande, o Compose é frequentemente mais fácil de ler.

Pods

O Podman tem um conceito nativo de pod. Isso importa se você gosta do modelo mental do Kubernetes onde múltiplos contêineres compartilham um namespace de rede e limite de ciclo de vida. O Quadlet suporta arquivos .pod:

[Pod]
PodName=myapp
PublishPort=8080:8080

Um contêiner pode juntar-se a esse pod:

[Container]
Image=ghcr.io/example/app:stable
Pod=myapp.pod

O Compose não tem o mesmo modelo de pod. Ele tem serviços em redes. Para a maioria dos aplicativos web simples, as redes Compose são suficientes. Para usuários do Podman que gostam de agrupamento estilo pod, o Quadlet é uma melhor correspondência.

Fluxos de Trabalho de Build

O Compose geralmente é melhor quando você constrói imagens como parte do fluxo de trabalho do aplicativo local:

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"

Então:

docker compose up --build

Isso é extremamente conveniente para desenvolvimento. O Quadlet geralmente é melhor quando você executa imagens já construídas como serviços. Construa imagens com Podman separadamente:

podman build -t localhost/myapp:latest .

Então referencie a imagem:

[Container]
Image=localhost/myapp:latest

Se seu fluxo de trabalho é “editar código, reconstruir, restart pilha”, o Compose ganha. Se seu fluxo de trabalho é “implantar uma imagem conhecida como um serviço Linux”, o Quadlet ganha.

Portabilidade

Os arquivos Compose são amplamente compartilhados. Muitos projetos de código aberto fornecem um compose.yaml ou docker-compose.yml. Se um projeto diz “execute isso com Docker Compose”, você geralmente pode começar rapidamente com docker compose up -d. Esta é uma grande vantagem prática.

O Quadlet é portátil entre sistemas que têm Podman, systemd e suporte Quadlet compatível. Este é um alvo mais estreito, mas muito bom para servidores Linux modernos. O Quadlet não é o melhor formato para compartilhar um aplicativo com todos os possíveis desenvolvedores. É um bom formato para descrever como um host Linux específico deve executar um serviço contêinerizado.

Experiência do Desenvolvedor

O Docker Compose geralmente vence na experiência do desenvolvedor. Mais exemplos, mais tutoriais, mais templates de projeto, builds locais mais fáceis, pilha de arquivo único fácil, docker compose up familiar e forte ajuste para dependências de dev. Um desenvolvedor pode ler isso rapidamente:

services:
  db:
    image: postgres:16
  redis:
    image: redis:7
  app:
    build: .

O Quadlet pode fazer coisas semelhantes, mas é mais moldado para operações. Para desenvolvimento local, eu raramente começaria com Quadlet a menos que o aplicativo em si seja especificamente sobre Podman ou systemd.

Experiência de Operações

O Quadlet frequentemente vence na experiência de operações em um host Linux. Razões:

  • systemctl nativo
  • journalctl nativo
  • Serviços de usuário rootless
  • Dependências systemd
  • Timers systemd
  • Comportamento de restart systemd
  • Sem daemon Docker central
  • Melhor ajuste com gerenciamento de serviço do host

Um administrador de servidor pode raciocinar sobre:

systemctl status app.service
journalctl -u app.service -f
systemctl restart app.service

Este é o fluxo de trabalho de serviço Linux normal.

Modelo de Segurança

Notas de Segurança do Docker Compose

O Docker Compose geralmente fala com o daemon Docker. Em uma instalação normal do Docker Linux, o acesso ao socket Docker é poderoso. Um usuário que pode controlar o Docker frequentemente pode montar caminhos do host, executar contêineres privilegiados ou, de outra forma, obter controle amplo do host. Para opções de instalação incluindo Docker rootless no Ubuntu, veja Instalar Docker no Ubuntu.

Conselho prático:

  • Não exponha casualmente /var/run/docker.sock.
  • Trate o grupo docker como privilegiado.
  • Evite contêineres privilegiados.
  • Evite mounts do host a menos que necessário.
  • Mantenha secrets fora do Git.
  • Use tags de imagem explícitas para serviços importantes.
  • Revise portas publicadas.

Notas de Segurança do Quadlet

O Podman Quadlet se emparelha bem com contêineres rootless e serviços systemd de usuário. Isso pode reduzir o risco, especialmente em hosts compartilhados ou servidores pessoais onde os serviços não devem exigir um daemon root.

Conselho prático:

  • Prefira serviços rootless quando se ajustarem.
  • Use unidades de usuário para serviços pertencentes ao usuário.
  • Use unidades de sistema apenas quando privilégios em nível de host forem necessários.
  • Evite contêineres privilegiados desnecessários.
  • Mantenha arquivos de ambiente bloqueados.
  • Pense cuidadosamente sobre bind mounts.

Rootless não significa livre de risco. Significa que o raio de explosão padrão pode ser menor.

Desempenho

Para a maioria dos serviços web, ferramentas internas e apps auto-hospedados, o desempenho não é o fator decisivo. As principais diferenças são operacionais, não velocidade bruta. Escolha baseado no modelo de ciclo de vida, modelo de segurança, integração com host, familiaridade da equipe, processo de atualização, necessidades de rede e fluxo de trabalho de depuração.

Se você está escolhendo entre Compose e Quadlet apenas por desempenho, provavelmente está otimizando a camada errada.

Modos de Falha

Modos de Falha do Docker Compose

Problemas comuns:

  • Daemon Docker não rodando
  • Plugin Compose faltando
  • Diretório de projeto errado
  • .env não carregado como esperado
  • Binário antigo docker-compose usado acidentalmente
  • Contêineres não recriados após mudanças de config
  • Contêineres órfãos deixados após renomeação de serviço
  • Volumes deletados com down -v
  • Logs do Docker enchendo o disco
  • Erros de permissão do socket Docker

Melhores correções:

docker compose config
docker compose ps
docker compose logs -f
docker compose up -d --remove-orphans

Modos de Falha do Podman Quadlet

Problemas comuns:

  • Arquivo de unidade no diretório errado
  • Esqueceu systemctl daemon-reload
  • Usando unidades de sistema quando unidades de usuário eram pretendidas
  • Esqueceu loginctl enable-linger para serviços rootless
  • Pull de imagem leva mais tempo que o timeout de startup systemd
  • cgroup v2 não disponível
  • Rótulos SELinux ou permissões de volume
  • Nome do serviço difere das expectativas do arquivo
  • Unidade de rede ou volume não habilitada ou referenciada corretamente

Melhores correções:

systemctl status app.service
journalctl -u app.service -f
systemctl daemon-reload
podman ps -a
podman logs container-name

Para rootless:

systemctl --user status app.service
journalctl --user -u app.service -f

Exemplo de Migração: Compose para Quadlet

Comece com este serviço Compose:

services:
  whoami:
    image: traefik/whoami:v1.10
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      WHOAMI_NAME: compose-demo

Execute com Compose:

docker compose up -d

Um equivalente Quadlet aproximado:

[Unit]
Description=Contêiner demo Whoami
After=network-online.target
Wants=network-online.target

[Container]
Image=docker.io/traefik/whoami:v1.10
PublishPort=8080:80
Environment=WHOAMI_NAME=quadlet-demo

[Service]
Restart=always

[Install]
WantedBy=multi-user.target

Salve como /etc/containers/systemd/whoami.container, então:

sudo systemctl daemon-reload
sudo systemctl enable --now whoami.service
sudo systemctl status whoami.service

O exemplo é fácil porque é um único contêiner. Uma pilha Compose maior com bancos de dados, redes, volumes e etapas de build precisa de tradução mais cuidadosa.

Checklist de Migração

Antes de migrar do Compose para o Quadlet, pergunte:

[ ] Esta pilha é realmente um conjunto de serviços de host de longa duração?
[ ] As imagens já estão construídas e publicadas?
[ ] Preciso de serviços rootless?
[ ] Quero dependências e timers systemd?
[ ] Volumes e bind mounts são claramente compreendidos?
[ ] As portas estão documentadas?
[ ] Secrets são tratados fora do Git?
[ ] Existe um processo de backup e restauração?
[ ] Posso monitorar logs através do journalctl?
[ ] Tenho um caminho de rollback?

Se a maioria das respostas for sim, o Quadlet pode ser um bom ajuste. Se a pilha for principalmente para desenvolvimento local, o Compose provavelmente ainda é melhor.

Quando Permanecer com Docker Compose

Permaneça com o Compose quando:

  • O projeto já entrega um bom arquivo Compose.
  • Você precisa do caminho de onboarding mais fácil.
  • Desenvolvedores executam a mesma pilha localmente.
  • Você constrói imagens durante o desenvolvimento.
  • Você quer um arquivo YAML para serviços, volumes e redes.
  • Você quer máxima compatibilidade com tutoriais e comunidade.
  • Seu wrapper systemd atual funciona bem.

Não há prêmio por migrar uma pilha Compose funcional para Quadlet apenas porque o Quadlet é mais limpo em teoria. Se o Compose é entediante e confiável para seu caso de uso, mantenha-o.

Quando Mudar para Podman Quadlet

Mude para o Quadlet quando:

  • A pilha é realmente um serviço de host.
  • Você quer gerenciamento de serviço rootless.
  • Você prefere Podman sobre Docker.
  • Você quer que o systemd possua o ciclo de vida.
  • Você quer logs journalctl.
  • Você quer dependências de serviço.
  • Você quer serviços de usuário que sobrevivam ao logout.
  • Você quer menos exposição ao daemon Docker.
  • Você está construindo um host de auto-hospedagem em torno do systemd.

O Quadlet não é “Compose, mas melhor”. É um centro de design diferente.

Padrões Recomendados

Padrão 1: Desenvolvimento Local

Use Docker Compose. Rápido, familiar, portátil, fácil de reconstruir, fácil para equipes.

Padrão 2: Auto-Hospedagem em Host Único

Use qualquer um. Escolha Compose se o projeto já fornece um arquivo Compose. Escolha Quadlet se você quer gerenciamento de serviço nativo do systemd. O Compose dá um melhor bundle de app; o Quadlet dá um melhor serviço Linux.

Padrão 3: Serviço Rootless Pertencente ao Usuário

Use Podman Quadlet. Fluxo de trabalho rootless, gerenciamento de serviço em nível de usuário, sem daemon Docker central.

~/.config/containers/systemd/app.container
systemctl --user enable --now app.service
loginctl enable-linger

Padrão 4: Servidor Único Similar à Produção

Use Docker Compose com um wrapper systemd disciplinado, ou use Quadlet se sua equipe estiver confortável com Podman. Não escolha baseado em moda. Escolha baseado em quem o operará às 2 da manhã.

Padrão 5: Plataforma Multi-Nó

Use nenhum como a camada final de orquestração. Considere Kubernetes, Nomad, Swarm ou uma plataforma gerenciada. Compose e Quadlet são excelentes ferramentas de host único. Eles não são agendadores de cluster.

Árvore de Decisão Prática

Isso é principalmente para desenvolvimento local?
  sim:
    use Docker Compose
  não:
    continue

O projeto já fornece um compose.yaml mantido?
  sim:
    use Docker Compose a menos que você tenha uma razão forte para migrar
  não:
    continue

Você quer serviços de longa duração rootless gerenciados pelo systemd?
  sim:
    use Podman Quadlet
  não:
    continue

Você quer a definição de app multi-contêiner mais fácil?
  sim:
    use Docker Compose
  não:
    continue

Você quer que contêineres se comportem como serviços Linux normais?
  sim:
    use Podman Quadlet
  não:
    use Docker Compose

Comandos Lado a Lado

Tarefa Docker Compose Podman Quadlet
Iniciar docker compose up -d systemctl start app.service
Parar docker compose down systemctl stop app.service
Restart docker compose restart systemctl restart app.service
Aplicar mudanças docker compose up -d systemctl daemon-reload && systemctl restart app.service
Logs docker compose logs -f journalctl -u app.service -f
Status docker compose ps systemctl status app.service
Habilitar na boot wrapper systemd ou política de restart systemctl enable app.service
Pull atualização docker compose pull podman pull image
Serviço rootless possível natural com systemctl --user

Mal-Entendidos Comuns

“Quadlet Substitui Docker Compose”

Não exatamente. O Quadlet substitui alguns casos de uso do Compose, especialmente serviços Linux de longa duração. Ele não substitui o Compose como o formato de pilha de aplicativo mais fácil para desenvolvedores.

“Docker Compose Não Está Pronto para Produção”

Demais amplo. O Compose pode ser perfeitamente razoável para pequenos sistemas de produção se você entender backups, atualizações, logs, comportamento de restart e segurança do host. O problema não é o Compose. O problema é fingir que uma implantação Compose de host único tem as mesmas propriedades que um orquestrador de cluster.

“Podman É Apenas Docker Sem o Daemon”

Muito simples. O Podman tem comandos compatíveis com Docker, mas seu centro de design é diferente: operação sem daemon, fluxos de trabalho rootless, pods e integração Linux.

“Rootless Significa Seguro”

Não. Rootless reduz alguns riscos. Não torna imagens ruins, secrets expostos, bind mounts inseguros ou apps vulneráveis seguros.

“systemd É Muito Pesado para Contêineres”

O systemd já é o gerenciador de serviços na maioria dos servidores Linux mainstream. Usá-lo para gerenciar contêineres de longa duração não é estranho. Frequentemente é a coisa entediantemente correta a se fazer.

Recomendação Final

Use Docker Compose quando a pilha de aplicativo for a principal coisa. Use Podman Quadlet quando o serviço Linux for a principal coisa.

Essa distinção é mais útil do que argumentar qual ferramenta é melhor. Para fluxos de trabalho de desenvolvedor, o Compose é difícil de superar. É popular, legível, portátil e suportado por incontáveis projetos. Para serviços Linux de longa duração, o Quadlet é silenciosamente excelente. Ele faz contêineres parecerem serviços systemd nativos, funciona naturalmente com Podman rootless e se encaixa no modelo operacional de um host Linux sério.

A divisão preferida:

Desenvolvimento local: Docker Compose
Exemplos de app portáveis: Docker Compose
Pilhas auto-hospedadas pequenas: Docker Compose ou Quadlet
Serviços de usuário rootless: Podman Quadlet
Serviços de host de longa duração: Podman Quadlet
Orquestração multi-nó: nenhum; use um orquestrador real

Não migre apenas para ser moderno. Migre quando o modelo de ciclo de vida for melhor. O Compose é uma ótima ferramenta de pilha. O Quadlet é uma ótima ferramenta de serviço. A escolha inteligente é usar cada um onde seu modelo mental corresponde ao trabalho.

Referências

Assinar

Receba novos artigos sobre sistemas, infraestrutura e engenharia de IA.