En el capítulo anterior utilizamos la imagen "hello-world", ahora vamos a crear nuestra propia imagen. Vamos a convertir nuestro clientemqtt a imagen de docker. Las instrucciones para crear la imagen se especifican en un archivo Dockerfile.
En la primer línea indicamos que nuestra imagen estará basada en una imagen existente de python.
Luego definimos el directorio en el cual estará nuestra aplicación dentro de la imagen.
Copiamos e instalamos los requerimientos de librerías.
Copiamos nuestra aplicación y finalmente definimos cual es el comando para ejecutar la misma.
$ git clone https://github.com/GermanXander/docker_iot.git
# branch 3a
Una vez que tenemos el archivo Dockerfile construimos la imagen
~/docker_iot/clienteMqtt $ docker build -t clientemqtt .
La opción -t es para indicar un tag o nombre de la imagen. El punto final es para indicar que el archivo Dockerfile se encuentra en directorio actual.
Ahora ejecutamos (creamos el contenedor) docker run
~/docker_iot/clienteMqtt $ docker run --rm --name cliente_mqtt clientemqtt
--rm para que elimine el contenedor cuando salimos
"cliente_mqtt" es el nombre del contenedor basado en la imagen "clientemqtt"
podemos observar que hay un error en la zona horaria. Esto lo vamos a solucionar con variables de entorno pasadas al contenedor (ENV).
Uso de Variables de entorno
En Dockerfile ahora hay una línea que le pasa la variable de entorno al sistema operativo dentro de la imagen. En este caso sobreescribimos la información de zona horaria del sistema.
ENV TZ="America/Argentina/Buenos_Aires"
Ya no obtenemos la dirección del servidor y el tópico, al cual suscribirse, desde un archivo .env sino que los tomamos de las variables de entorno, llamada SERVIDOR y TOPICO, del sistema operativo. Estas variables de entorno todavía no existe al momento de construir la imagen, se las debemos pasar al momento de ejecutar (crear el contenedor). Esto se hace con el parámetro -e "variable=valor".
~/docker_iot/clienteMqtt $ docker run -e SERVIDOR=iotunam.duckdns.org -e TOPICO=temperatura --rm --name cliente_mqtt clientemqtt
Si nuestro cliente recibe publicaciones vía mqtt quiere decir que pudimos pasar la información sobre nuestro broker. Ahora también muestra la hora/zona horaria correcta.
Contenedores en segundo plano
Si le agregamos el parámetro -d (detach) el contenedor se ejecuta en segundo plano y recuperamos el control del terminal.
Podemos ver todos los procesos de docker (contenedores) con el comando docker ps.
Para ver los registros usamos docker logs <contenedor> .
y para ver los registros en tiempo real:
~/docker_iot/clienteMqtt $ docker logs -f --tail 20 cliente_mqtt
en este caso muestro los últimos 20 registros
También podemos acceder a la consola del contenedor
$ docker exec -it cliente_mqtt /bin/bash