Comprender las capas de las imágenes
Las imágenes de Docker se construyen utilizando un sistema de archivos en capas. Cada capa representa un conjunto de cambios en el sistema de archivos. Este enfoque en capas permite que Docker sea eficiente en el uso de almacenamiento y red. Exploremos este concepto.
Primero, inspeccionemos las capas de la imagen de Nginx que descargamos anteriormente:
docker inspect --format='{{.RootFS.Layers}}' nginx
Verás una salida similar a esta:
[sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f sha256:e379e8aedd4d72bb4c529a4ca07a4e4d230b5a1d3f7a61bc80179e8f02421ad8 sha256:b5357ce95c68acd9c9672ec76e3b2a2ff3f8f62a2bcc1866b8811572f4d409af]
Cada una de estas cadenas largas (llamadas hashes SHA256) representa una capa en la imagen. Cada capa corresponde a un comando en el Dockerfile utilizado para construir la imagen.
Para entender mejor las capas, creemos una imagen personalizada simple. Primero, crea un nuevo archivo llamado Dockerfile
en tu directorio actual:
nano Dockerfile
En este archivo, agrega el siguiente contenido:
FROM nginx
RUN echo "Hello from custom layer" > /usr/share/nginx/html/hello.html
Este Dockerfile hace dos cosas:
- Comienza con la imagen de Nginx que descargamos anteriormente (
FROM nginx
)
- Agrega un nuevo archivo a la imagen (
RUN echo...
)
Guarda y sale del archivo (en nano, puedes hacer esto presionando Ctrl+X, luego Y, luego Enter).
Ahora construyamos esta imagen:
docker build -t custom-nginx.
Salida de ejemplo:
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> 5ef79149e0ec
Step 2/2 : RUN echo "Hello from custom layer" > /usr/share/nginx/html/hello.html
---> Running in 2fa43e649234
Removing intermediate container 2fa43e649234
---> 73b62663b5c3
Successfully built 73b62663b5c3
Successfully tagged custom-nginx:latest
Este comando construye una nueva imagen basada en nuestro Dockerfile y la etiqueta como custom-nginx
. El .
al final le dice a Docker que busque el Dockerfile en el directorio actual.
Ahora, inspeccionemos las capas de nuestra imagen personalizada:
docker inspect --format='{{.RootFS.Layers}}' custom-nginx
Notarás que esta imagen tiene una capa más que la imagen original de Nginx. Esta capa adicional representa los cambios realizados por nuestro comando RUN
.
Comprender las capas es crucial porque:
- Las capas se almacenan en caché, lo que acelera la construcción de imágenes similares.
- Las capas se comparten entre imágenes, lo que ahorra espacio en disco.
- Cuando se envían o se descargan imágenes, solo se necesitan transferir las capas modificadas.