En este laboratorio desarrollaremos un proyecto web simple, en en cual cada uno de los módulos que lo componen estarán corriendo en contenedores de docker independientes en una máquina virtual AWS, sin embargo, estos módulos se podrán comunicar entre ellos a través de la red local. Los componentes del sistema se enumeran a continuación:
- Motor de bases de datos Mongodb corriendo en el puerto local 27017.
- 3 Instancias del servicio LogService escuchando en los puertos locales 35001, 35002 y 35003 respectivamente.
- Una instancia del servicio RoundRobin escuchando en el puerto público 8080.
La implementación se divide en dos partes, desarrollo y creación de contenedores, y despliegue de los contenedores en AWS. Haremos un breve recorrido por ambas partes.
Dos de las tres partes que componen el proyecto fueron desarrolladas por nosotros mismos, estas son RoundRobin y LogService, su código fuente puede ser encontrado en los enlaces de cada una de ellas, y su arquitectura en el documento de diseño.
Luego de crear con éxito las partes y probarlas localmente en los servidores SparkWeb de cada una de ellas, procedimos a encapsularlas en contenedores Docker como se muestra continuación.
Inicialmente, construimos los contenedores de manera local con los siguientes comandos:
Luego de esto, creamos dos repositorios en dockerhub, uno para cada una de nuestras imágenes, y las subimos con los siguientes comandos:
Mapeamos los repositorios a nuestros contenedores locales
Subimos los contenedores a los repositorios
Ahora que tenemos los contenedores subidos en nuestro repositorio, vamos a crear un archivo docker compose para instalarlos de manera sencilla en otras máquinas, el código de este archivo luce así:
version: '2'
services:
round:
image: danielrincon/roundrobin:latest
container_name: roundrobin
ports:
- "8080:6000"
depends_on:
- "logservice1"
- "logservice2"
- "logservice3"
- "db"
logservice1:
image: danielrincon/logservice:latest
container_name: logservice35001
ports:
- "35001:6000"
depends_on:
- "db"
logservice2:
image: danielrincon/logservice:latest
container_name: logservice35002
ports:
- "35002:6000"
depends_on:
- "db"
logservice3:
image: danielrincon/logservice:latest
container_name: logservice35003
ports:
- "35003:6000"
depends_on:
- "db"
db:
image: mongo:3.6.1
container_name: mongodb
ports:
- 27017:27017
command: mongod
volumes:
mongodb:
mongodb_config:
Como podemos observar tenemos una instancia de nuestro contenedor RoundRobin, el cuál hará el rol de servidor público y de balanceador de carga, tres instancias de nuestro contenedor LogService, los cuales se encargarán de escribir los logs en la base de datos, y una instancia de MongoDB que es nuestra base de datos no relacional.
Gracias a que docker-compose crea una red interna con un servicio DNS, podemos conectarnos entre contenedores por medio de sus propios nombres, un ejemplo de conexión a la base de datos corriendo en el contenedor llamado mongodb es el siguiente:
Gracias a que subimos nuestro repositorio en Github, fué muy sencillo clonarlo en nuestra máquina virtual en AWS y ejecutar el docker-compose para instalar todos los contenedores. Inicialmente, instalamos el docker-compose con los siguiente comando:
Luego de esto, clonamos nuestro repositorio de Github, nos cambiamos a la carpeta e instalamos nuestros contenedores por medio de docker-compose de la siguiente manera:
Una vez los contenedores se encuentran desplegados y en ejecución, podemos observar el estado de la red interna por medio del siguiente comando, y arrojándonos el siguiente resultado:
docker network inspect <Network name>
Acá nos pudimos dar cuenta de que todos los contenedores se encuentran dentro de la misma red y se pueden comunicar entre ellos. Por último, debemos abrir el puerto público de la máquina virtual, en nuestro caso el 8080, para que de esta forma sea accesible por cualquier persona.
Vamos a observar que sucede al agregar un nuevo registro:
Como pudimos observar, se adicionó y se retornó correctamente el registro junto con los que se habían registrado anteriormente.
Clone el proyecto utilizando el siguiente comando:
git clone https://github.com/danielrincon-m/AREP_LAB5.git
Un IDE que soporte proyectos Java, o una instalación de Maven en su sistema, puede obtenerlo desde la página oficial.
Las pruebas pueden ser ejecutadas desde la sección de pruebas de su IDE o si tiene maven puede navegar a la carpeta principal de cada uno de los dos proyectos internos y ejecutar el comando
mvn test
La documentación de los proyectos puede ser encontrada en las carpetas LogService/docs y RoundRobin/docs.
También puede ser generada con Maven, clonando el proyecto y ejecutando el siguiente comando:
mvn javadoc:javadoc
El documento de diseño del programa puede ser encontrado aquí.
- Visual Studio Code - IDE de desarrollo
- Maven - Manejo de Dependencias
- JUnit - Pruebas unitarias
- GitHub - Repositorio de código
- Docker - Herramienta de encapsulamiento en contenedores
- MongoDB - Base de datos
- AWS - Despliegue en la nube
Daniel Felipe Rincón Muñoz: Planeación y desarrollo del proyecto - Perfil de GitHub
Este proyecto se encuentra licenciado bajo GNU General Public License - consulte el archivo LICENSE.md para más detalles.