Use o Podman no lugar do Docker: containers sem root e sem daemon, compatibilidade com comandos docker e serviços com Quadlet e systemd.

Para que serve

O Podman executa as mesmas imagens OCI do Docker, com comandos quase idênticos, mas sem um daemon central rodando como root. Cada container é um processo comum, que pode pertencer a um usuário sem privilégios (rootless), e o systemd cuida de iniciar e reiniciar tudo através do Quadlet. É uma boa escolha quando você quer reduzir o impacto de uma eventual fuga de container, ou integrar containers ao systemd sem ferramentas extras.

Se você já usa Docker e está satisfeito, não há obrigação de migrar. Para a instalação do Docker, veja Como instalar Docker e Docker Compose no Debian e no Ubuntu.

Pré-requisitos

  • Debian 13 (Podman 5.4) ou Ubuntu 24.04 (Podman 4.9). Os exemplos funcionam nos dois; Debian 13 tem a versão mais nova.
  • Um usuário comum para rodar os containers, por exemplo apps (veja Como criar usuários administrativos e configurar o sudo).
  • Evite instalar Docker e Podman no mesmo host de produção: as regras de firewall dos dois podem se confundir.

Docker x Podman em resumo

DockerPodman
ArquiteturaDaemon dockerd como rootSem daemon; cada container é filho do comando ou do systemd
RootlessPossível, configuração à partePadrão para usuários comuns
Inicialização automáticarestart: always no daemonUnidades systemd via Quadlet
ComposeNativo (docker compose)podman compose chama um provedor externo (podman-compose ou docker-compose)
PodsNãoSim, no mesmo conceito do Kubernetes

Etapa 1: instalar o Podman

apt update
apt install -y podman podman-compose uidmap slirp4netns passt systemd-container
podman --version

Confira se o usuário tem faixas de UID/GID subordinadas, usadas para mapear os usuários de dentro do container:

grep apps /etc/subuid /etc/subgid

Se não aparecer nada, adicione: usermod --add-subuids 100000-165535 --add-subgids 100000-165535 apps.

Etapa 2: rodar o primeiro container rootless

Entre como o usuário (com sessão completa, não com su simples, para que o systemd do usuário exista):

machinectl shell apps@      # ou faça login por SSH como apps
podman run -d --name web -p 8080:80 docker.io/library/nginx:1.28-alpine
podman ps
curl -I http://127.0.0.1:8080

Use sempre o nome completo da imagem (docker.io/library/...): o Podman pode perguntar de qual registry baixar quando o nome é curto. Comandos como podman logs, podman exec, podman build e podman images funcionam como no Docker. Se quiser, o pacote podman-docker cria um alias docker que chama o Podman.

Etapa 3: transformar o container em serviço com Quadlet

O Quadlet lê arquivos .container, .volume, .network e .pod e gera unidades systemd automaticamente. Remova o teste (podman rm -f web) e crie, como o usuário apps, o arquivo ~/.config/containers/systemd/web.container:

[Unit]
Description=Site nginx em Podman

[Container]
ContainerName=web
Image=docker.io/library/nginx:1.28-alpine
PublishPort=8080:80
Volume=%h/site:/usr/share/nginx/html:ro,Z
AutoUpdate=registry

[Service]
Restart=always

[Install]
WantedBy=default.target

Ative:

mkdir -p ~/site && echo ok > ~/site/index.html
systemctl --user daemon-reload
systemctl --user start web.service
systemctl --user status web.service

Não use systemctl enable com Quadlet: a seção [Install] já faz a unidade subir no boot. Para containers do sistema (rootful), o arquivo vai em /etc/containers/systemd/ e os comandos são sem --user.

Etapa 4: manter os serviços do usuário após o logout e no boot

Por padrão, os serviços de um usuário param quando ele sai. Habilite o linger como root:

loginctl enable-linger apps

Etapa 5: atualizações automáticas e portas baixas

  • Atualização de imagens: com AutoUpdate=registry, o comando podman auto-update baixa a nova imagem da mesma tag e reinicia o serviço. Ative o timer: systemctl --user enable --now podman-auto-update.timer. Use isso com tags que recebem só correções (ex.: 1.28-alpine), não com latest.
  • Portas 80 e 443 sem root: usuários comuns não podem abrir portas abaixo de 1024. Ou publique em portas altas atrás de um proxy reverso, ou libere a partir da porta 80:
    echo 'net.ipv4.ip_unprivileged_port_start=80' > /etc/sysctl.d/99-portas.conf
    sysctl --system

Como saber se funcionou

systemctl --user list-units 'web*'
podman ps
curl http://127.0.0.1:8080          # deve responder "ok"
sudo reboot                          # depois do boot, repita o curl

Depois do reinício o serviço deve voltar sozinho, sem que o usuário faça login. Os logs ficam no journal: journalctl --user -u web.service.

Problemas comuns

"Failed to connect to bus" ao usar systemctl --user

Você entrou com su ou sudo -u, que não criam sessão de usuário. Use machinectl shell apps@ ou SSH direto.

Arquivo .container não gera serviço

Valide a sintaxe com o gerador: /usr/libexec/podman/quadlet -dryrun -user. Ele mostra o erro (chave desconhecida, por exemplo, porque algumas chaves só existem no Podman 5).

Permission denied em volumes

No rootless, o root do container é o seu usuário no host, e os demais UIDs são mapeados para a faixa subordinada. Ajuste a propriedade com podman unshare chown 101:101 ~/site (use o UID que a imagem espera).

As portas aparecem abertas mesmo com o firewall

No modo rootless, a porta é aberta por um processo comum no host, então o UFW/nftables do host filtra normalmente. Já containers rootful criam regras próprias de NAT; revise o firewall nesse caso, como no Docker.

Perguntas frequentes

Meu docker-compose.yml funciona no Podman?

Na maioria dos casos, sim, com podman compose up -d. Para produção, converter os serviços para Quadlet dá mais integração com o systemd.

Posso rodar o Portainer com Podman?

Sim, ativando o socket compatível com a API do Docker: systemctl --user enable --now podman.socket.

Podman ajuda a migrar para Kubernetes?

Ajuda. O comando podman kube generate cria um YAML de Kubernetes a partir de containers ou pods existentes, e podman kube play faz o caminho inverso.

Leitura complementar

Precisa de ajuda?

Para problemas de acesso ao servidor ou de rede, abra um ticket. A configuração do Podman e dos containers é feita por você, conforme este guia.

Esta resposta lhe foi útil? 0 Usuários acharam útil (0 Votos)

Leia também