Cómo liberar espacio en disco eliminando caché y contenedores huérfanos en Docker
El crecimiento desmedido del directorio /var/lib/docker en servidores Linux es una de las causas más frecuentes de agotamiento de espacio en disco (error no space left on device). Esto ocurre porque Docker almacena de forma indefinida imágenes intermedias, capas de compilación en caché de BuildKit, contenedores detenidos y volúmenes anónimos huérfanos.
El Diagnóstico Rápido
docker system prune -a --volumes para recuperar espacio no utilizado/etc/docker/daemon.jsonEl crecimiento desmedido del directorio /var/lib/docker en servidores Linux es una de las causas más frecuentes de agotamiento de espacio en disco (error no space left on device). Esto ocurre porque Docker almacena de forma indefinida imágenes intermedias, capas de compilación en caché de BuildKit, contenedores detenidos y volúmenes anónimos huérfanos.
La Solución Paso a Paso
-
1
Paso 1: Analizar el uso de almacenamiento en Docker
Antes de borrar nada, identifica qué componentes están consumiendo más espacio:
BASH# Ver el resumen de consumo de imágenes, contenedores y volúmenes docker system df # Ver información detallada de cada elemento docker system df -v -
2
Paso 2: Limpiar imágenes, contenedores y redes en desuso
Ejecuta una purga integral de todos los recursos no asociados a contenedores actualmente en ejecución:
BASH# Eliminar contenedores detenidos, redes no utilizadas e imágenes sin contenedor activo docker system prune -a --force # Limpiar específicamente la caché de compilación de BuildKit docker builder prune -a --force -
3
Paso 3: Eliminar volúmenes huérfanos (Dangling Volumes)
Los volúmenes anónimos creados por bases de datos o servicios temporales no se borran automáticamente con
docker rm:BASH# Listar volúmenes que no están vinculados a ningún contenedor docker volume ls -qf dangling=true # Eliminar todos los volúmenes huérfanos de forma segura docker volume prune --force -
4
Paso 4: Limpiar y limitar los archivos de logs de contenedores
Si los logs de contenedores en formato JSON han crecido hasta ocupar varios gigabytes:
BASH# Truncar logs de todos los contenedores en vivo sin detenerlos sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'Para evitar que vuelvan a crecer descontroladamente, crea o edita
/etc/docker/daemon.json:JSON{ "log-driver": "json-file", "log-opts": { "max-size": "50m", "max-file": "3" } }Reinicia el servicio Docker para aplicar la rotación de logs:
BASHsudo systemctl restart docker
❓ Preguntas Frecuentes (FAQ)
¿docker system prune -a borra las bases de datos de mis contenedores activos?
No. Los volúmenes y contenedores que estén en ejecución no son afectados. Sin embargo, si tienes contenedores detenidos que piensas volver a iniciar, asegúrate de utilizar volúmenes nombrados para proteger sus datos.
¿Cómo muevo /var/lib/docker a un disco secundario más grande?
Configura la directiva "data-root": "/nuevo/disco/docker" en /etc/docker/daemon.json y reinicia el servicio tras migrar los archivos.
Consejo de Prevención
Prácticas de seguridad recomendadas:
- Automatiza tareas de mantenimiento semanales: Añade un cron job con
docker system prune -fpara evitar acumulaciones masivas en servidores CI/CD. - Usa el flag --rm al compilar: Al ejecutar contenedores temporales de depuración, utiliza siempre
docker run --rmpara que se eliminen automáticamente al salir.