Publicación de Cryptongo con Docker
Clase 37 de 48 • Curso de MongoDB y Redis 2017
Contenido del curso
Introducción al Curso de MongoDB y Redis
MongoDB
- 8

Primeros pasos con MongoDB
04:31 min - 9

Instalación de MongoDB en Linux
01:09 min - 10

Instalación de MongoDB en Windows
00:57 min - 11

Instalación de MongoDB en Mac
00:56 min - 12

Modelado de datos en MongoDB relaciones uno a uno y uno a muchos
06:43 min - 13

Modelado de datos tipo árbol
04:51 min - 14

Creando el modelo de datos de Cryptongo
06:36 min - 15

Librerías de MongoDB - PyMongo 1
02:29 min - 16

Librerías de MongoDB - PyMongo 1 instalación de pymongo de acuerdo con el sistema operativo.
00:46 min - 17

Introducción a la Shell de Mongo
04:14 min - 18

Ejecución de código JS en la shell de MongoDB
10:39 min
Operaciones CRUD en MongoDB
- 19

Insertar un documento con la consola de Mongo
03:43 min - 20

Insertar multiples documentos con la consola de Mongo
02:43 min - 21

Funciones find y findOne
02:56 min - 22

Operaciones avanzadas con find y findOne en la consola
09:28 min - 23

Modificación de documentos en la consola de MongoDB
06:58 min - 24

Funciones de Mongo updateOne - updateMany
00:49 min - 25

Eliminar documentos en la consola de MongoDB
05:39 min - 26

Indices en MongoDB
03:06 min
Desarrollo del proyecto Cryptongo
- 27

Estructura del proyecto Cryptongo
02:35 min - 28

Librerías que usaremos en Cryptongo y cómo instalarlas
00:29 min - 29

Cómo funciona el agente que consulta Coinmarketcap
06:26 min - 30

Creando el agente que consulta en Coinmarketcap
07:03 min - 31

Calcular el hash a partir de la información del ticker en Cryptongo
08:36 min - 32

Guardar la información obtenida por el agente
06:52 min - 33

Crear API que consulta la base de datos get_documents()
08:19 min - 34

Funciones get_top20() y remove_currency()
03:55 min - 35

Creación del Endpoint de Cryptongo
05:23 min - 36

Endpoint /tickers para ver todos los documentos en cryptongo
09:28 min - 37

Publicación de Cryptongo con Docker
Viendo ahora
Redis
- 38

Primeros pasos con Redis
05:13 min - 39

Instalación de Redis en Ubuntu Linux
00:43 min - 40

Instalación de Redis en Windows
04:54 min - 41

Instalación de Redis en Mac
00:12 min - 42

Consola Interactiva de Redis - Redis CLI
05:25 min - 43

Insertar y leer datos en Redis
00:43 min - 44

Eliminar datos en Redis
00:45 min - 45

Full page cache con Redis
06:42 min - 46

SetEx, cómo guardar un registro que tenga una fecha de vencimiento.
01:09 min - 47

FLUSHDB, FLUSHALL, cómo eliminar una BD o todas las BD.
00:39 min - 48

Cierre del curso
00:43 min
Deploy de Cryptongo en Docker
Para desplegar Cryptongo se necesita tener instalado y configurado Docker en el entorno dónde se desea desplegar Cryptongo, para eso es recomendable ver el curso de Docker.
Una vez instalado Docker debemos empezar a crear las imágenes de Docker con dos Dockerfiles uno para el agente y otro para nuestra API REST.
Desplegando nuestro agente
Debemos comenzar por ejecutar un contenedor que contendrá MongoDB para guardar toda la información de las criptomonedas. MongoDB 3.4 se encuentra disponible en la imagen oficial de MongoDB para Docker.
Para ejecutar mongo solo debemos ejecutar desde la consola:
$ docker run -d --name=mongo-crypto mongo:3.4
Con el comando run le indicamos a Docker que va a ejecutar un contenedor, con el parámetro -d indicamos que se ejecutará en segundo plano, con --name asignamos un nombre personalizado al contenedor y por último especificamos el nombre de la imagen y la etiqueta.
En este caso ejecutamos la imagen mongo con la etiqueta 3.4 para especificar que de la imagen de MongoDB deberá Docker ejecutar la versión 3.4 que está disponible en el repositorio oficial.
Antes de desplegar nuestro agente haremos una modificación al código para agregar un sleep y un while para ejecutar de manera infinita nuestro agente y que espere 4 minutos para volver a pedir información del API. La modificación se debe hacer al principio y al final del archivo.
Al principio del archivo hay que importar la librería time dónde encontraremos la función de sleep. Para eso colocamos import time.
Y al final de nuestro archivo main.py, vamos a reemplazar todo el contenido que está por debajo de la línea que contiene if __name__ == "__main__": por el siguiente código:
if __name__ == "__main__": while True: print("Guardando información en Cryptongo") connection = get_db_connection('mongodb://mongo-crypto:27017/') tickers = get_cryptocurrencies_from_api() for ticker in tickers: save_ticker(connection, ticker) time.sleep(240)
Una forma válida y sencilla para ejecutar infinitamente un programa es agregando un while para que no se detenga la ejecución.
También cambiamos localhost por mongo-crypto para que enlacemos el contenedor de MongoDB con el del agente aprovechando las características de Docker que me permite especificar un alias como mongo-crypto que apuntará a la IP interna del contenedor de MongoDB.
También se agrega time.sleep(240) que indica a Python que espere 240 segundos, tras ese tiempo se ejecutará de nuevo el while.
El print es solo para mostrar algo en sola y verificar que todo se ejecute correctamente.
Una vez se hagan todos esos cambios procederemos a crear nuestro Dockerfile en la misma carpeta donde se encuentra main.py de nuestro agente.
El contenido del Dockerfile será el siguiente:
FROM python:3.5 WORKDIR /usr/src/app RUN pip install requests flask pymongo COPY main.py ./agent.py CMD [ "python", "agent.py" ]
La primera línea del FROM se indica la imagen que usará como base, en este caso python:3.5.
WORKDIR se usa para especificar que carpeta se usará para ejecutar todos los comandos, es equivalente a hacer cd carpeta en *NIX.
En la tercera línea se usa el comando RUN para instalar las librerías con pip.
Con COPY copiamos de nuestra carpeta del agente el archivo main.py a la carpeta que tenemos especificada en WORKDIR además renombramos a agent.py
Por último especificamos el comando que tendrá nuestra imagen CMD [ "python", "agent.py" ].
Ya por último construimos y ejecutamos nuevamente docker run enlazando nuestro contenedor de MongoDB con el parámetro --link de Docker.
Construir la imagen del agente
$ docker build -t="cryptongo-agent" .
Este comando construirá la imagen con el Dockerfile que está en la carpeta y le colocará el nombre de "cryptongo-agent".
Ejecutar la imagen del agente
$ docker run -it --link=mongo-crypto:mongo-crypto cryptongo-agent Guardando información en Cryptongo
Con docker run especificamos -it para tener una consola interactiva de nuestro contenedor y de esta forma se ejecuta en primer plano, si deseamos que sea en segundo plano cambiamos -it por -d como se hizo en el contenedor de MongoDB.
En --link especificamos el nombre de nuestro contenedor de MongoDB y el alias que tendrá dentro de nuestro contenedor del agente.
Ya en este punto está en ejecución nuestro agente de Cryptongo y cada 4 minutos pedirá información del API.
Desplegando nuestro API REST
Para nuestra API solo cambiaremos la línea que contiene:
db_connection = get_db_connection('mongodb://localhost:27017/')
por
db_connection = get_db_connection('mongodb://mongo-crypto:27017/')
Luego creamos el Dockerfile en la carpeta donde se encuentra el archivo main.py de nuestra API y colocamos el siguiente contenido:
FROM python:3.5 ENV FLASK_APP api.py WORKDIR /usr/src/app RUN pip install requests flask pymongo COPY main.py ./api.py EXPOSE 5000 CMD [ "flask", "run", "--host=0.0.0.0" ]
El archivo es muy similar al Dockerfile del agente, pero tiene dos variaciones.
La primera crea una variable de entorno necesaria por Flask para saber que archivo ejecutar, eso se realiza con el comando ENV seguido del nombre de la variable y el contenido.
La segunda modificación es el uso del comando EXPOSE para publicar el puerto 5000 de nuestra imagen, ese es el puerto que usa Flask para escuchar peticiones.
Construcción de la imagen del API
Para construir la imagen ejecutamos docker build cambiando el nombre a cryptongo-api.
$ docker build -t="cryptongo-api" .
Ejecutando el API de Cryptongo
La ejecución se realiza con docker run y de nuevo enlazamos el contenedor de MongoDB para poder leer la base de datos:
$ docker run -it --link=mongo-crypto:mongo-crypto -p 5000:5000 cryptongo-api
La diferencia esta vez es que abrimos el puerto 5000 del contenedor para enlazarlo con el puerto 5000 del servidor host, de esta forma se puede ingresar desde el navegador a la dirección IP del servidor con el puerto 5000.