Skip to main content

        Docker: Limpieza Automática de Imágenes y Logs - Featured image

Docker: Limpieza Automática de Imágenes y Logs

¿Por qué Docker no limpia la basura automáticamente? Si has tenido un servidor con Docker por más de un mes, habrás notado que el espacio en disco desaparece misteriosamente. Docker está diseñado bajo el principio de inmutabilidad y seguridad. No elimina nada por defecto porque no puede adivinar si esa imagen “huérfana” de hace tres meses es una versión crítica a la que planeas hacer rollback o si ese cache de construcción es algo que necesitas para un despliegue rápido mañana.

En resumen: Docker prefiere llenar tu disco antes que borrar accidentalmente algo que podrías necesitar. Por eso, la higiene del sistema queda en nuestras manos.

1. El Script de Mantenimiento (daily_maintenance.sh)

Para evitar que los archivos temporales y las imágenes antiguas tomen el control de tu almacenamiento, utilizaremos un script que automatice la poda del sistema.

Guarda este archivo en /usr/local/bin/daily_maintenance.sh

#!/bin/bash

# ==============================================================================
# Docker & System Daily Cleanup Script
# ==============================================================================

# Redirect all output to a log file for auditing
LOG_FILE="/var/log/daily_maintenance.log"
exec > >(tee -a "$LOG_FILE") 2>&1

echo "--- Starting Maintenance: $(date) ---"

# 1. Docker Image Cleanup
# Prune unused images (not referenced by any container)
# '-a': Remove all unused images, not just dangling ones
# '-f': Force command without confirmation
# 'until=24h': Only remove images created more than 24 hours ago
echo "Running Docker image prune..."
docker image prune -a -f --filter "until=24h"

# Optional: Clean Builder Cache (can grow large over time)
# docker builder prune -f --filter "until=24h"

echo "--- Maintenance Finished ---"

¿Qué hace exactamente este comando? El uso de –filter “until=24h” es vital. Evita que el script borre imágenes que acabas de descargar pero que aún no has levantado en un contenedor. Es el equilibrio perfecto entre limpieza y precaución.

2. Instalación y Automatización

Para que esto realmente funcione, debemos darle permisos de ejecución y programarlo en el sistema.

Dar permisos:

# Set execution permissions for the script
sudo chmod +x /usr/local/bin/daily_maintenance.sh

Agregar al Crontab (Diario): Abre el crontab (crontab -e) y programa la ejecución a las 4:00 AM, cuando la carga del servidor suele ser mínima:

# Run maintenance script every day at 4:00 AM
0 4 * * * /usr/local/bin/daily_maintenance.sh
  1. Recomendación Pro: Control de Logs (daemon.json) El script anterior limpia el sistema, pero no toca los logs individuales de los contenedores vivos. Estos archivos .log son la causa #1 de discos llenos en Docker.

En lugar de borrarlos manualmente (lo cual es peligroso), la mejor práctica es configurar un log rotation global. Crea o edita el archivo /etc/docker/daemon.json y agrega esto:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

¿Qué logramos con esto? Ningún contenedor, por más ruidoso que sea, ocupará más de 30MB de logs en total (3 archivos de 10MB cada uno). Recuerda reiniciar el servicio para aplicar los cambios:

# Restart Docker service to apply log rotation settings
sudo systemctl restart docker

Conclusión Automatizar la limpieza de tu entorno Docker no es solo una cuestión de orden, es una medida de disponibilidad para tu infraestructura. Un disco lleno puede corromper bases de datos y tirar servicios críticos de tu home lab. Con este script y la configuración de logs, puedes olvidarte de las alertas de espacio por mucho tiempo.