Hola de nuevo, en el anterior post realicé una pequeña introducción a Docker. Como ya expliqué, con Docker podremos ejecutar software en entornos aislados de ejecución llamados contenedores. La pregunta obvia es ¿que software es el que se ejecuta dentro del contenedor?
Para poder crear un contenedor usaremos imágenes de software, las cuales contendrán las aplicaciones que necesitamos con todas sus dependencias.
Al hablar de imágenes de software podemos pensar que estas son ficheros únicos, como un paquete RPM o DEB, que descargamos y utilizamos para crear contenedores pero, en realidad, las imágenes de Docker son conjuntos de capas de ficheros.
Cada una de las capas de ficheros que forman una imagen contiene un conjunto de ficheros y directorios y todas esas capas juntas, mediante el uso de un union filesystem, formará el sistema de archivos completo que usará el contenedor.
Visualmente creo que se entiende mucho mejor, así que ahí va un esquema aclaratorio:
Sistema de archivos UFS y su relación con capas de ficheros. |
Viendo esta imagen podemos entender como, al unir varias capas de sistemas de ficheros, se formará una imagen que contendrá todos los archivos necesarios para poder ejecutar una determinada aplicación.
Las capas de sistemas de ficheros se relacionarán entre ellas de tal manera que, la capa más baja será la capa padre de la siguiente y así sucesivamente, hasta formar una imagen completa que contenga toda la estructura de directorios y los ficheros necesarios para la ejecución de una determinada aplicación.
Por tanto, al crear un contenedor con una imagen, lo que tendremos serán todas esas capas montadas mediante un union filesystem que para el contenedor será un sistemas de ficheros HFS estándar, aunque realmente los archivos y directorios estén distribuidos entre las diferentes capas.
Cuando los procesos que corren en la aplicación deban realizar operaciones de escritura, lo harán sobre una capa superior que se añadira automáticamente a la imagen en el mismo momento de su creación.
Con esta forma de trabajar está claro que se consigue una reutilización de las capas de software para poder construir diferentes imágenes con solo relacionarlas entre ellas. Por ejemplo imaginemos una imagen que contenga el software de un servidor web como Apache o Nginx, aunque es una aproximación muy burda podemos imaginar que podría estar formada por dos capas de sistemas de ficheros:
- La primera capa contendría las bibliotecas necesarias de sistema operativo, así como aplicaciones básicas como una shell bash.
- La segunda capa, que sería hija de la anterior, contendría el software del propio servidor web, con sus bibliotecas, binarios y ficheros de configuración.
De este modo, al montar ambas capas juntas, el contenedor tendría acceso a un sistema de archivos donde "vería" ciertas carpetas con bibliotecas y binarios de sistema y, adicionalmente, las carpetas que contendrían el software del servidor web.
Más adelante volveremos sobre las imágenes, ya que lo interesante es ver como usarlas y construirlas, pero creo que para empezar es una buena introducción.
Muy pronto más información.