Cuando trabajamos con Docker, entender cómo funcionan las capas, cómo se gestionan los archivos eliminados y cómo se estructura el almacenamiento en el host es clave para optimizar imágenes y garantizar un uso eficiente del espacio. Este artículo reúne todo lo necesario para comprender estos conceptos.

1. ¿Qué Son las Capas en Docker?

Docker utiliza un sistema de archivos en capas para construir imágenes y ejecutar contenedores. Cada instrucción en un Dockerfile (como RUN, COPY, ADD) crea una nueva capa que contiene únicamente los cambios realizados en esa etapa.

Cómo Funcionan las Capas

1. Las capas son incrementales:

Cada capa contiene solo los cambios realizados respecto a la capa anterior (nuevos archivos, modificaciones o eliminaciones).

2. Las capas son inmutables:

Una vez creadas, no pueden modificarse. Si un archivo en una capa anterior se elimina en una capa posterior, el archivo sigue existiendo físicamente en la imagen, pero Docker lo oculta utilizando un sistema de archivos en capas como OverlayFS ya que las capas son de solo lectura una vez creadas.

3. Reutilización de Capas:

Si dos imágenes comparten una o más capas (por ejemplo, porque se basan en la misma imagen base), Docker reutiliza esas capas, lo que ahorra espacio y acelera las construcciones.

Ejemplo Práctico:

Un Dockerfile como este:

FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y curl
COPY app /app

Generará las siguientes capas:

1. FROM ubuntu:20.04: La imagen base.

2. RUN apt-get update: Contiene los archivos modificados por apt-get update.

3. RUN apt-get install -y curl: Añade los archivos relacionados con curl.

4. COPY app /app: Copia los archivos desde la carpeta app del host en la imagen.

2. Funcionamiento del Ocultamiento de Archivos en Docker

Cuando se elimina un archivo en una imagen Docker, este no se elimina físicamente de las capas anteriores debido a la inmutabilidad de las capas. En su lugar, Docker utiliza un mecanismo basado en whiteout files (archivos de ocultación) para gestionarlo.

Cómo se Ocultan Archivos

1. Whiteout Files (.wh.<nombre_archivo>):

Cuando eliminas un archivo, Docker crea un archivo especial en la capa superior que indica al kernel que oculte el archivo correspondiente en las capas inferiores.

2. OverlayFS y el Sistema de Archivos Combinado:

Docker utiliza OverlayFS, que monta todas las capas (superior e inferiores) en un único sistema lógico visible dentro del contenedor.

• Si OverlayFS encuentra un whiteout file, excluye tanto el archivo original como el whiteout file del sistema combinado.

Ejemplo Práctico:

Supongamos este Dockerfile:

FROM ubuntu:20.04
RUN echo "Hola, Mundo!" > /archivo.txt
RUN rm /archivo.txt

1. En la primera capa, se crea /archivo.txt.

2. En la segunda capa, se genera .wh.archivo.txt, que oculta /archivo.txt de las capas inferiores.

3. Desde el contenedor, el archivo /archivo.txt no será visible.

Esto no es una forma eficiente de trabajar con las imagenes ya que ocuparan mas espacio a la hora de trabajar con ellas con archivos inecesarios e inaccesibles.

3. Por Qué Deberías Borrar Archivos en la Misma Capa

Si eliminas archivos en una capa distinta a la que los añadió, seguirán ocupando espacio en la imagen, aunque no sean visibles. Esto puede hacer que las imágenes sean innecesariamente grandes.

Solución: Borra Archivos en la Misma Capa

En lugar de:

RUN apt-get update
RUN apt-get install -y curl
RUN rm -rf /var/lib/apt/lists/*


Usa:

RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*


Esto asegura que los archivos temporales no creen uso de espacio inecesario y la imagen quede mas ligera para su uso.

4. Estructura de Directorios y su Uso

Docker almacena las capas, metadatos e imágenes en el host, generalmente en /var/lib/docker/. Aquí tienes una descripción de los directorios clave:

1. /var/lib/docker/overlay2/:

Subdirectorio Proposito
diff/Este subdirectorio contiene los archivos y directorios añadidos o modificados en esa capa específica.
linkEs un archivo que contiene un identificador único para la capa. Actúa como un enlace simbólico interno que ayuda a Docker a rastrear esta capa.
lower
Este archivo lista las capas inferiores (base) sobre las que se construye la capa actual.
merged/
Este subdirectorio contiene el sistema de archivos combinado que resulta de apilar todas las capas (inferiores y la capa actual).


init-id

Rastrea el estado inicial de la capa para ayudar al sistema interno de Docker.

work/

Un directorio temporal que OverlayFS utiliza internamente para manejar operaciones de montaje.

5. Resumen

Docker utiliza un diseño eficiente y sistemas de archivos en capas para:

1. Gestionar Cambios Incrementales: Cada instrucción del Dockerfile crea una capa independiente.

2. Optimizar Espacio: Reutiliza capas compartidas.

3. Funcionamiento: Entender el funcionamiento de las capas te ayudara a crear imagenes mas ligeras y eficientes.

4. Estructura de Directorios: Organiza capas, imágenes y contenedores en un sistema jerárquico.