Cómo liberar espacio de almacenamiento de imágenes de Docker

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Docker es una poderosa tecnología de contenedores que ha revolucionado la forma en que se desarrollan, implementan y escalan las aplicaciones. Sin embargo, a medida que utilices Docker de manera más extensa, el espacio de almacenamiento ocupado por las imágenes de Docker puede acumularse rápidamente, lo que puede causar problemas potenciales. Este tutorial te guiará a través del proceso de liberar espacio de almacenamiento de las imágenes de Docker, ayudándote a optimizar la gestión de tus imágenes de Docker y mantener un entorno de Docker ágil y eficiente.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ImageOperationsGroup -.-> docker/rmi("Remove Image") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/SystemManagementGroup -.-> docker/info("Display System-Wide Information") docker/SystemManagementGroup -.-> docker/version("Show Docker Version") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") subgraph Lab Skills docker/rmi -.-> lab-415084{{"Cómo liberar espacio de almacenamiento de imágenes de Docker"}} docker/images -.-> lab-415084{{"Cómo liberar espacio de almacenamiento de imágenes de Docker"}} docker/info -.-> lab-415084{{"Cómo liberar espacio de almacenamiento de imágenes de Docker"}} docker/version -.-> lab-415084{{"Cómo liberar espacio de almacenamiento de imágenes de Docker"}} docker/prune -.-> lab-415084{{"Cómo liberar espacio de almacenamiento de imágenes de Docker"}} end

Comprender el almacenamiento de imágenes de Docker

¿Qué es una imagen de Docker?

Una imagen de Docker es un paquete ejecutable, independiente y ligero que incluye todo lo necesario para ejecutar una aplicación: el código, el entorno de ejecución, las herramientas del sistema, las bibliotecas y la configuración. Las imágenes de Docker son los bloques de construcción de los contenedores de Docker, que son las instancias en tiempo de ejecución de esas imágenes.

Conceptos básicos del almacenamiento de imágenes de Docker

Las imágenes de Docker se almacenan en un registro de Docker, que puede ser un registro público como Docker Hub o un registro privado. Cuando se ejecuta un contenedor de Docker, la imagen correspondiente se extrae del registro y se almacena en el sistema de archivos local del host.

El demonio de Docker gestiona el almacenamiento de las imágenes de Docker en el host. Por defecto, Docker utiliza el controlador de almacenamiento overlay2, que almacena las capas de la imagen como una serie de sistemas de archivos de solo lectura superpuestos. Esto permite un almacenamiento eficiente y tiempos de inicio rápidos para los contenedores.

graph TD A[Docker Image] --> B[Docker Registry] B --> C[Docker Host] C --> D[Docker Daemon] D --> E[Overlay2 Storage Driver] E --> F[Image Layers]

Comprender las capas de la imagen

Las imágenes de Docker se construyen a partir de una serie de capas. Cada capa representa una instrucción del Dockerfile. Por ejemplo, cuando se crea una imagen a partir de un Dockerfile, cada instrucción RUN, COPY o ADD crea una nueva capa.

Estas capas se almacenan como una serie de sistemas de archivos de solo lectura. Cuando se ejecuta un contenedor, Docker combina estas capas en un solo sistema de archivos escribible. Esto permite un almacenamiento eficiente y tiempos de inicio rápidos, ya que Docker puede reutilizar capas comunes entre diferentes imágenes.

Capa Tamaño
Imagen del sistema operativo base 100MB
Instalar dependencias 50MB
Copiar código de la aplicación 10MB
Establecer variables de entorno 1MB
Ejecutar la aplicación 1MB

Recuperar espacio de almacenamiento de imágenes de Docker

Identificar imágenes no utilizadas

Para liberar espacio de almacenamiento, primero debes identificar las imágenes de Docker no utilizadas. Puedes utilizar el siguiente comando para listar todas las imágenes en tu sistema:

docker images

Esto mostrará todas las imágenes, sus tamaños y sus etiquetas (tags). Busca cualquier imagen que ya no esté siendo utilizada por tus aplicaciones.

Eliminar imágenes no utilizadas

Una vez que hayas identificado las imágenes no utilizadas, puedes eliminarlas utilizando el comando docker rmi. Por ejemplo, para eliminar una imagen con la etiqueta latest:

docker rmi image:latest

Si la imagen está siendo utilizada por un contenedor en ejecución, primero deberás detener y eliminar el contenedor antes de poder eliminar la imagen.

Limpiar imágenes huérfanas (dangling images)

Docker también crea imágenes "huérfanas", que son imágenes sin etiquetas y que no están siendo utilizadas por ningún contenedor. Puedes eliminarlas utilizando el siguiente comando:

docker image prune

Esto eliminará todas las imágenes huérfanas, liberando espacio de almacenamiento.

Eliminar volúmenes no utilizados

Docker también almacena datos en volúmenes, que pueden ocupar una cantidad significativa de espacio. Puedes eliminar los volúmenes no utilizados utilizando el siguiente comando:

docker volume prune

Esto eliminará todos los volúmenes que no estén siendo utilizados por ningún contenedor.

Automatizar la limpieza de imágenes

Para automatizar el proceso de limpieza de imágenes y volúmenes de Docker no utilizados, puedes crear un script que ejecute estos comandos según una programación regular, como diaria o semanal. Esto puede ayudar a garantizar que el espacio de almacenamiento de tu host de Docker siempre esté optimizado.

Optimizar la gestión de imágenes de Docker

Aprovechar las compilaciones en múltiples etapas (multi - stage builds)

Una de las mejores formas de optimizar el tamaño de las imágenes de Docker es utilizar compilaciones en múltiples etapas. Esta técnica te permite construir tu aplicación en múltiples etapas, utilizando diferentes imágenes base para cada etapa. Luego, la etapa final solo puede copiar los artefactos necesarios de las etapas anteriores, lo que resulta en un tamaño de imagen mucho menor.

A continuación, se muestra un ejemplo de un Dockerfile en múltiples etapas:

## Build stage
FROM node:14-alpine AS builder
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
RUN npm run build

## Production stage
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html

Utilizar imágenes base más pequeñas

Otra forma de optimizar el tamaño de la imagen es utilizar imágenes base más pequeñas. En lugar de utilizar una distribución Linux completa como imagen base, puedes utilizar una imagen mínima como alpine o scratch. Estas imágenes tienen una huella mucho menor, lo que puede reducir significativamente el tamaño de tu imagen final.

FROM alpine:3.14
## Your application code and instructions

Aprovechar el caché de imágenes

El mecanismo de caché de imágenes de Docker también puede ayudar a optimizar el tamaño de la imagen. Cuando se construye una imagen, Docker almacena en caché cada capa del proceso de construcción. Si una capa no ha cambiado, Docker puede reutilizar la capa en caché en lugar de reconstruirla, lo que puede ahorrar mucho tiempo y espacio.

Para aprovechar esto, asegúrate de ordenar las instrucciones de tu Dockerfile desde las que cambian menos a las que cambian más, para que Docker pueda reutilizar tantas capas en caché como sea posible.

Utilizar la compresión de imágenes (image squashing)

La compresión de imágenes es una técnica que combina múltiples capas en una sola capa, reduciendo el tamaño total de la imagen. Esto se puede hacer utilizando herramientas como docker - squash o confirmando manualmente el contenedor en una nueva imagen.

docker commit <container_id> <new_image_name>

Sin embargo, es importante tener en cuenta que la compresión de imágenes puede dificultar la depuración y el mantenimiento de tus imágenes, por lo que debe usarse con cautela.

Implementar canalizaciones CI/CD

Automatizar la construcción, prueba y despliegue de tus imágenes de Docker también puede ayudar a optimizar la gestión de imágenes. Al configurar una canalización CI/CD, puedes asegurarte de que tus imágenes se construyan y se envíen a un registro de manera consistente y eficiente, reduciendo el riesgo de imágenes infladas o no utilizadas.

Resumen

En este tutorial completo, aprenderás cómo administrar y optimizar de manera efectiva el almacenamiento de tus imágenes de Docker. Al comprender los mecanismos de almacenamiento subyacentes de Docker, descubrirás técnicas para recuperar valioso espacio de almacenamiento, como identificar y eliminar imágenes no utilizadas, gestionar las capas de las imágenes e implementar las mejores prácticas para una gestión eficiente de las imágenes de Docker. Si sigues los pasos descritos en esta guía, podrás mantener tu entorno de Docker ágil y garantizar que se utilicen de manera efectiva tus recursos de almacenamiento.