Docker y Docker Compose
La información que se aporta a continuación pretende ser complementaria al guion del proyecto y no es de lectura obligatoria.
Motivación
En lugar de instalar los programas directamente en la máquina virtual que crearéis, los deberéis implementar en contenedores de software aislados (containers). Estos contenedores son unidades de software que empaquetan código para que las aplicaciones funcionen de forma aislada sin la necesidad de emplear múltiples máquinas virtuales.
Docker
Docker es un proyecto de código abierto para automatizar la implementación de aplicaciones como contenedores portátiles y autosuficientes que se pueden ejecutar en la nube o localmente. Docker es también una empresa (Docker Inc.) que promueve e impulsa esta tecnología.
La tecnología Docker usa el kernel de Linux (la base común que comparten Ubuntu, Debian, Mint, etc.) para segregar los procesos, de modo que puedan ejecutarse de manera independiente en contenedores, con el objetivo de hacer un mejor uso del hardware disponible y conservar la seguridad que ofrecería una solución donde los procesos se ejecutan en sistemas físicos separados.
Las herramientas del contenedor ofrecen un modelo de implementación basado en imágenes, que son representaciones estáticas de una aplicación o servicio y de su configuración y dependencias. Para ejecutar la aplicación o el servicio, se crea una instancia de la imagen de la aplicación para crear un contenedor, que en vuestro caso se ejecutará en la máquina virtual. Docker Hub es un registro público donde cualquier desarrollador puede colgar una imagen que contenga el software que ha generado. Por defecto, Docker busca la imagen que se le indica en este registro. En el caso de una aplicación concreta, es común encontrar una imagen por cada versión comercial de la aplicación. Ello permite que los contenedores ejecuten versiones de software concretas sin importar el hardware que está siendo utilizado, e incluso que varias versiones del mismo programa se ejecuten simultáneamente sin que ocurran errores de compatibilidad.
Los tags son etiquetas que permiten diferenciar distintas instancias que se hayan creado a partir de una misma imagen. Estas imágenes se generan localmente mediante el comando build a partir de un archivo DockerFile, que permite definir una serie de instrucciones que se ejecutarán en el momento de la creación de una imagen.
En la captura que se presenta en la página siguiente, que corresponde al archivo docker-compose que se os proporciona para generar los containers que necesitaréis en el proyecto, se indica que la imagen que se va a utilizar es una imagen de Node-RED que hemos identificado con el tag “1.3.0”.
Podéis encontrar toda la información referente a Docker (terminología y aspectos técnicos) en los siguientes enlaces. El primer enlace conduce a la documentación de Microsoft sobre Docker mientras que el segundo conduce a la documentación oficial de Docker.
https://docs.microsoft.com/es-es/dotnet/architecture/containerized-lifecycle/
Docker Compose
Docker Compose es una herramienta para definir y ejecutar soluciones multi-contenedor, que utiliza archivos YAML para configurar las distintas aplicaciones (una para cada contenedor) y lleva a cabo el proceso de creación y arranque de los contenedores con solo un comando (docker-compose up). El archivo YAML que se escribe para cada solución también recibe el nombre de docker-compose.
La siguiente figura, que es un recorte del archivo docker-compose que utilizaréis en el proyecto, permite observar cómo se define un servicio concreto, en este caso Node-RED:
- En image se indica que imagen se va a utilizar de Node-RED. En este caso no es una imagen tomada del repositorio oficial de Node-RED; se trata de una imagen generada tomando como base la imagen de la versión 1.8.4-alpine de Node-RED sobre la que se han instalado los paquetes que necesitaréis.
- En environment, en este caso, se indica solo la zona horaria.
- En ports se indica la correspondencia entre puertos (el primero siendo el de la máquina virtual y el segundo siendo el del contenedor).
- En networks se indica que dirección IP tomará este contenedor en la red interna que formarán todos los contenedores generados mediante este archivo docker-compose.
- En volumes se indica donde se deberá almacenar los datos generados una vez el contenedor se apague. Si eso no se hiciera, los datos se perderían ya que los contenedores se generan cada vez como una nueva instancia de una imagen.

Podéis encontrar toda la documentación referente a Docker Compose en el siguiente enlace: