Arquitectura de Software y Diseño
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
Arquitectura Distribuida en AWS con Docker
1. Objetivos
▪ Crear una cuenta de Amazon Web Services (AWS).
▪ Desplegar una aplicación web en contenedores Docker usando servicios de AWS.
▪ Especificar el ambiente de ejecución de una aplicación Django a través de un
script Docker “Dockerfile”
▪ Crear una imagen de Docker a partir del archivo Dockerfile.
2. Reto
▪ Desplegar una arquitectura distribuida en la infraestructura de AWS.
3. Marco Conceptual
AWS
Amazon Web Services es un proveedor de servicios Cloud, que ofrece productos y
servicios en informática como servidores y máquinas virtuales; en almacenamiento
como buckets y sistemas de achivos; en bases de datos como PostgreSQL y MySQL, etc.
El servicio básico de AWS es el aprovisionamiento de instancias EC2. Una instancia
EC2 es un servicio web que proporciona capacidad informática en la nube segura y de
tamaño modificable. Una instancia EC2 o máquina virtual, tiene un sistema operativo y
recursos asignados como memoria RAM, cantidad de núcleos, tipo de almacenamiento,
etc. Y puede ser aprovisionada para desplegar aplicaciones web, realizar tareas de
procesamiento en background, deplegar bases de datos, etc.
Si desea obtener mayor información sobre los servicios de AWS, puede investigar en el
siguiente enlace
https://aws.amazon.com/es/
DOCKER
Docker empaqueta software en unidades estandarizadas llamadas contenedores que
incluyen todo lo necesario para que el software se ejecute, incluidas bibliotecas,
herramientas de sistema, código y tiempo de ejecución. Con Docker, puede configurar y
ajustar el ambiente de ejecución de las aplicaciones rápidamente con la certeza de saber
que su código correrá.
Hay dos conceptos clave que es necesario tener claros para utilizar correctamente
Docker:
Grupo de Construcción de Sw. AWS
Arquitectura de Software y Diseño
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
• Imagen: Es una especie de plantilla, una captura del estado de un contenedor. Se
podría decir que una imagen de un contenedor es como un snapshot de una
máquina virtual, pero mucho más ligero. Por ejemplo, una imagen puede
contener un sistema operativo Ubuntu, un servidor Apache y una aplicación web
instalada. Las imágenes se utilizan para crear contenedores y son inmutables.
• Contenedor: Es una instancia en ejecución de una imagen. Un contenedor es el
que ejecuta una aplicación, base de datos, etc. Haciendo un a analogía con el
concepto de máquina virtual, ejecutar un contenedor a partir de una Imagen, es
como si restauráramos una máquina virtual a partir de un snapshot (no es lo
mismo, pero se hace esta analogía para comprender mejor el procedimiento). A
partir de una única imagen, podemos ejecutar varios contenedores.
Docker proporciona una manera estándar de desplegar su código. Es un sistema
operativo para contenedores. De manera similar a cómo una máquina virtual virtualiza
(elimina la necesidad de administrar directamente) el hardware del servidor, los
contenedores virtualizan el sistema operativo de un servidor como se observa en la fig
1. Docker se instala en cada máquina y proporciona comandos sencillos que puede
utilizar para crear, iniciar o detener contenedores.
Figura 1. Arquitectura de un contenedor vs máquina virtual
Si desea obtener más información acerca de Docker, puede consultar el siguiente
enlace:
https://www.docker.com/why-docker
En la tabla 1 puede ver una lista de comandos de Docker para la creación y
administración de imágenes y contenedores. Algunos de estos comandos son utilizados
en este taller.
Función Comando
Crear imagen docker build –t <nombre_imagen> .
Borrar imagen docker rmi <nombre_imagen>
Listar imágenes docker images
Crear contenedor docker run –name <nombre_contenedor> <nombre_imagen>
Borrar contenedor docker rm <nombre_contenedor>
Listar contenedores docker ps –a
Grupo de Construcción de Sw. AWS
Arquitectura de Software y Diseño
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
Iniciar contenedor docker start <nombre_contenedor>
Detener contenedor Docker stop <nombre_contenedor>
Ingresar en la consola docker exec -i -t <nombre_contenedor> /bin/bash
de un contenedor
Tabla 1. Comandos de Docker
En cada comando es posible establecer varios parámetros. Si desea conocer la lista
completa de comandos y parámetros de cada comando Docker, puede ingresar al
siguiente enlace:
https://docs.docker.com/engine/reference/commandline/docker/#child-commands
La figura 2 describe el procedimiento para lograr el despliegue de una aplicación
mediante contenedores Docker. El primer paso consiste en: a) especificar el ambiente de
ejecución de la aplicación en un script Docker (i.e., Dockerfile); b) crear una imagen a
partir del script. En el segundo paso, se carga la imagen en un repositorio de Docker
Hub, la cual quedará disponible para realizar el despliegue de contenedores. Por último
(tercer paso), realizamos el despliegue de los contenedores (utilizando la imagen
creada), sobre instancias EC2 de AWS.
Figura 2. Procedimiento despliegue de contenedores
4. Contexto
En este taller, vamos a desplegar una base de datos PostgreSQL usando el servicio RDS
de AWS. Crearemos una imagen Docker a partir de un archivo Dockerfile previamente
especificado. La imagen será almacenada en un repositorio de Docker Hub, y
desplegaremos tres contenedores a partir de dicha imagen en instancias EC2 de AWS.
Finalmente, instalamos y configuramos Nginx como balanceador de carga en una
instancia EC2. En la figura 3 puede observar la vista de despliegue.
Grupo de Construcción de Sw. AWS
Arquitectura de Software y Diseño
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
Figura 3. Despliegue taller Docker AWS
5. Pre - Requerimientos
Este taller debe ser realizado en grupos máximo de 4 estudiantes, y los pre-
requerimientos pueden ser distribuidos entre los integrantes como se muestra
en la tabla 2:
Pre - Requerimiento
Integrante
5.1 5.2 5.3 5.4 5.5 5.6
1 X X X X
2 X X
X
3 X X
4 X X X
Tabla 2. Distribución de Pre - Requerimientos
5.1. Crear cuenta en AWS Educate
Cree una cuenta en AWS Educate siguiendo el tutorial que encuentra en el siguiente
enlace (todos los integrantes del grupo deben realizar este pre-requerimiento):
Taller Creación Cuenta AWS Educate
Grupo de Construcción de Sw. AWS
Arquitectura de Software y Diseño
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
5.2. Crear cuenta en Docker Hub
Ingrese al siguiente link y cree una cuenta con sus datos. Todos los integrantes del grupo
deben realizar este pre-requerimiento.
https://hub.docker.com
5.3. Crear base de datos PostgreSQL en AWS RDS – Server E
Cree una base de datos PostgreSQL usando el servicio RDS (Relational Database Service)
de AWS, siguiendo el tutorial que encuentra en el siguiente enlace:
Nota: Omita el último paso del Taller Creación Base de Datos AWS-RDS (Eliminar Base de
Datos)
Taller Creación Base de Datos AWS-RDS
5.4. Desplegar instancias EC2 e instalar Docker – Servers B, C and D
A continuación, cree las tres instancias EC2 Ubuntu Server 16.04 LTS donde se
desplegarán los contenedores Docker con la aplicación web. Para aprender a crear y
conectarse a una instancia EC2 en AWS, siga los pasos del siguiente taller.
Taller Creación y acceso a instancia EC2
Una vez creadas las tres instancias, conéctese a cada una de estas por SSH y ejecute los
siguientes comandos, para actualizar los paquetes y dependencias del SO, e instalar
Docker.
>>> sudo apt-get update
>>> sudo apt-get upgrade
>>> sudo apt-get install -y docker.io
>>> sudo systemctl start docker
>>> sudo systemctl enable docker
Por último, detenga la ejecución de las tres instancias de AWS (No las elimine). El día de
la clase de laboratorio, podrá iniciarlas nuevamente y continuar con las actividades de
esta guía. Para detener una instancia, selecciónela, luego seleccione la opción Actions-
>Instance State->Stop como se observa en la figura 4.
Grupo de Construcción de Sw. AWS
Arquitectura de Software y Diseño
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
Figura 4. Detener instancia EC2.
5.5. Desplegar instancia para el balanceador de carga – Server A
Vamos a crear una instancia EC2 Ubuntu Server 16.04, para instalar y configurar Nginx
como balanceador de carga. Para aprender a crear y conectarse a una instancia EC2 en
AWS, siga los pasos del siguiente taller.
Taller Creación y acceso a instancia EC2
Una vez creada la instancia, conéctese por SSH y realice las siguientes instrucciones.
• Actualice paquetes y dependencias del SO e instale Nginx
>>> sudo apt-get update
>>> sudo apt-get install nginx
• Es necesario deshabilitar o eliminar el archivo de configuración por defecto que
tiene Nginx. Para esto ejecute la siguiente línea:
>>> sudo rm /etc/nginx/sites-enabled/default
• Por último, detenga la ejecución de la instancia de AWS (No la elimine). El día de
la clase de laboratorio, podrá iniciarla nuevamente y continuar con las
actividades de esta guía. Para detener la instancia, selecciónela y luego
seleccione la opción Actions->Instance State->Stop como se observa en la
figura 4.
5.6. Documentación de Docker
El último integrante del grupo, debe leer la documentación de docker, y estudiar en
detalle la lista de comandos (Tabla 1) y el propósito del Dockerfile.
https://docs.docker.com/engine/docker-overview/
Grupo de Construcción de Sw. AWS
Arquitectura de Software y Diseño
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
6. Actividades
6.1 Crear una imagen Docker a partir del Dockerfile.
Para crear la imagen Docker, necesitamos crear una nueva instancia EC2 Ubuntu Server
en donde hagamos la configuración de todo el ambiente de ejecución. Esa configuración
es la que va en el Dockerfile. La instancia EC2 puede ser como la del paso anterior (5.5).
Una vez cree la instancia, conéctese a esta a través del protocolo SSH y realice las
siguientes instrucciones:
• Instalar Docker
>>> sudo apt-get update
>>> sudo apt-get upgrade
>>> sudo apt-get install -y docker.io
• Iniciar Docker y habilitarlo para que inicie al arranque de la máquina
>>> sudo systemctl start docker
>>> sudo systemctl enable docker
• En este momento Docker solo puede ser usado por el usuario root. A
continuación, vamos a habilitar nuestro usuario para utilizar Docker. Ejecute el
siguiente comando para obtener el nombre de su usuario.
>>> whoami
• Ejecute el siguiente comando, cambiando el nombre_de_usuario por el
obtenido en el paso anterior
>>> sudo gpasswd -a nombre_de_usuario docker
• Reinicie el servicio Docker
>>> sudo systemctl restart docker
• Reinicie la instancia EC2 con el siguiente comando. Esto cerrará la conexión SSH
con la instancia. Espere un par de minutos y vuelva a ingresar a la instancia
mediante SSH.
>>> sudo reboot
6.1.1. Descargar y modificar aplicación Django
A continuación, vamos a descargar la aplicación REST Django de monitoreo de
temperatura que se ha utilizado en los talleres pasados. Es necesario configurar la
conexión a la base de datos de la aplicación.
• Instale git
>>> sudo apt-get install git
• Clone el proyecto
Grupo de Construcción de Sw. AWS
Arquitectura de Software y Diseño
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
>>> git clone https://github.com/ISIS2503/ISIS2503-MonitoringApp.git
• A continuación, vamos a modificar el archivo settings.py de la aplicación, donde
debemos reemplazar los datos de conexión de la base de datos PostqgreSQL que
hemos creado.
>>> sudo nano ISIS2503-MonitoringApp/monitoring/settings.py
El parámetro HOST debe ser igual al endpoint de la base de datos que
creó en los pasos de pre-requerimientos del taller (recuerde que puede
obtener el endpoint y el puerto en la descripción de la base de datos RDS).
Adicionalmente, el resto de parámetros son como sigue: ‘NAME’ es el
nombre de la base de datos RDS, ‘USER’ es el usuario maestro,
‘PASSWORD’ es la contraseña del usuario maestro, y ‘PORT’ es el puerto
de la base de datos (normalmente 5432 para bases de datos PostgreSQL).
Para guardar los cambios, presione las teclas ctrl + x luego la tecla y por último
presione la tecla Enter.
• A continuación, es necesario aplicar las migraciones a la base de datos. Para esto,
debemos instalar algunas librerías, hacer las migraciones, y aplicarlas.
>>> sudo add-apt-repository ppa:deadsnakes/ppa -y
>>> sudo apt update -y
>>> sudo apt-get install python3.7 -y
>>> sudo update-alternatives --install /usr/bin/python3 python3
/usr/bin/python3.7 1
>>> export LC_ALL=C
>>> sudo apt-get install -y python3-pip
>>> sudo apt-get install python-psycopg2 libpq-dev python3.7-dev
>>> pip3 install Django && pip3 install psycopg2
>>> python3 ISIS2503-MonitoringApp/manage.py makemigrations
>>> python3 ISIS2503-MonitoringApp/manage.py migrate
6.1.2. Crear fichero Dockerfile
• A continuación, vamos a crear el fichero Dockerfile con las instrucciones
necesarias para crear la imagen.
>>> sudo nano Dockerfile
Algunos de los comandos más comunes del Dockerfile son los siguientes:
❖ FROM: Configura la imagen base para usar
Grupo de Construcción de Sw. AWS
Arquitectura de Software y Diseño
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
❖ MAINTAINER: Establece los datos de autor/propietario del
archivo Dockerfile
❖ RUN: Ejecuta un comando y cambia (commit) el resultado de la la
imagen final (contenedor)
❖ COPY: Copia un archivo o directorio desde el host en el
contenedor
❖ EXPOSE: Expone un puerto al exterior
• Copie y pegue el siguiente contenido en el fichero Dockerfile. Note que cada uno
de los comandos rememora lo que hicimos manualmente en el paso anterior.
FROM ubuntu:16.04
MAINTAINER NombreEstudiante
RUN apt-get update \
&& apt-get install -y python3-pip python3-dev libpq-dev \
&& pip3 install --upgrade pip \
&& apt-get install nano \
&& pip install django \
&& pip install psycopg2 \
&& pip install psycopg2-binary
COPY ISIS2503-MonitoringApp /home/
EXPOSE 8000
Con este Dockerfile, se toma como base una imagen Ubuntu 16.04, se actualizan
las dependencias, se instalan los paquetes python3, django, psycopg2, etc. Luego
se copia la aplicación web REST y finalmente se expone el puerto 8000 que es el
que utilizaremos para la aplicación web en los contenedores.
6.1.3. Crear imagen Docker
• Para crear la imagen a partir del fichero Dockerfile, ejecute el siguiente
comando, donde imagen-taller corresponde al nombre de la imagen (el punto al
final de la instrucción, es necesario para la lectura del Dockerfile).
>>> docker build -t imagen-taller .
Este proceso puede tomar unos minutos, al final se obtiene un mensaje que
indica que la construcción de la imagen ha sido exitosa.
• Liste las imágenes con el siguiente comando, para verificar que la imagen
llamada imagen-taller ha sido creada.
>>> docker images
Grupo de Construcción de Sw. AWS
Arquitectura de Software y Diseño
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
Ahora podremos subir la imagen a un repositorio de Docker Hub.
6.2 Subir imagen a un repositorio de Docker Hub.
• Para subir la imagen al repositorio de Docker Hub, es necesario autenticarse con
las credenciales de su cuenta Docker hub, que ha creado en el paso 5.2 de esta
guía. Desde la instancia EC2 donde creo la imagen, ejecute el siguiente comando
e ingrese las credenciales de su cuenta Docker hub.
>>> docker login
• A continuación, es necesario asignar un tag a la imagen mediante el comando
docker tag, este debe respetar la siguiente nomenclatura, donde
<nombre_imagen> es el nombre con el que ha sido creada la imagen (en este
taller se creó con el nombre imagen-taller), y <docker_username> es el nombre
de usuario de su cuenta Docker hub.
>>> docker tag <nombre_imagen> <docker_username>/<nombre_imagen>
Si ejecuta nuevamente el comando para listar las imágenes ( >>> docker
images), podrá observar que se ha creado una nueva imagen, pero esta vez con el
tag adecuado para subirla a un repositorio de Docker hub
• Ejecute el siguiente comando para subir la imagen, reemplazando los datos igual
que en el paso anterior
>>> docker push <docker_username>/<nombre_imagen>
Si inicia sesión en la página web de Docker Hub, podrá observar que tiene un
repositorio Nuevo con la imagen que acaba de subir.
6.3 Desplegar contenedores Docker en instancias EC2.
Hasta este punto, ya se ha creado la imagen Docker que contiene la aplicación REST
Django. A continuación, vamos a desplegar contenedores sobre las tres instancias EC2
(Server B, C and D de la figura 3) y podrá observar cómo se ejecuta la aplicación Web
sobre una máquina, sin necesidad de instalar las librerías y dependencias como Django,
Python, psycopg2, etc.
En los pre-requerimientos de esta guía, su grupo creo 4 instancias EC2, una para el
balanceador de carga (Server A), y las tres restantes son los servidores donde se
desplegarán los contenedores (Server B, C and D).
A continuación, vamos a crear un contenedor basado en la imagen que subió a Docker
Hub, en una instancia EC2. Tenga en cuenta que estas instrucciones de despliegue debe
Grupo de Construcción de Sw. AWS
Arquitectura de Software y Diseño
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
realizarlas sobre las tres instancias (Server B, C y D). Establezca una conexión por SSH a
cada una de las instancias, y realice los siguientes pasos:
Crear contenedor. El siguiente comando crea y ejecuta el contenedor a partir de la
imagen que tiene en el repositorio Docker hub. Asegúrese de cambiar los parámetros
<nombre_container> por el nombre que desea darle a su contenedor;
<docker_username> por el nombre de usuario de la cuenta Docker hub donde se
encuentra la imagen; y <nombre_imagen> por el nombre que le ha asignado a la imagen
Docker.
>>> sudo docker run --name <nombre_container> -p 80:8000 -d
<docker_username>/<nombre_imagen> python3 ./home/manage.py runserver
0.0.0.0:8000
• Puede ejecutar el siguiente comando para obtener los contenedores que se
encuentran en ejecución. Deberá obtener el contenedor que acaba de crear
>>> sudo docker ps
• Ahora puede verificar que la aplicación está ejecutándose mediante la dirección
ip pública de la instancia en la cual ha desplegado el contenedor. En el
navegador, ingrese a la siguiente url, y deberá observar la aplicación Web
http://<ip_publica>
Figura 5. Aplicación web.
• A continuación, realice el despliegue de un contenedor en cada una de las dos
instancias EC2 restantes, y verifique que la aplicación REST se ejecuta
correctamente.
Grupo de Construcción de Sw. AWS
Arquitectura de Software y Diseño
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
6.4 Configurar Nginx en una instancia EC2. (Server A)
AWS cuenta con el servicio Elastic Load Balancer ELB, para crear y configurar un
balanceador de carga, sin embargo, la cuenta AWS Educate no provee los permisos
necesarios para usar este servicio. Por este motivo, es necesario usar una instancia EC2
Ubuntu Server 16.04 para configurar el balanceador de carga. Establezca una conexión
SSH con la instancia que creo para configurar el balanceador (sección 5.5 de esta guía), y
realice el siguiente procedimiento.
• Crear el archivo de configuración del balanceador
>>> sudo nano /etc/nginx/conf.d/load-balancer.conf
La técnica de balanceo utilizada es Round Robin, por lo tanto, la configuración
del balanceador de carga, debe ser como sigue: recuerde cambiar las direcciones
ip por las de las tres instancias que ha creado y que contienen los contendores.
upstream backend {
server 172.24.10.10:80;
server 172.24.10.20:80;
server 172.24.10.30:80;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
• Reiniciar el servicio Nginx
>>> sudo service nginx restart
• A continuación, podrá ingresar al navegador con la siguiente url, y verificar el
funcionamiento de la aplicación REST.
http://<ip_publica_intancia_balanceador>/measurements
Nota: Después de realizar las Actividades (siguiente sección), recuerde eliminar o
detener las instancias que ha utilizado en este taller, si las deja en ejecución, podría
consumir la totalidad de sus créditos de AWS y quitarle la posibilidad de usar la
infraestructura en próximos talleres o en el proyecto. Adicionalmente debería eliminar
la base de datos RDS.
7. Actividades
Grupo de Construcción de Sw. AWS
Arquitectura de Software y Diseño
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
En un documento responda las siguientes preguntas:
• Agregue las siguientes tomas de pantalla:
o Lista de instancias EC2 desde el panel de AWS donde se pueda apreciar
cada una de las direcciones ip públicas de las instancias
o Contenido del archivo load-balancer.conf del balanceador de carga
• ¿Qué servicios de AWS implementaría para desplegar la arquitectura del
proyecto del curso en la nube?
• ¿Qué ventajas y desventajas en cuanto a atributos de calidad, tiene migrar
una aplicación de un ambiente on-premise a la nube?
• ¿Cree que el uso de contenedores favorece algún atributo de calidad? Justifique
su respuesta.
Grupo de Construcción de Sw. AWS