16 jul. 2016

Introducción de Redis con Python

En dos artículos sobre Docker se tocaron el tema de redis, el primero fue usando flask y el segundo, el último artículo que habla de crear una imagen Docker para Redis.

A continuación se usará un contenedor Docker con una aplicación Python que se conecta a redis.

La estructura de directorios de la aplicación es la siguiente:

redis2
├── app.py
└── Dockerfile


El archivo Dockerfile contiene lo siguiente:

#Imagen base de debian
FROM debian
#Directorio de trabajo /code
WORKDIR /code
#Actualización de la lista de paquetes
RUN apt-get update

#Se instala el módulo redis para python
RUN apt-get install -y python-redis 
#Se limpia la cache de paquetes deb
RUN apt-get clean

#Se agrega el código en el directorio de trabajo
ADD . /code
#Se ejecuta el script
CMD python app.py

El código de la aplicación es el siguiente:

#!/usr/bin/env python

#Se importa redis
import redis

#Se crea la instancia de conexion al contenedor redis
cliente = redis.StrictRedis(host='redis', port=6379)

#Se asigna un mensaje a la variable saludo
cliente.set("string:saludo", "Hola mundo!")
#Se muestra el valor de la variable saludo
print (cliente.get("string:saludo"))

#Se crea una variable contador y se incrementa su valor
cliente.incr("string:contador")
#Se muestra el valor de la variable saludo y contador
print (cliente.mget(["string:saludo", "string:contador"]))

#Se crea una lista con 2 items
cliente.rpush("list:lista", "v1", "v2")
#Se extrae el valor de la lista por medio de pop
print (cliente.lpop("list:lista"))

#Se asigna el titulo a una pagina
cliente.hset("set:pagina", "titulo", "Blog de seraph")
#Se muestra todos los valores de pagina
print (cliente.hgetall("set:pagina"))

#SE agrega dos nombres a la variable usuario
cliente.sadd("set:usuarios", "ernesto", "nadir")
#Se muestra los usuarios
print (cliente.smembers("set:usuarios"))

#Se agrega unos valores a la variable programadores
cliente.zadd("sorted_set:programadores", 1969, "Linus Torvalds")
cliente.zadd("sorted_set:programadores", 1986, "Aaron Swartz")
#Se muestra el contenido de dicha variable
print (cliente.zrange("sorted_set:programadores", 0, -1, withscores=True))




Se construye la imagen para probar el código.

docker build -t redis-prueba .

A continuación una imagen de la ejecución y su resultado:

Ahora se ejecuta el contenedor enlazandolo con la ejecución de redis del artículo anterior:

docker run --link redis:db -i -t redis-prueba
Hola mundo!
['Hola mundo!', '9']
item1
{'titulo': 'Blog de seraph'}
set(['nadir', 'ernesto'])
[('Alan Turing', 1912.0), ('Alan Kay', 1940.0), ('Linus Torvalds', 1969.0), ('Aaron Swartz', 1986.0)]




Crear una imagen Docker de Redis


Redis es un motor de base de datos en memoria, basado en almacenamiento en tablas hash(clave/valor) (tomado de wikipedia).

En este artículo se construirá la imagen de Redis a partir de una imagen base de Debian, el artículo se basa en un artículo en inglés del sitio de Docker.

Para subir la imagen a docker hub se sigue el artículo de uso de docker en debian jessie parte 1.


Los artículos anteriores sobre Docker son:
  1. Instalar Docker en Debian Jessie
  2. Uso de Docker en Debian Jessie (parte 1)
  3. Uso de Docker en Debian Jessie (parte 2)
  4. Crear una imagen Docker a partir de un archivo Dockerfile
  5. Iniciando Django usando Docker
  6. Instalar Gitlab por medio de Docker
  7. Ejecutando microservicios con docker usando docker-compose
  8. Docker en Docker (DinD)
  9. Iniciando Django con docker usando docker-compose con postgresql como microservicio.
  10. Importar un contenedor Docker en Python.
  11. Compartir imagenes Docker por medio de archivos tar.
  12. Crear un registro de imagenes Docker privado.
  13. Usar Anaconda desde un contenedor Docker.
  14. Crear un entorno de Integración y Despligue continue con Docker para node.js.
  15. Usar Jupyter Notebook desde un contenedor Docker.
  16. Ejecutar una prueba de doctest con un contenedor Docker.
  17. Ejecutar una prueba de unittest en Python con un contenedor Docker.
  18. Montar una Plataforma como servicio (PaaS) con Dokku (docker).
  19. Uso de docker-machine.
  20. Proveer un cluster con docker swarm y docker-machine.
  21. Instalar Jenkins por medio de Docker y crear una imagen Docker de Jenkins
  22. Automatizar la construcción de imágenes Docker con github.
  23. Crear una imagen Docker para MongoDB3.
  24. Crear un contenedor Docker como entorno de desarrollo para Sails.js.
  25. Correr aplicaciones de escritorio desde un contenedor Docker.
  26. Usar dockerui para la gestión de imágenes y contenedores de Docker
  27. Crear una imagen Docker de RethinkDB
  28. Profiling de un script Python con cProfile
  29. Instalar gitlab-runner de gitlab-ci por medio de Docker
  30. Correr sonarqube desde un contenedor Docker

El archivo Dockerfile contendrá lo siguiente:

#Se usa debian como imagen base
FROM debian
#Se define el mantenedor de la imagen
MAINTAINER Ernesto Crespo <ecrespo@gmail.com>
#Se actualiza la lista de paquetes
RUN apt-get update
#Se instala redis-server y redis-tools
RUN apt-get install -y redis-server redis-tools 
#Se limpia la cache de paquetes deb
RUN apt-get clean

#Se expone el puerto 6379
EXPOSE      6379
#Inicio del servicio redis
ENTRYPOINT  ["/usr/bin/redis-server"]


Ahora se consruye la imagen (asociandolo a mi cuenta de docker hub):

docker build -t ecrespo/redis .

Se lista las imágenes: 
docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ecrespo/redis       latest              841b6e9266f8        3 minutes ago       136.9 MB
redis               latest              4465e4bcad80        4 weeks ago         185.7 MB
debian              latest              1b088884749b        5 weeks ago         125.1 MB



Correr el servicio ejecutando:

docker run --name redis -d --restart always -p 6379:6379 ecrespo/redis 


Al listar los procesos se tiene redis corriendo:
docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
0af1cdf134d7        ecrespo/redis       "/usr/bin/redis-serve"   9 seconds ago       Up 4 seconds        0.0.0.0:6379->6379/tcp   redis

Para probar redis se instala en el equipo redis-tools:

#apt-get install redis-tools

Desde la línea de comandos se ejecuta redis-cli, a continuación se muestra una figura del ejemplo: 




Se hace un commit con el contendor de redis que está corriendo:

docker commit 0af1cdf134d7 ecrespo/redis

Luego se sube a docker hub:

docker push   ecrespo/redis


Ahora se creará un contenedor para la aplicación, se enlazará el contenedor redis con el contenedor cliente: 

docker run --link redis:db -i -t debian /bin/bash

Dentro del contenedor se ejecuta los siguientes comandos:

apt-get update
apt-get install redis-tools
service redis-server stop

Como se enlazó el contenedor actual con el contenedor de redis, este contenedor contiene unas variables de ambiente, para visualizarlas se ejecuta el siguiente comando:

env | grep DB_
DB_NAME=/tiny_poincare/db
DB_PORT_6379_TCP_PORT=6379
DB_PORT=tcp://172.17.0.2:6379
DB_PORT_6379_TCP=tcp://172.17.0.2:6379
DB_PORT_6379_TCP_ADDR=172.17.0.2
DB_PORT_6379_TCP_PROTO=tcp


Para conectarse desde el contenedor que corre Debian al de redis se ejecuta:
redis-cli -h $DB_PORT_6379_TCP_ADDR
172.17.0.2:6379> set docker "Conectandose desde un contenedor debian al contenedor redis"
OK
172.17.0.2:6379> get docker
"Conectandose desde un contenedor debian al contenedor redis"
172.17.0.2:6379> 

A continuación se muestra una figura de la ejecución:



Y se lista los contenedores ejecutandose:


10 jul. 2016

Internet de las Cosas


Como lo explican en wikipedia, internet de las cosas es un concepto que se refiere a la interconexión de objetos cotidianos a la Internet.

Hace un tiempo me pidieron investigar sobre el tema e hice una presentación, al final como nunca tuve la oportunidad de dar una presentación formal del tema he decidido publicarla ya sin formato del sitio donde me pidieron dicha investigación.

La presentación la pueden ver en slideshare.

Y desde este artículo:


Internet de las cosas from Ernesto Crespo



Pueden ver este vídeo también:




O este otro vídeo que muestra un ejemplo del uso del internet de las cosas en las casas:



Y este último vídeo sobre ciudades inteligentes gracias a IoT:



Internet de las cosas para los cuidados de salud:




O está presentación de TEDx:

8 jul. 2016

Correr sonarqube desde un contenedor Docker

Continuando con los artículos de Docker, en este caso se muestra como iniciar SonarQube conectado a una base de datos PostgreSQL y pasando los datos de la base de datos por medio de variables de ambiente.

Sonarqube es una plataforma para evaluar código fuente (tomado de wikipedia).
Los artículos anteriores sobre Docker son:
  1. Instalar Docker en Debian Jessie
  2. Uso de Docker en Debian Jessie (parte 1)
  3. Uso de Docker en Debian Jessie (parte 2)
  4. Crear una imagen Docker a partir de un archivo Dockerfile
  5. Iniciando Django usando Docker
  6. Instalar Gitlab por medio de Docker
  7. Ejecutando microservicios con docker usando docker-compose
  8. Docker en Docker (DinD)
  9. Iniciando Django con docker usando docker-compose con postgresql como microservicio.
  10. Importar un contenedor Docker en Python.
  11. Compartir imagenes Docker por medio de archivos tar.
  12. Crear un registro de imagenes Docker privado.
  13. Usar Anaconda desde un contenedor Docker.
  14. Crear un entorno de Integración y Despligue continue con Docker para node.js.
  15. Usar Jupyter Notebook desde un contenedor Docker.
  16. Ejecutar una prueba de doctest con un contenedor Docker.
  17. Ejecutar una prueba de unittest en Python con un contenedor Docker.
  18. Montar una Plataforma como servicio (PaaS) con Dokku (docker).
  19. Uso de docker-machine.
  20. Proveer un cluster con docker swarm y docker-machine.
  21. Instalar Jenkins por medio de Docker y crear una imagen Docker de Jenkins
  22. Automatizar la construcción de imágenes Docker con github.
  23. Crear una imagen Docker para MongoDB3.
  24. Crear un contenedor Docker como entorno de desarrollo para Sails.js.
  25. Correr aplicaciones de escritorio desde un contenedor Docker.
  26. Usar dockerui para la gestión de imágenes y contenedores de Docker
  27. Crear una imagen Docker de RethinkDB
  28. Profiling de un script Python con cProfile
  29. Instalar gitlab-runner de gitlab-ci por medio de Docker
La guía de configuración y uso de  contenedores Docker para sonarqube lo pueden ver en el enalce de Docker hub.

Lo primero que se hará es iniciar un contenedor de postgreSQL:

docker run -d --name postgres2 --restart always  -e POSTGRES_PASSWORD=sonar -e POSTGRES_USER=sonar postgres


Se define que el usuario de la base de datos es sonar y su clave es sonar.


Ahora se inicia el contenedor de sonarqube:

docker run -d --name sonarqube --restart always -p 9000:9000 -p 9092:9092 -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL=jdbc:postgresql://postgres2/sonar --link postgres2:postgres sonarqube


Se le pasa los puertos donde estará sonarqube (9000 y 9092), se le pasa la configuración de la base de datos a sonarqube (usuario, clave y url de conexión que usará el nombre del contenedor de postgres) y se enlace con el contenedor de postgres.


A continuación se muestra una captura de pantalla del contenedor corriendo:


Para terminar se muestra los contenedores corriendo:

docker ps 
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                                          NAMES
e20d4108f54f        sonarqube                 "./bin/run.sh"           29 minutes ago      Up 29 minutes       0.0.0.0:9092->9092/tcp, 0.0.0.0:49000->9000/tcp                sonarqube
e3387c2754d1        postgres                  "/docker-entrypoint.s"   6 hours ago         Up 6 hours          5432/tcp                                                       postgres2



AddThis