# 4.3.- Capas de una imagen de Docker.

Las capas o "layers" de una imagen de Docker son una serie de cambios o diferencias almacenados en un sistema de archivos. Cada capa representa una instrucción en el Dockerfile de la imagen. Por ejemplo, si tienes un Dockerfile con cinco instrucciones, generará una imagen de cinco capas.

Las capas son apiladas y cada una es una delta del cambio sobre la capa anterior. Las capas son inmutables, es decir, una vez creadas no se pueden cambiar, pero se pueden compartir entre imágenes.

Por ejemplo, si tienes dos imágenes que se construyen a partir de la misma imagen base, esas imágenes compartirán las capas de la imagen base y solo tendrán que almacenar las capas que sean específicas de cada imagen.

Ahora, veamos un ejemplo concreto. Supón que tienes el siguiente Dockerfile:

    # Imagen base
    FROM alpine:latest

    # Instalar nginx
    RUN apk add --update nginx

    # Copiar un archivo
    COPY index.html /usr/share/nginx/html/

Este Dockerfile genera una imagen con tres capas:

- La primera capa es la imagen base de Alpine:latest.
- La segunda capa es la resultante de instalar nginx. Esta capa sólo contiene los cambios en el sistema de archivos que resultaron de la instalación de nginx.
- La tercera capa es la resultante de copiar el archivo index.html. Esta capa sólo contiene los cambios en el sistema de archivos que resultaron de copiar el archivo.

Una capa puede ser reutilizada por otras imágenes para ahorrar espacio.

En el siguiente ejemplo podemos ver cómo una misma capa puede ser compartida por varias imágenes.

    $ docker pull php
    Using default tag: latest
    latest: Pulling from library/php
    8d691f585fa8: Pull complete
    cba12d3fd8b1: Pull complete
    cda54d6474c8: Pull complete
    412447ed0729: Pull complete
    be73f2c7a508: Pull complete
    ccea27a56d46: Pull complete
    e652349e8aa0: Pull complete
    35d8aa4ba783: Pull complete
    dd9d93e7999d: Pull complete
    66f02e7e72bd: Pull complete
    Digest: sha256:bcb652b60a7c3d9ca36d7bea93573fe052e18487b4ccd39dc9455222f03252eb
    Status: Downloaded newer image for php:latest
    docker.io/library/php:latest
    $ docker pull php:apache
    apache: Pulling from library/php
    8d691f585fa8: Already exists ①
    cba12d3fd8b1: Already exists ②
    cda54d6474c8: Already exists ③
    412447ed0729: Already exists ④
    84de6fc539c3: Pull complete
    d67567ed6145: Pull complete
    22ca6c438da4: Pull complete
    aaaf25e57dd6: Pull complete
    fbccd385090a: Pull complete
    15b403f621d7: Pull complete
    1cae2d7071d0: Pull complete
    5c0cbd6e0573: Pull complete
    1b48a6c1e889: Pull complete
    855d31502496: Pull complete
    Digest: sha256:2dd2c5f682306c0738f2ac826fae0c98f467a447ef2a9d6bc4ee86eed97eefc6
    Status: Downloaded newer image for php:apache
    docker.io/library/php:apache

Un Dockerfile es esencialmente un archivo de texto que contiene una serie de instrucciones utilizadas para crear una imagen Docker. Este archivo sirve como guía para que Docker construya una imagen que luego puede ser utilizada para crear y ejecutar contenedores. El Dockerfile es un componente crítico en la arquitectura de Docker, ya que permite la automatización del proceso de creación de imágenes, lo que a su vez facilita la consistencia y la reproducibilidad en el despliegue de aplicaciones. Cada línea en un Dockerfile representa una instrucción que se ejecuta en una capa separada dentro de la imagen Docker. Algunos ejemplos de estas instrucciones pueden ser: instalar un software específico, definir variables de entorno, copiar archivos del sistema local al contenedor, exponer puertos para la comunicación de red, y definir el comando que se ejecutará cuando se inicie un contenedor a partir de la imagen. Un Dockerfile comienza generalmente con la instrucción FROM, que especifica la imagen base que se utilizará para construir la nueva imagen. A partir de ahí, se pueden añadir diversas instrucciones según las necesidades de la aplicación que se vaya a contener. En resumen, el Dockerfile es la "receta" que Docker utiliza para construir imágenes de contenedores. Permite a los desarrolladores y administradores de sistemas definir exactamente cómo se configura el entorno de una aplicación, asegurando que la aplicación se ejecutará de la misma manera, independientemente del entorno en el que se despliegue.

Las capas del ejemplo marcadas con 1,2,3 y 4 en el momento de descargar la imágen de php:apache no son necesarias porque ya se descargaron previamente para la imagen php

8d691f585fa8: Already exists ①
cba12d3fd8b1: Already exists ②
cda54d6474c8: Already exists ③
412447ed0729: Already exists ④

Puedes ver las capas de una imagen usando el comando docker history <nombre-imagen>. Por ejemplo:

    #Consultamos el historial de nuestra imagen de Ubuntu

    $ docker history ubuntu

Manuel J. Rodríguez. docker history (Dominio público)

Esto te mostrará una lista de todas las capas de la imagen, junto con información sobre qué instrucción del Dockerfile creó cada capa, cuánto espacio ocupa, cuándo se creó, y más.

# Autoevaluación

# Pregunta 1

Las capas o "layers" en una imagen de Docker son mutables, es decir, una vez creadas pueden ser modificadas.

Verdadero Falso

# Retroalimentación

Falso

Las capas en una imagen de Docker son inmutables, es decir, una vez creadas no se pueden cambiar. Cada instrucción en el Dockerfile crea una nueva capa en la imagen que contiene solo los cambios que resultan de esa instrucción. Esto permite que las capas se compartan entre imágenes, lo que puede ahorrar espacio y hacer que la construcción de imágenes sea más rápida.

Creado con eXeLearning (Ventana nueva)