Enviar mensajes a Azure IoT Hub desde Raspberry usando Node.js y Docker (parte I – instalación)

Resultado de imagen para docker raspberry nodejs

Hola de nuevo, hoy les traigo una serie de  guías de como configurar todo el ambiente necesario para desarrollar y crear contenedores de Docker dentro de una Raspberry y luego mandar mensajes a Azure IoT Hub en sus diferentes modalidades:

  1. Device-to-cloud
  2. Cloud-to-device 

Una vez que tengamos todo correctamente configurado, vamos a enviar mensajes “device-to-cloud” a Azure IoT Hub desde un contenedor y luego crearemos otro contenedor para recibir los mensajes que estamos enviando, esto con el fin de demostrar como podemos aprovechar las ventajas de Docker.

¿Por que Azure IoT Hub?

  1. Azure IoT Hub nos facilita la comunicación bidireccional entre nuestro dispositivo y la nube (device-to-cloud y cloud-to-device).
  2. Funciona con protocolos como HTTP, AMQP (Advanced Message Queuing Protocol) y transporte de telemetría MQ (MQTT, MQ Telemetry Transport).
  3. Administración de dispositivos.
  4. Permite comunicaciones seguras mediante credenciales de seguridad por dispositivo y control de acceso.
  5. Extensión con otros componentes de Azure.
  6. Mensajería a gran escala.

Pasos a realizar en esta guía

  1. Instalación de Docker
  2. Creación de aplicación de Nodejs
  3. Automatización de compilación de Docker con Dockerfile
  4. Compilar aplicación en Docker
  5. Ejecutar contenedor de Docker
  6. Probar aplicación en contenedor de Docker

Pre Requisitos

  1. Raspberry Pi2+
  2. Raspbian OS
  3. Conexión a Internet
Instalar Docker Engine
Para instalar Docker en nuestra RPi solo es necesario abrir la consola y luego ingresar el siguiente comando para proceder a la descarga e instalación de Docker:
curl -sSL https://get.docker.com | sh
Una vez instalado, verificamos que Docker se instaló correctamente:
$ sudo docker –v (obtener versión de Docker)
image

Crear aplicación simple de Node.js
Antes de almacenar la aplicación de Node.js en un contenedor, vamos a escribir nuestro package.json y una aplicación simple de Express para probar que el ambiente funciona correctamente.
Para dar orden a nuestro entorno, vamos a crear las siguientes carpetas en la ruta raíz:

$ sudo mkdir projects

$ cd projects

$ sudo mkdir azure-iothub-demo

$ cd azure-iothub-demo

Ahora creamos la aplicación de Express y package.json de nuestra app de Node.js:

package.json

{
   "name": "rpi-nodejs-azure-iothub",
   "version": "1.0.0",
   "description": "rpi-nodejs-azure-iothub-demo",
   "author": "<your user or email>",
   "main": "app.js",
   "scripts": {
     "start": "node app.js"
   },
   "dependencies": {
     "express": "^4.13.3"
   }
}


App.js

'use strict';
const express = require('express');
// Constants
const PORT = 8080;
// App
const app = express();
app.get('/', function (req, res) {
  res.send('Hello world\n');
});
app.listen(PORT);
console.log('Running on http://localhost:' + PORT);

image

Crear Dockerfile para aplicación de Node.js compatible con ARM

Para automatizar la compilación de nuestro contenedor y pasar los archivos de la app al contenedor, vamos a crear un archivo Dockerfile.

Nota: Raspberry utiliza arquitectura ARM, por lo tanto necesitamos un contenedor especial de Node.js para ARM y Linux.

Dockerfile

FROM robotany/raspberrypi-nodejs

# Create app directory RUN mkdir -p /usr/src/app WORKDIR /usr/src/app

# Install app dependencies COPY package.json /usr/src/app/ RUN npm install

# Bundle app source COPY . /usr/src/app

EXPOSE 8080 CMD [ "npm", "start" ]

El contenedor que me funcionó sin ningún problema fue: robotany/raspberrypi-nodejs, lo puedes buscar en: https://hub.docker.com

Creamos archivo .dockerignore en la misma ruta que nuestro Dockerfile para descartar las librerías de Node.js y los logs:

image

.dockerignore

image

Compilar contenedor de Docker

Para crear nuestro contenedor de Docker con la aplicación de Node.js, vamos a escribir el siguiente comando:

$ sudo docker build -t yourUser/rpi-nodejs-azure-iothub .

Al ejecutar el comando, se iniciará la tarea de compilación de nuestro contenedor.

Una vez que termine de compilar, vamos a comprobar que el contenedor fue creado correctamente:

$ sudo docker images

image

image

Ejecutar contenedor de Docker

Para ejecutar nuestro contenedor de Docker con la aplicación de Node.js, vamos a escribir el siguiente comando, haciendo  “forwarding” del puerto de Node.js (8080 –> 49160):

$ sudo docker run -p 49160:8080 -d yourUser/rpi-nodejs-azure-iothub

Al ejecutar el comando, se iniciará la tarea de ejecución de nuestro contenedor exponiendo el puerto 49160.

Una vez que termine de ejecutar, vamos a comprobar que el contenedor corre correctamente

$ sudo docker ps

image

image

Probar contenedor de Docker

Como ultimo paso vamos a probar que el contenedor funcione correctamente, recordemos que ahora nuestra aplicación se encuentra aislada en un contenedor y ahora responde al puerto 49160. Solo por demostración, vamos hacer una petición al puerto 8080 y veremos que no responde.

Abrimos el navegador y hacemos una petición a localhost:

image

image

Muchas felicidades!! lograste instalar Docker y correr Node.js en una Raspberry. Con esto hemos concluido la primera parte de esta serie de artículos (instalación de Docker con Node.js en Raspberry).

Como siguiente paso, vamos a mandar mensajes (device-to-cloud) desde nuestro contenedor Docker a Azure IoT Hub usando la librería para Node.js de Azure IoT Hub.


Siguientes pasos:


Saludos!

Comments

Popular posts from this blog

Configurar y desplegar una Web API en Azure App Service Environment

Despliegue de contenedores Docker a Azure Web Apps

Patrones de diseño para aplicaciones de alta disponibilidad en Azure - Resilient Applications (Parte I: Retry Policy)

Conectar .NET Web API con Azure API Management

Configurar trigger de Integración Continua en VSTS para ejecutar una tarea de compilación al subir cambios en Source Control