A medida que descargas y construyes imágenes, tu máquina va acumulando una colección que puede crecer rápidamente y consumir mucho espacio en disco. Saber administrar esas imágenes es tan importante como saber crearlas. En esta lección aprenderemos a listar las imágenes con docker images, eliminarlas con docker rmi, limpiar las que ya no se usan con docker image prune, inspeccionar sus detalles internos, exportarlas e importarlas con docker save y docker load, y mantener bajo control el espacio en disco. Son tareas cotidianas que todo usuario de Docker realiza constantemente.
Listar Imágenes con docker images
El comando docker images muestra todas las imágenes almacenadas localmente.
REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest a1b2c3d4e5f6 2 days ago 188MB miapp 1.0 f6e5d4c3b2a1 1 hour ago 180MB <none> <none> 998877665544 3 days ago 210MB
Significado de cada columna:
- REPOSITORY: el nombre del repositorio de la imagen.
- TAG: la etiqueta de versión.
latestes el valor por defecto. - IMAGE ID: identificador único (abreviado) de la imagen.
- CREATED: cuándo se creó la imagen.
- SIZE: el espacio que ocupa.
Las imágenes con <none> en repositorio y tag son imágenes huérfanas (dangling): capas que quedaron sin nombre, normalmente porque una reconstrucción reasignó su tag a una imagen nueva. Conviene limpiarlas.
Opciones útiles:
-q(quiet): muestra solo los IDs. Es muy útil para combinarlo con otros comandos.
--filter "dangling=true": muestra solo las imágenes huérfanas.
--format: personaliza la salida. Aquí muestra el nombre y el tamaño de cada imagen.
Eliminar Imágenes con docker rmi
docker rmi (remove image) borra una o varias imágenes.
- Elimina la imagen
miapp:1.0. Si esa imagen tiene varios tags, este comando solo quita el tag indicado; la imagen sigue existiendo mientras le quede algún nombre.
Para eliminar por ID:
Si una imagen está en uso por un contenedor (aunque esté detenido), Docker se niega a borrarla:
Error response from daemon: conflict: unable to delete f6e5d4c3b2a1 (must be forced) - image is being used by stopped container 1a2b3c
- La solución correcta es eliminar primero el contenedor que la usa, o forzar el borrado con
-f(con cuidado):
-f(force) fuerza la eliminación. Úsalo con precaución, porque puede dejar contenedores apuntando a una imagen inexistente.
Para borrar varias imágenes a la vez, puedes combinar con docker images -q:
- Esto intenta eliminar todas las imágenes locales. Úsalo solo si de verdad quieres vaciar tu colección.
Limpiar con docker image prune
docker image prune elimina imágenes innecesarias de forma masiva, sin tener que listarlas una a una.
- Por defecto, elimina solo las imágenes huérfanas (
<none>). Pedirá confirmación antes de borrar.
Para eliminar todas las imágenes que no estén siendo usadas por ningún contenedor:
-a(all): borra todas las imágenes sin un contenedor asociado, no solo las huérfanas. Es mucho más agresivo.
Opciones útiles:
-f: no pide confirmación.--filter "until=24h": limita la limpieza a imágenes creadas hace más de 24 horas.
| Comando | Qué elimina |
|---|---|
docker image prune |
Solo imágenes huérfanas (<none>) |
docker image prune -a |
Todas las imágenes sin contenedor que las use |
docker rmi <imagen> |
Una imagen concreta que indiques |
Inspeccionar Imágenes
docker inspect muestra información detallada de una imagen en formato JSON: capas, variables de entorno, comando por defecto, fecha de creación, etc.
- Devuelve un JSON extenso con toda la metainformación de la imagen.
Para extraer un dato concreto sin leer todo el JSON, usa --format:
--format '{{.Config.Cmd}}': muestra solo el comando por defecto de la imagen.
- Muestra el sistema operativo y la arquitectura para la que se construyó la imagen.
Para ver el historial de capas de una imagen (qué instrucción creó cada una y su tamaño):
- Muy útil para entender qué hace pesada a una imagen.
Exportar e Importar con save y load
A veces necesitas mover una imagen entre máquinas sin un registro (por ejemplo, a un servidor sin acceso a internet). Para eso existen docker save y docker load.
docker save: empaqueta la imagen (con todas sus capas y metadatos) en un fichero.tar.-o miapp.tar: indica el fichero de salida.miapp:1.0: la imagen a exportar.
Después copias miapp.tar a la otra máquina (por USB, scp, etc.) y la cargas:
docker load: reconstruye la imagen a partir del.tar, conservando su nombre y tags originales.-i miapp.tar: indica el fichero de entrada.
Es importante no confundir save/load con export/import:
| Comando | Sobre qué actúa | Conserva capas y metadatos |
|---|---|---|
docker save / docker load |
Una imagen | Sí (historial, tags, capas) |
docker export / docker import |
Un contenedor (su sistema de ficheros) | No (aplana todo en una sola capa) |
- Para mover imágenes, usa
save/load.export/importactúa sobre el sistema de ficheros de un contenedor y pierde el historial de capas.
Gestión del Espacio en Disco
Docker puede consumir mucho espacio entre imágenes, contenedores, volúmenes y caché de build. Para ver cuánto usa:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 12 3 4.2GB 3.1GB (73%) Containers 5 2 150MB 90MB (60%) Local Volumes 4 2 1.1GB 500MB (45%) Build Cache 20 0 800MB 800MB (100%)
- RECLAIMABLE indica cuánto espacio podrías liberar limpiando lo que no se usa.
Para una limpieza general de todo lo que no está en uso:
- Elimina contenedores detenidos, redes no usadas, imágenes huérfanas y caché de build. Pide confirmación.
Para una limpieza más agresiva que incluya también todas las imágenes sin usar:
-a: añade a la limpieza las imágenes que no tengan ningún contenedor asociado.
Advertencia:
docker system prune -apuede borrar imágenes que tardaste en descargar o construir y que quizá vuelvas a necesitar. Revisa siempre qué se va a eliminar antes de confirmar, especialmente en entornos compartidos.
Errores Comunes y Consejos
- Intentar borrar una imagen en uso: si un contenedor (aunque esté detenido) usa la imagen,
docker rmifalla. Elimina antes el contenedor o usa-fcon cuidado. - Confundir
save/loadconexport/import: el primero es para imágenes y conserva capas; el segundo es para contenedores y las aplana. - Acumular imágenes huérfanas: cada reconstrucción puede dejar capas
<none>. Ejecutadocker image pruneperiódicamente. - Usar
docker system prune -asin pensar: borra muchas más cosas de las que crees. Lee el aviso de confirmación. - Olvidar
docker system df: es la forma rápida de saber dónde se está yendo el espacio antes de limpiar. - Consejo: automatiza la limpieza de huérfanas y caché antigua con
docker image prune -f --filter "until=168h"para borrar lo creado hace más de una semana.
Ejercicios
Ejercicio 1
Muestra solo las imágenes huérfanas (dangling) de tu sistema y luego elimínalas todas sin que Docker pida confirmación.
Ejercicio 2
Exporta la imagen miapp:1.0 a un fichero llamado backup.tar y describe cómo la cargarías en otra máquina.
Ejercicio 3
Quieres ver cuánto espacio total ocupa Docker y cuánto podrías recuperar. ¿Qué comando usarías y qué columna te interesa?
Soluciones
Solución 1
El primer comando lista las imágenes huérfanas. docker image prune borra precisamente esas, y -f evita la pregunta de confirmación.
Solución 2
Esto crea backup.tar. Tras copiarlo a la otra máquina (con USB, scp, etc.), se carga con:
La imagen aparecerá en la otra máquina con su nombre y tag originales (miapp:1.0), conservando todas sus capas.
Solución 3
La columna RECLAIMABLE indica cuánto espacio podrías liberar limpiando lo que no está en uso, y la columna SIZE muestra el total ocupado por cada tipo de recurso.
Conclusión
En esta lección hemos aprendido a gestionar las imágenes Docker durante todo su ciclo de vida: listarlas con docker images, eliminarlas con docker rmi, limpiarlas masivamente con docker image prune, inspeccionarlas con docker inspect y docker history, moverlas entre máquinas con docker save/docker load, y controlar el espacio en disco con docker system df y docker system prune. Mantener tu sistema ordenado evita sorpresas con el almacenamiento y facilita el trabajo diario.
En la siguiente lección, Etiquetado y Publicación de Imágenes, aprenderemos a compartir tus imágenes con el mundo o con tu equipo: las convenciones de tagging, el comando docker tag, cómo autenticarte con docker login y publicar con docker push en Docker Hub o en un registro privado, además del versionado semántico y las buenas prácticas.
Docker: De Principiante a Avanzado
Módulo 1: Introducción a Docker
- ¿Qué es Docker?
- Instalando Docker
- Arquitectura de Docker
- Comandos Básicos de Docker
- Entendiendo las Imágenes de Docker
- Creando tu Primer Contenedor Docker
Módulo 2: Trabajando con Imágenes Docker
- Docker Hub y Repositorios
- Construyendo Imágenes Docker
- Conceptos Básicos de Dockerfile
- Gestionando Imágenes Docker
- Etiquetado y Publicación de Imágenes
Módulo 3: Contenedores Docker
- Ejecutando Contenedores
- Ciclo de Vida del Contenedor
- Gestionando Contenedores
- Redes en Docker
- Persistencia de Datos con Volúmenes
Módulo 4: Docker Compose
- Introducción a Docker Compose
- Definiendo Servicios en Docker Compose
- Comandos de Docker Compose
- Aplicaciones Multi-Contenedor
- Variables de Entorno en Docker Compose
Módulo 5: Conceptos Avanzados de Docker
- Profundización en Redes Docker
- Opciones de Almacenamiento Docker
- Mejores Prácticas de Seguridad en Docker
- Optimizando Imágenes Docker
- Registro y Monitoreo en Docker
Módulo 6: Docker en Producción
- CI/CD con Docker
- Orquestando Contenedores con Docker Swarm
- Introducción a Kubernetes
- Desplegando Contenedores Docker en Kubernetes
- Escalado y Balanceo de Carga
