Guia prático: como reduzir uso de disco por logs de containers Docker em VPS com rotação, compressão e retenção sem perder rastreabilidade
Por Kevin Marcondes · Publicado em · 8 min de leitura
Como reduzir uso de disco por logs de containers Docker em VPS com rotação, compressão e retenção sem perder rastreabilidade? Aqui você vê o diagnóstico rápido, configurações seguras e como validar tudo. O foco é limitar crescimento, comprimir com eficiência e manter trilhas para auditoria e debugging sem surpresas.
O problema: logs de containers lotando o disco da VPS
Logs em JSON podem crescer sem controle em /var/lib/docker/containers. Em VPS com discos pequenos, poucas horas com DEBUG bastam para esgotar espaço e derrubar serviços. A boa notícia: dá para limitar tamanho, comprimir e reter o que importa, sem abrir mão da investigação.
Antes de aplicar mudanças, garanta monitoramento básico do filesystem e alertas. Se ainda não tem, veja uma base com Prometheus e Grafana em Docker em como configurar Prometheus e Grafana com Docker Compose.
Causas principais e como diagnosticar o volume atual
Na maioria dos casos, o driver padrão json-file grava stdout/stderr sem rotação configurada. Apps verbosas, níveis de log elevados e erros em loop fazem o volume disparar.
Rode um diagnóstico rápido para mapear quem está ocupando espaço e onde agir primeiro:
- Driver json-file sem limites (max-size/max-file).
- Aplicações com DEBUG/TRACE habilitado em produção.
- Falhas com retries em loop gerando logs duplicados.
- Falta de centralização e retenção fora da VPS.
# Espaço do filesystem
df -h /
# Maiores arquivos de log por container
sudo du -h /var/lib/docker/containers/*/*-json.log | sort -h | tail -n 20
# Uso de espaço por imagens/containers/volumes
docker system df
# Tamanho total de logs por container (agrupado)
sudo find /var/lib/docker/containers -name "*-json.log" -printf '%s %p\n' | awk '{print $1, $2}' | sort -n | tail -n 20
Estratégia segura: rotação, compressão e retenção equilibradas
Para quem busca como reduzir uso de disco por logs de containers Docker em VPS com rotação, compressão e retenção sem perder rastreabilidade, a abordagem em camadas funciona melhor.
O objetivo é limitar crescimento, reduzir custo em disco e preservar trilhas de auditoria úteis. Combine políticas locais com retenção externa quando necessário.
Para manter rastreabilidade útil, prefira logs estruturados e IDs de correlação. Se precisar de um guia prático, veja logs estruturados (JSON) e correlação.
- Rotação e retenção no próprio Docker (por tamanho e número de arquivos).
- Compressão dos arquivos já rotacionados para economizar espaço.
- Políticas de retenção alinhadas ao requisito de auditoria da sua equipe.
- Opcional: centralização (ex.: Fluentd/Elasticsearch ou Loki) para pesquisas e retenção longa. Veja centralização com Fluentd + Elasticsearch.
Implementação com json-file: rotação e retenção nativas
Defina limites globais no Docker daemon para o driver json-file. Isso controla tamanho máximo por arquivo e quantidade de arquivos rotacionados por container. Ajuste valores ao seu perfil de tráfego.
Após salvar, recarregue o Docker. Em Compose, também é possível definir logging.driver e logging.options por serviço se precisar de exceções pontuais.
- Arquivo: /etc/docker/daemon.json
- Recarregar: sudo systemctl reload docker (ou restart se necessário).
- Em Compose: logging: driver: "json-file" com opções equivalentes.
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "5"
}
}
Compressão automática dos rotacionados (economia real de espaço)
O Docker não comprime os arquivos rotacionados. Para isso, automatize a compressão com um script e um systemd timer. A regra abaixo comprime arquivos a partir de .2, preservando o mais recente (.1) para inspeções rápidas.
Atenção: não use logrotate para rotacionar esses arquivos novamente. Aqui, apenas comprimimos os que o Docker já rotacionou.
# /usr/local/bin/compress-docker-logs.sh
set -euo pipefail
# Comprime logs já rotacionados (do .2 em diante) maiores que 1MB
find /var/lib/docker/containers -type f \
-regex ".*\-json\.log\.[2-9][0-9]*$" -size +1M -print0 | xargs -0 -r gzip -9
# Unidade systemd: /etc/systemd/system/compress-docker-logs.service
[Unit]
Description=Compress rotated Docker JSON logs
[Service]
Type=oneshot
ExecStart=/usr/local/bin/compress-docker-logs.sh
# Timer: /etc/systemd/system/compress-docker-logs.timer
[Unit]
Description=Run Docker logs compression periodically
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target
# Ativar
sudo systemctl daemon-reload
sudo systemctl enable --now compress-docker-logs.timer
Alternativas: driver local, journald ou centralização
Dependendo do seu cenário, outras opções podem reduzir ainda mais o uso de disco ou melhorar consultas. Compare rapidamente as abordagens antes de decidir. Para retenção longa e buscas complexas, priorize mover os logs para fora da VPS com uma stack centralizada.
| Opção | Rotação/Retenção | Compressão | Prós | Contras/Observações |
|---|---|---|---|---|
| json-file (com max-size/max-file) | + fácil, por tamanho/quantidade | Via script externo | Simplicidade, porta de entrada | Arquivos JSON grandes; compressão separada |
| local (driver Docker) | Por tamanho/quantidade | Não aplicável (formato binário) | Mais eficiente em espaço que JSON | Menos legível sem docker CLI |
| journald (driver) | Pela política do journald | Compressão interna | Integração com journalctl | Depende da config global do sistema |
| Centralização (Fluentd/Elasticsearch ou Loki) | Na stack central | Na stack central | Busca e retenção longas fora da VPS | Mais componentes; requer operação dedicada |
Garantir rastreabilidade ao limitar e comprimir logs
Reduzir espaço não pode quebrar investigações. Preserve o essencial para reconstruir eventos e correlacionar requisições. Em ambientes com auditoria, defina uma janela mínima de retenção local e transfira o histórico para uma stack central.
- Log estruturado (JSON) com timestamp em UTC e nível de log.
- Correlation ID em cada requisição e propagação entre serviços.
- Inclua service, versão/tag e container_name nos logs.
- Evite DEBUG em produção; adote INFO e WARN/ERROR bem categorizados.
- Alertas de uso de disco e crescimento anômalo de logs em checklist de segurança para VPS.
Verificação e solução de problemas comuns
Depois de aplicar as políticas, valide se rotação e compressão estão ativas e se os containers estão usando o driver previsto. Se algo falhar, veja os pontos abaixo antes de reverter.
Se sua VPS já está crítica, libere espaço com cuidado. Faça backup do que precisa manter antes de remover arquivos. Veja também uma estratégia de snapshots e backups incrementais em LVM snapshots + Restic em S3.
Esse checklist fecha o ciclo de como reduzir uso de disco por logs de containers Docker em VPS com rotação, compressão e retenção sem perder rastreabilidade, mantendo espaço livre e rastreabilidade.
- Containers antigos podem manter configurações de logging próprias; recrie-os.
- Compose pode sobrescrever o daemon.json; alinhe as opções.
- copytruncate no logrotate pode perder registros; prefira rotação nativa do Docker.
- Se não há novos arquivos .1, a rotação não ocorreu: revise max-size.
- Evite comprimir .1 para inspeção rápida de incidentes recentes.
# Conferir driver e opções de logging de um container
CONTAINER=myapp
docker inspect -f '{{.HostConfig.LogConfig.Type}} {{json .HostConfig.LogConfig.Config}}' "$CONTAINER"
# Ver rotacionados e compactados
ls -lh /var/lib/docker/containers/*/*-json.log*
# Forçar alguns logs e observar rotação
docker logs -f "$CONTAINER" & sleep 2; pkill -f "docker logs -f"
Perguntas frequentes
Qual valor usar para max-size e max-file no Docker?
Depende do volume de logs e do tamanho do disco. Comece com um tamanho moderado por arquivo e poucos arquivos rotacionados. Monitore por uma semana e ajuste. O importante é manter margem de segurança no filesystem e não perder eventos relevantes.
Posso apagar os arquivos *-json.log.1, .2, etc. manualmente?
Pode, mas faça com cautela e, se possível, após garantir que a rotação e compressão estão funcionando. Se apagar manualmente, remova apenas os rotacionados (.1, .2...), nunca o arquivo ativo. Mantenha backups do que for necessário para auditoria.
Logrotate é obrigatório para compressão?
Não. Você pode usar um script com systemd timer para comprimir apenas os arquivos rotacionados pelo Docker, evitando conflitos. O logrotate é útil quando ele próprio faz a rotação, mas com o Docker é melhor deixar a rotação a cargo do driver e apenas comprimir depois.
Mudar para o driver local ajuda a economizar espaço?
Em muitos cenários, sim. O driver local armazena em formato binário mais compacto que JSON e respeita políticas de rotação por tamanho e quantidade. Avalie em ambiente de teste, valide ferramentas de leitura e monitore o uso de CPU e I/O.
Essas políticas afetam performance dos containers?
Em geral, o impacto é baixo. Tamanhos muito pequenos podem causar rotações frequentes e mais I/O. Compressão com gzip -9 consome CPU; execute por timer e evite horários de pico. Observe métricas de CPU, disco e latência após habilitar as políticas.
Como garantir rastreabilidade após compressão?
Mantenha logs estruturados com timestamps precisos e IDs de correlação. Preserve ao menos um arquivo rotacionado não compactado (.1) para inspeção rápida. Para investigações antigas, armazene e consulte na solução central de logs fora da VPS.
Quer reduzir espaço de logs sem perder rastreabilidade?
Se você precisa adaptar políticas de rotação, compressão e retenção ao seu ambiente Docker, vamos conversar sobre seu contexto e montar um plano seguro.
Falar sobre meu ambiente DockerVeja também
- 502 Bad Gateway intermitente em Docker Compose com Nginx e PHP‑FPM: como diagnosticar e corrigir timeouts e excesso de conexões
- Como diagnosticar e capturar pacotes para intermitência de rede entre containers Docker no Debian
- Como reduzir tempo de build e evitar artefatos duplicados em CI para monólitos PHP grandes
- Como detectar e corrigir inconsistências de SKU duplicados entre WooCommerce e ERP sem perder pedidos