Entrar al aula
×

Imágenes de los contenedores Docker

Las imágenes son la plantilla maestra inmutable que se utiliza para crear contenedores que son exactamente iguales.

Una imagen contiene el Dockerfile, las bibliotecas y el código que una aplicación necesita para ejecutarse. En ese sentido, no es más que un sistema de ficheros.

¿Por qué son necesarias las imágenes? Principalmente por cuatro razones:

Distribución

 Esta es la manera más efectiva de distribuir el software que se ejecutará en los contenedores.

Versionado

 El contenido de una imagen determina una versión de un sistema.

Inmutabilidad

 Que una imagen no cambie garantiza que se ejecutará del mismo modo en cualquier entorno.

Paquetización

Una imagen debería ser el artefacto de salida de un proceso de Integración Continua que utilice contenedores.

Se conoce como un artefacto (artifact) al resultado de construir y empaquetar nuestro software para que sea desplegable en un entorno. En algunos sitios también se le denomina paquete (package).

Obtención de imágenes

Las imágenes de Docker pueden crearse localmente u obtenerse de un repositorio. Un repositorio de imágenes es llamado registro en Docker. Un registro puede ser público o privado.

Afortunadamente, la amplia comunidad de Docker ha puesto a disposición de los desarrolladores miles de imágenes que empaquetan los softwares más variados.

Se puede decir, sin exageración, que podemos obtener imágenes para prácticamente cualquier sistema que queramos utilizar.

  

Imágenes oficiales 

BusyBox

BusyBox es un comando que combina versiones ligeras de muchas utilidades comunes de UNIX en un único ejecutable.

Proporciona alternativas para la mayoría de las utilidades que generalmente se encuentran en GNU coreutils, util-linux, etc. 

Las utilidades en BusyBox son más sencillas que las versiones GNU; sin embargo, las opciones que se incluyen son suficientes para obtener la mayoría de la funcionalidad.

Comandos disponibles en BusyBox

La imagen busybox es ideal si se quiere obtener una funcionalidad mínima o ejecutar comandos GNU en nuestro contenedor. Por su tamaño optimizado, se suele usar como base para imágenes ligeras que realicen tareas de administración comunes escritas con Bash.

Imágenes oficiales

Capas de la imagen

Vamos a profundizar un poco en el concepto de imagen aprendiendo que son las capas (layers) de una imagen.

Una imagen está compuesta por capas. Las capas se van apilando para conformar la imagen.

Cada capa consiste en cambios incrementales sobre un sistema de ficheros. Estos cambios pueden ser:

En la siguiente imagen se muestra un esquema de las capas de una imagen:

  1. En la imagen base hay 2 ficheros.
  2. En la capa 1, se adiciona un fichero 3.
  3. En la capa 2, se modifican los ficheros 1 y 3.
  4. En la capa 3, se elimina el fichero 2.

El resultado sería una imagen conteniendo File 1 y File 3.

Con el comando docker history se pueden ver detalles de la imagen, entre ellos las capas que la componen:

 $ docker history nginx
IMAGE           CREATED         CREATED BY                            SIZE
6678c7c2e56c    2 weeks ago     /bin/sh -c #(nop)  CMD ["nginx" ...   0B                  
<missing>       2 weeks ago     /bin/sh -c #(nop)  STOPSIGNAL ...     0B                  
<missing>       2 weeks ago     /bin/sh -c #(nop)  EXPOSE 80          0B                  
<missing>       2 weeks ago     /bin/sh -c ln -sf /dev/stdout ...     22B                 
<missing>       2 weeks ago     /bin/sh -c set -x  && addgroup ...    57.6MB              
<missing>       2 weeks ago     /bin/sh -c #(nop)  ENV PKG_RE...      0B                  
<missing>       2 weeks ago     /bin/sh -c #(nop)  ENV NJS_VER...     0B                  
<missing>       2 weeks ago     /bin/sh -c #(nop)  ENV NGINX_VER...   0B                  
<missing>       3 weeks ago     /bin/sh -c #(nop)  LABEL maint...     0B                  
<missing>       3 weeks ago     /bin/sh -c #(nop)  CMD ["bash"]       0B                  
<missing>       3 weeks ago     /bin/sh -c #(nop) ADD file:e5a3...    69.2MB

Las capas de la imagen tienen cada una un tamaño, como podemos ver en la columna SIZE.

En la columna IMAGE se muestra un valor llamado digest, que no es más que un hash SHA-256 del contenido de la capa. En el caso de las imágenes públicas, no es posible acceder a las imágenes intermedias, por eso los digest de todas menos la última capa aparecen como <missing&gt;.

¿Por qué es esto importante? Comprender el sistema de capas es vital para optimizar el tamaño de las imágenes, que impactará en el desempeño de nuestros sistemas. Cuanto menos cambios contenga cada capa, menor es el tamaño de la imagen final y por tanto más eficiente será el proceso de lanzar y mantener el contenedor funcionando.

Más adelante veremos cómo se aplica esto en la práctica.

El sistema de capas en imágenes de Docker no es más que un Union File System. Para construirlo, se utiliza una estrategia conocida como Copy-on-write que maximiza la eficiencia.

Si un fichero o carpeta existe en las capas inferiores de la imagen, solo se modifica su contenido en una capa superior si existe necesidad de cambiarla. Esto permite que las capas inferiores se puedan reusar en otras construcciones de imágenes.

Por eso se dice que las capas son inmutables, el contenido del sistema de ficheros solo puede cambiar añadiendo nuevas capas encima.

La implementación de este proceso en Docker se realiza mediante diferentes drivers. El utilizado por defecto se denomina overlay2 y debería ser suficiente para la mayoría de los casos.

En caso de necesitarse una puesta a punto específica de nuestro Docker Engine, puede ser necesario estudiar las características, ventajas y desventajas del resto de los drivers.

Descarga de imágenes