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
| Docker | Podman | |
|---|---|---|
| Arquitetura | Daemon dockerd como root | Sem daemon; cada container é filho do comando ou do systemd |
| Rootless | Possível, configuração à parte | Padrão para usuários comuns |
| Inicialização automática | restart: always no daemon | Unidades systemd via Quadlet |
| Compose | Nativo (docker compose) | podman compose chama um provedor externo (podman-compose ou docker-compose) |
| Pods | Não | Sim, 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 comandopodman auto-updatebaixa 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 comlatest. - 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
- Referência do Quadlet (podman-systemd.unit)
- Tutorial oficial de Podman rootless
- Instalação do Podman
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.
