Como liberar espaço em disco no Docker

O Docker acumula espaço em disco de três formas: imagens que não são mais usadas (incluindo layers antigas), containers parados que não foram removidos, e volumes anônimos órfãos. O comando docker system df mostra exatamente quanto cada um ocupa. Para uma limpeza segura de tudo que não está em uso: docker system prune. Para remover também imagens sem container associado: docker system prune -a.

Ver quanto espaço o Docker está usando

Antes de limpar, identifique o que está ocupando espaço:

bash
# Resumo de uso por categoria
docker system df

# Versão detalhada com nomes individuais
docker system df -v

# Ver tamanho total do diretório do Docker (requer sudo)
sudo du -sh /var/lib/docker/

Limpeza segura (apenas recursos não usados)

docker system prune remove apenas o que não tem nenhum container ativo associado, é seguro para produção:

bash
# Remove: containers parados, redes não usadas, imagens dangling*, build cache
docker system prune

# Com confirmação automática (útil em scripts/CI)
docker system prune -f

# * Imagem "dangling" = layers sem tag, resultado de rebuilds.
# Exemplos de imagens dangling:
docker images -f dangling=true
docker image prune -f   # remove apenas dangling

Limpeza agressiva (remove imagens sem container ativo)

docker system prune -a remove também imagens que não têm nenhum container rodando ou parado associado. Elas serão baixadas novamente na próxima execução:

bash
# ATENÇÃO: isso remove TODAS as imagens sem container associado
# Os containers precisarão baixar as imagens novamente no próximo start
docker system prune -a

# Para limpar só imagens (sem tocar em containers, volumes ou redes):
docker image prune -a

# Remover apenas imagens mais antigas que X dias:
docker image prune -a --filter "until=720h"  # 30 dias

Volumes órfãos (cuidado: irreversível)

Volumes Docker sem container associado ocupam espaço mas podem conter dados importantes de containers removidos. Inspecione antes de apagar:

bash
# Listar volumes sem container associado
docker volume ls -f dangling=true

# Inspecionar um volume antes de remover
docker volume inspect nome_do_volume

# Remover apenas volumes órfãos (CONFIRME que são inúteis antes!)
docker volume prune

# Remover um volume específico
docker volume rm nome_do_volume

Automatizar limpeza periódica

Configure limpeza automática de imagens e containers para o disco não encher gradualmente:

bash
# Adicionar ao crontab para rodar toda semana às 3h da manhã
# crontab -e
0 3 * * 0 docker system prune -f >> /var/log/docker-prune.log 2>&1

# Configurar log rotation automático no Docker daemon
# /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

# Aplicar sem reiniciar containers:
sudo systemctl reload docker

Não quer configurar manualmente?

Implante o Docker em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Causas comuns: logs de containers sem rotação configurada (crescem indefinidamente), build cache acumulado de muitos docker build, imagens antigas de versões anteriores, ou volumes anônimos criados por containers já removidos. Use docker system df -v para identificar o maior ofensor.

Não. docker system prune nunca remove volumes por padrão, você precisa do flag --volumes explicitamente. Com docker system prune -a --volumes você remove volumes órfãos, mas volumes nomeados com containers associados (mesmo parados) são preservados.

docker system df -v mostra o tamanho de cada container. Alternativamente, docker ps -s mostra a diferença entre o tamanho da imagem e o que o container escreveu na camada de escrita (SIZE column: "X virtual").

Todo o build cache pode ser removido a qualquer momento com docker builder prune -a. O próximo build reconstruirá o cache do zero (mais lento). Nada de produção é afetado, apenas o tempo do próximo build.

Configure o log driver padrão em /etc/docker/daemon.json com max-size e max-file. Isso afeta apenas novos containers. Para containers existentes, atualize o Compose com a seção logging: e recrie os containers.