Al finalizar el tutorial el estudiante estará en capacidad de:
En particular se utilizarán los siguientes recursos:
Como ya hemos visto, Docker nos permitirá desplegar una aplicación en un ambiente aislado que se construirá con las librerías y configuraciones determinadas en el archivo Dockerfile.
Para este tutorial queremos desplegar localmente una aplicación que hace uso de una base de datos, al usar solo docker deberíamos configurar la base de datos como servicio en la nube, o configurar una base de datos local. Sin embargo, existe otra forma; utilizar otra contenedora con la base de datos y hacer que nuestra aplicación se comunique con ella.
Con esto en mente podríamos ejecutar dos contenedoras haciendo uso de los comandos de docker y configurarlas correctamente por medio de parámetros. Pero existe la opción de usar una herramienta de Docker llamada docker-compose.
Docker-compose nos permite ejecutar ambientes multicontenedor de manera local, haciendo uso de un archivo .yml donde se configuran las imágenes que queremos instanciar, la red que compartirán, los volúmenes de archivos que utilizarán y otros parámetros adicionales. Por medio de esta herramienta podremos configurar un contenedor que contendrá una base de datos y nuestra aplicación, y especificar cómo se comunicarán entre ambas.
El código de la aplicación lo encuentra en el siguiente repositorio de GitHub:
https://github.com/MISW-4301-Desarrollo-Apps-en-la-Nube/Semana-2-Tutorial-ContainerRegistry
Revise el código del proyecto, encontrará que en la carpeta está el archivo Dockerfile y el archivo compose.yml para la ejecución con docker-compose.
La aplicación es una pequeña API en Python y Flask con dos endpoints.
Endpoint | /entrega/<int: delivery_id> |
Descripción | Retorna el detalle de un reporte de entrega de un pedido |
Método | GET |
Retorno | application/json, con la información de un pedido. |
Parámetros del Endpoint | delivery_id: Identificador del pedido que se desea recuperar |
Endpoint | /entrega |
Descripción | Almacena una nueva entrega de un pedido en la base de datos. |
Método | POST |
Retorno | application/json. Con un diccionario que representa la información de una entrega. |
Parámetros del Endpoint | Ninguno. |
Como comentamos anteriormente, en el repositorio se encuentra el archivo Dockerfile, en el que podrá encontrar las sentencias para la construcción de la imagen de la aplicación. A continuación, encontrará la definición de la imagen del contenedor de la aplicación del tutorial.
Ilustración 1. Definición de la imagen del contenedor de la aplicación
Las instrucciones que encontramos en el archivo son:
Ahora bien, ya con la definición de nuestra imagen, abra su terminal en la ruta donde está el archivo Dockerfile. Y a continuación ejecute el comando:
docker build -t <nombre_repositorio:tag> .
El tag puede ser usado para versionar su imagen, para este ejercicio utilice el tag uniandes-miso-cloud-native-semana3:1.0
.
No olvide el punto al final de la instrucción, su propósito es determinar la ubicación del archivo Dockerfile. En nuestro caso estamos haciendo referencia a la ruta donde estamos ubicados.
Si todo funciona correctamente verá en su consola como se descargan cada una de las capas de la imagen. Valide que la imagen fue creada con el comando:
docker images
Ya con la imagen de nuestro contenedor lista para ser instanciada, vamos a revisar el archivo de configuración del despliegue con Docker Compose; compose.yml. En este archivo vamos a definir cada uno de los contenedores que vamos a desplegar con su configuración de red, variables de entorno y volúmenes de almacenamiento.
Ilustración 2. Definición del despliegue empleando un archivo de configuración de Docker Compose
La estructura de este archivo posee 3 jerarquías principales a analizar.
Con respecto a la jerarquía service donde declaramos los contenedores, vamos a encontrar la definición del grupo de configuraciones de cada contenedor. Para cada uno de ellos encontraremos.
Con esto claro, ya comprenderá que en el archivo se define una contenedora llamada postgres y una llamada aplicacion, y debajo de cada una estamos definiendo su configuración de aplicación multicontenedor por medio de los atributos descritos antes.
Ahora instanciamos el despliegue completo (las dos contenedoras en el archivo) mediante la instrucción:
#docker-compose -f <ruta-archivo-compose.yaml> up -d docker-compose -f compose.yaml up -d
Por ejemplo:
Ilustración 3. Despliegue de los contenedores mediante Docker Compose
Si deseamos consultar qué contenedores tenemos desplegados actualmente podemos utilizar el comando.
docker ps -a
Asimismo, si deseamos consultar métricas de consumo de recursos por parte de los contenedores podemos usar.
docker stats
Asimismo, si deseamos instanciar una sesión de terminal para depurar un contenedor, podemos emplear, generalmente, la siguiente instrucción empleando docker exec.
docker exec -it <nombre-contenedor> /bin/bash
Ilustración 4. Ingreso a un contenedor vía consola
Para culminar este tutorial, lo invitamos a poner a prueba cada uno de dos endpoint disponibles para consultar ordenes de entrega y agregar nuevas. Para ello, importe en Postman la colección que se encuentra presente en el repositorio en la carpeta postman/.
Finalmente, si deseamos detener el despliegue de contenedores completamente, podemos usar
#docker-compose -f <ruta-archivo-compose.yaml> down docker-compose -f compose.yaml down
Ilustración 6. Eliminación del despliegue de contenedores
Éxitos en el desarrollo del tutorial y nos vemos en una próxima oportunidad
[1] «Docker Engine overview», Docker Documentation, mar. 17, 2021. https://docs.docker.com/engine/ (accedido mar. 18, 2021).
[2] «Dockerfile reference», Docker Documentation, oct. 22, 2021. https://docs.docker.com/engine/reference/builder/.