Limpieza y disco en Docker | Nicolás Garzón
Texto
Copiar images/layers → artefactos descargables o construibles
build cache → aceleración recreable
containers → instancias y writable layers
logs → evidencia operativa
volumes → estado potencialmente críticodocker system prune -a --volumes no es mantenimiento: es una operación destructiva de amplio alcance.
Bash
Copiar df -h
df -i
docker system df
docker system df -v df -h detecta bytes agotados. df -i detecta inodes agotados: millones de archivos pequeños pueden impedir nuevas escrituras aunque queden gigabytes.
Comprueba también dónde está el data root:
Bash
Copiar docker info --format '{{.DockerRootDir}}' En instalaciones modernas el almacenamiento puede usar diferentes backends/image stores. No manipules archivos internos directamente; usa APIs y comandos soportados.
bases;
imágenes de aplicación;
tags antiguos;
digests de rollback;
variantes multi-platform;
layers compartidas.
El tamaño reportado por imagen puede contar contenido compartido de manera que no equivale a espacio liberable. Revisa SHARED SIZE y UNIQUE SIZE donde estén disponibles.
resultados intermedios;
snapshots;
metadata;
cache mounts;
source cache;
resultados multi-platform.
Puede crecer mucho en hosts de CI.
Un container detenido conserva:
metadata;
writable layer;
logs según driver;
referencia a image y mounts.
Un proceso que escribe uploads o caches en writable layer puede producir gigabytes invisibles en la image.
databases;
uploads;
queues;
dependencias de desarrollo;
datos olvidados;
backups locales.
“Unused” significa no adjunto en ese momento, no “sin valor”.
Un container activo puede llenar el host aunque no se construya ninguna image.
registry local;
temporary files;
core dumps;
package caches del host;
snapshots;
Docker Desktop disk image;
archivos fuera del data root.
Bash
Copiar docker ps -a --size
docker container ls -a
owner/service;
estado;
antigüedad;
writable size;
restart policy;
mounts;
labels.
Eliminar stopped containers suele ser seguro solo después de preservar logs/evidencia y confirmar que no son la única referencia comprensible a un volume.
Bash
Copiar docker container pruneElimina containers detenidos que coincidan con los filtros.
Bash
Copiar docker container prune --filter 'until=168h' Usa retención. No borres inmediatamente containers de un deployment fallido si necesitas investigar.
Bash
Copiar docker image ls --digests
docker image ls --filter dangling = true
docker image inspect imageUna image dangling no tiene tag útil, pero puede estar referenciada por un container o ser necesaria para análisis.
Bash
Copiar docker image pruneTodas las no usadas por containers:
Bash
Copiar docker image prune -a -a puede eliminar el digest anterior necesario para rollback. Define retención explícita antes.
digest actual;
digest anterior probado;
releases dentro de rollback window;
image de recovery/debug autorizada.
El registry debe ser la fuente durable, pero depender de descargar durante un outage puede aumentar RTO. Decide si el host conserva una ventana local.
Bash
Copiar docker buildx du
docker builder prune
docker buildx pruneLas capacidades exactas dependen del builder/versión.
Bash
Copiar docker builder prune --filter 'until=168h'
docker builder prune --keep-storage 20GBObjetivo: conservar cache reciente/de valor y limitar crecimiento.
No elimines cache automáticamente en cada build: pierdes rendimiento, aumenta tráfico y puede ocultar que el Dockerfile tiene mal orden.
runners efímeros: se destruyen completos;
runners persistentes: límite por builder;
cache remota: TTL y scope;
PRs: cache separada de releases;
monitorización por repositorio/plataforma.
Una cache es recreable, pero su reconstrucción puede tardar horas. Limpia con presupuesto, no por reflejo.
Bash
Copiar docker volume ls
docker volume inspect volume-nameAntes de eliminar pregunta:
¿qué servicio lo creó?;
¿qué path contiene?;
¿existe backup?;
¿cuándo fue usado?;
¿el project name cambió?;
¿es un restore o migration pendiente?;
¿tiene labels?;
¿el owner aprobó?
Bash
Copiar docker volume prunePuede borrar volumes no referenciados por containers. Un database container eliminado antes puede dejar su volume “unused”.
Nunca automatices volume prune global en producción sin inventario, exclusions, ownership y backups.
Bash
Copiar docker run --rm \
--mount type = volume,src= my-volume,dst= /data,readonly \
alpine sh -c 'du -sh /data; find /data -maxdepth 2 -type f | head' Usa image/herramientas apropiadas y evita alterar permisos o metadata. Para databases, inspección de archivos no reemplaza herramientas del motor.
YAML
Copiar volumes :
db-data :
labels :
com.nicoo.owner : platform
com.nicoo.environment : production
com.nicoo.retention : criticalTambién en containers/images cuando sea posible.
Labels no protegen por sí solos, pero permiten filtros y automatización segura.
Compose crea resources prefijados. Cambiar directorio o project name puede dejar:
Texto
Copiar oldproject_db-data
newproject_db-dataEl antiguo parece huérfano pero contiene datos reales.
Bash
Copiar docker compose ls
docker volume ls Bash
Copiar docker compose downconserva named volumes normalmente.
Bash
Copiar docker compose down -v los elimina. Usa -v solo en entornos efímeros o cuando la destrucción es intencional y confirmada.
Inspecciona logging driver:
Bash
Copiar docker inspect container --format '{{json .HostConfig.LogConfig}}'
docker info --format '{{.LoggingDriver}}' Texto
Copiar max-size
max-fileCentralización no elimina necesidad de límite local: un collector caído puede provocar buffer o crecimiento.
No trunques archivos internos del driver manualmente salvo procedimiento soportado. Puedes corromper metadata o perder evidencia.
Bash
Copiar docker ps -a --size
logs se escriben a archivo;
uploads están dentro;
package cache;
tmp no limitado;
aplicación genera reports;
core dumps.
stdout/stderr;
volume/object storage;
tmpfs limitado;
cleanup de la app;
rootfs read-only.
Eliminar el container libera writable layer, pero también elimina esos datos.
Texto
Copiar No space left on deviceaunque df -h muestra espacio.
caches con millones de archivos;
node_modules repetidos;
logs pequeños;
temporary files;
layers/build cache.
Investiga cantidad, no solo tamaño.
El almacenamiento vive en una disk image/VM. Borrar objetos puede liberar espacio dentro del filesystem, pero el archivo del host no siempre se reduce inmediatamente.
Usa herramientas de Docker Desktop para disk usage/reclaim. No edites la disk image manualmente.
porcentaje y bytes libres;
inodes;
crecimiento diario;
tamaño de logs;
build cache;
volumes críticos;
capacidad requerida para deploy/restore.
Umbrales deben dejar tiempo para actuar. Alertar al 99 % es tarde.
warning 70 % con tendencia;
critical 85 %;
forecast de agotamiento;
alerta separada de inodes.
Necesitas espacio temporal para:
pull de nueva image antes de borrar vieja;
rolling deployment;
database vacuum/compaction;
restore;
upgrade;
export/import;
build multi-platform.
No operes habitualmente al 90 %.
Texto
Copiar containers fallidos: 7 días
images release: últimas 5 + 30 días
build cache: 20 GB o 7 días
logs locales: 3 × 50 MB por container
volumes production: nunca por prune automático
CI projects: borrar al finalizar
recopila inventario;
aplica filtros/labels;
genera dry-run o reporte;
excluye recursos protegidos;
elimina por categoría;
verifica espacio;
registra operaciones;
alerta si no logra objetivo.
No uses un único comando global sin visibilidad.
preservar servicios y datos;
identificar categoría;
detener crecimiento si es seguro;
liberar artefactos claramente recreables;
rotar/tratar logs;
ampliar disco si es más seguro;
evitar volume deletion;
investigar causa.
Candidatos de bajo riesgo, después de verificar:
build cache antigua;
images no usadas y disponibles en registry;
stopped test containers;
logs rotables.
A veces es más seguro expandir filesystem que ejecutar prune bajo presión.
extiende partition/filesystem según plataforma;
verifica data root;
mantiene alertas;
corrige crecimiento.
Capacidad extra sin política solo aplaza el incidente.
Mover el almacenamiento requiere:
downtime o procedimiento soportado;
backup;
permisos/labels;
espacio suficiente;
configuración del daemon;
rollback;
verificación de images/containers/volumes.
No hagas mv /var/lib/docker con daemon activo.
Una image o stopped container puede ser evidencia de compromiso. Antes de cleanup durante incidente consulta el plan de seguridad.
digests;
inspect;
logs;
filesystem snapshot/export cuando sea legal;
events;
timestamps.
Registry inaccesible durante recovery.
Última copia de database tras borrar instancia.
Requiere rotación y limpieza controlada, no solo prune.
docker logs puede no mostrar todo, pero buffers locales consumen disco.
Un proceso mantiene file descriptor abierto. Reinicio controlado puede ser necesario; verifica con herramientas del host.
Tamaño aparente y real difieren.
Pérdida de datos/rollback.
Puede haber referencia operacional.
Builds lentos y registry saturado.
Cleanup o pérdida del host los elimina.
Corrupción del estado interno.
No todo el espacio es igual: cache e información de negocio tienen riesgos distintos.
Un volume no adjunto puede ser crítico.
Logs y writable layers pueden crecer con containers activos.
Bytes e inodes deben monitorearse.
Conserva artefactos para rollback e incident response.
Automatiza políticas específicas, no prunes globales destructivos.
Comprueba lo aprendido
Diseña una política de retención para un host de producción y uno de CI.
¿Cómo investigarías un volume no adjunto antes de eliminarlo?
Construye un runbook para disk full sin borrar datos.
¿Por qué image size no equivale a espacio liberable?
¿Qué diferencia hay entre falta de bytes e inodes?
Antipatrones de Docker , donde se reúnen decisiones que parecen resolver el problema inmediato pero degradan seguridad, reproducibilidad u operación.