[Docker] – Limpiar contenedores, imágenes y volúmenes

Tiempo de lectura estimado: 4 minutos

Cómo limpiar contenedores, imágenes y volúmenes de Docker con PowerShell

Docker es una herramienta increíble para ejecutar contenedores, pero con el tiempo, contenedores, imágenes y volúmenes acumulados pueden ocupar mucho espacio en tu sistema. Este tutorial te mostrará cómo limpiar Docker de manera segura y controlada usando PowerShell, con opciones automáticas y manuales.

Paso 1: Crear el script de limpieza

Primero, crea un archivo llamado DockerCleanup.ps1 y copia el siguiente contenido:

function Write-Color($Text, $Color="White") {
    $OldColor = $Host.UI.RawUI.ForegroundColor
    $Host.UI.RawUI.ForegroundColor = $Color
    Write-Host $Text
    $Host.UI.RawUI.ForegroundColor = $OldColor
}

function Confirm-Action($Message) {
    $resp = Read-Host "$Message (s/n)"
    if ($resp -match "^[sS]$") { return $true } else { Write-Color "Operación cancelada" "Red"; return $false }
}

function Show-DockerUsage { 
    Write-Color "=== Uso actual de Docker ===" "Cyan"
    docker system df 
}

function Convert-Size($sizeStr) {
    if ([string]::IsNullOrWhiteSpace($sizeStr)) { return "0 MB" }
    $sizeStr = $sizeStr.Trim()
    if ($sizeStr -match "^([\d\.]+)(B|kB|MB|GB)$") {
        $num = $matches[1]
        $unit = $matches[2]
        switch ($unit) {
            "B"  { return "0 MB" }
            "kB" { return "0 MB" }
            "MB" { return "$num MB" }
            "GB" { return ([math]::Round([double]$num * 1024,2)) + " MB" }
            default { return "0 MB" }
        }
    } else {
        return "0 MB"
    }
}

function Estimate-DockerCleanup {
    $dockerDf = docker system df --format "{{.Type}} {{.Size}}" 2>$null
    $containersMatch = $dockerDf | Where-Object { $_ -match "Containers" }
    $containers = if ($containersMatch) { Convert-Size (($containersMatch -split "\s+")[1]) } else { "0 MB" }
    $imagesMatch = $dockerDf | Where-Object { $_ -match "Images" }
    $images = if ($imagesMatch) { Convert-Size (($imagesMatch -split "\s+")[1]) } else { "0 MB" }
    $volumesMatch = $dockerDf | Where-Object { $_ -match "LocalVolumes|Local Volumes" }
    $volumes = if ($volumesMatch) { Convert-Size (($volumesMatch -split "\s+")[2]) } else { "0 MB" }

    function Size-To-MB($s) {
        if ($s -match "MB$") { return [double]($s.TrimEnd(" MB")) }
        else { return 0 }
    }

    $totalMB = Size-To-MB($containers) + Size-To-MB($images) + Size-To-MB($volumes)
    $totalGB = [math]::Round($totalMB/1024,2)

    return @{Containers=$containers; Images=$images; Volumes=$volumes; TotalMB=$totalMB; TotalGB=$totalGB}
}

# --- Inicio ---
Show-DockerUsage
$cleanup = Estimate-DockerCleanup

Write-Color "`nEspacio que se podría liberar aprox:" "Cyan"
Write-Color "Contenedores: $($cleanup.Containers)" "Yellow"
Write-Color "Imágenes:    $($cleanup.Images)" "Yellow"
Write-Color "Volúmenes:   $($cleanup.Volumes)" "Yellow"
Write-Color "Total aprox: $($cleanup.TotalGB) GB" "Green"

# Limpieza automática recomendada
if ($cleanup.TotalMB -gt 0) {
    Write-Color "`n⚡ Se recomienda limpieza total segura (prune)." "Cyan"
    if (Confirm-Action "¿Deseas realizar la limpieza total automática?") {
        docker system prune -a --volumes -f
        Write-Color "`n✅ Limpieza completada automáticamente." "Green"
        Show-DockerUsage
    } else {
        Write-Color "`nPuedes usar el menú manual para elegir qué limpiar." "Yellow"
    }
} else {
    Write-Color "`nNo hay espacio que liberar. Todo limpio!" "Green"
}

# --- Menú manual ---
Write-Host "`nOpciones manuales (si quieres elegir individualmente):"
Write-Host "1) Eliminar contenedores detenidos"
Write-Host "2) Eliminar todos los contenedores"
Write-Host "3) Eliminar imágenes no usadas"
Write-Host "4) Eliminar todas las imágenes"
Write-Host "5) Eliminar volúmenes no usados"
Write-Host "6) Eliminar todos los volúmenes"
Write-Host "7) Limpieza total segura (prune)"
Write-Host "8) Limpieza total forzada (contenedores, imágenes y volúmenes)"

$opcion = Read-Host "Selecciona una opción [1-8] (o Enter para saltar)"
if ($opcion) {
    switch ($opcion) {
        "1" { if (Confirm-Action "Eliminar contenedores detenidos?") { docker container prune -f } }
        "2" { if (Confirm-Action "Eliminar TODOS los contenedores?") { docker rm -f $(docker ps -aq) } }
        "3" { if (Confirm-Action "Eliminar imágenes no usadas?") { docker image prune -a -f } }
        "4" { if (Confirm-Action "Eliminar TODAS las imágenes?") { docker rmi -f $(docker images -aq) } }
        "5" { if (Confirm-Action "Eliminar volúmenes no usados?") { docker volume prune -f } }
        "6" { if (Confirm-Action "Eliminar TODOS los volúmenes?") { docker volume rm -f $(docker volume ls -q) } }
        "7" { if (Confirm-Action "Realizar limpieza total segura?") { docker system prune -a --volumes -f } }
        "8" {
            Write-Color "¡Se eliminarán TODOS los contenedores, imágenes y volúmenes!" "Red"
            if (Confirm-Action "Continuar con limpieza total forzada?") {
                docker rm -f $(docker ps -aq)
                docker rmi -f $(docker images -aq)
                docker volume rm -f $(docker volume ls -q)
                docker system prune -a --volumes -f
            }
        }
        default { Write-Color "Opción no válida" "Red" }
    }
}

Write-Color "`n✅ Proceso terminado." "Green"
Show-DockerUsage

Paso 2: Ejecutar el script

1. Abre PowerShell con permisos de administrador.
2. Navega a la carpeta donde guardaste el script:

cd C:\Ruta\Del\Script

3. Ejecuta el script:

.\DockerCleanup.ps1

Paso 3: Ver uso actual de Docker

=== Uso actual de Docker ===
TYPE                TOTAL               ACTIVE              SIZE
Containers          5                  2                   200MB
Images              10                 7                   1.2GB
Local Volumes       4                                      300MB

Paso 4: Estimación de espacio a liberar

Espacio que se podría liberar aprox:
Contenedores: 120 MB
Imágenes:    800 MB
Volúmenes:   300 MB
Total aprox: 1.22 GB

Paso 5: Limpieza automática segura

⚡ Se recomienda limpieza total segura (prune).
¿Deseas realizar la limpieza total automática? (s/n)

Paso 6: Menú manual de limpieza

Si decides no usar la limpieza automática, puedes elegir manualmente:

Opción Acción
1 Eliminar contenedores detenidos
2 Eliminar todos los contenedores
3 Eliminar imágenes no usadas
4 Eliminar todas las imágenes
5 Eliminar volúmenes no usados
6 Eliminar todos los volúmenes
7 Limpieza total segura
8 Limpieza total forzada

Paso 7: Resultado final

✅ Proceso terminado.
=== Uso actual de Docker ===
TYPE                TOTAL               ACTIVE              SIZE
Containers          2                  1                   50MB
Images              6                  4                   400MB
Local Volumes       2                                      100MB

Consejos finales

  • La opción automática es segura para liberar espacio de contenedores, imágenes y volúmenes que no se están usando.
  • La opción manual te permite decidir qué borrar y evitar errores.
  • La opción forzada elimina todo, úsala solo si estás seguro.

💡 Con este script, tu Docker siempre estará limpio y optimizado, y tendrás control total sobre lo que se elimina.

Website |  + posts

Desarrollador web • Desarrollador de software· • Amante del diseño gráfico, diseño 2D/3D


🐙 Creando nuevo tema Wordpress en GitHub


🧪 Experimentos y pruebas varias en Serna Studio Lab

V.Serna

Desarrollador web • Desarrollador de software· • Amante del diseño gráfico, diseño 2D/3D 🐙 Creando nuevo tema Wordpress en GitHub 🧪 Experimentos y pruebas varias en Serna Studio Lab

Deja una respuesta