Mqtt Mosquitto con Docker

Implementación de servicio Mqtt con Docker

El protocolo MQTT se utiliza para transmitir información entre dispositivos, básicamente consiste en crear y subscribirse a colas de mensajes.

Se requiere un archivo de configuración (mosquitto.conf) para definir los parámetros básicos y un archivo vacio para almacenar los usuarios y claves de acceso (password.txt):

mkdir config

touch config/mosquitto.conf
touch config/password.txt

touch docker-compose.yml

mosquitto.conf

persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
listener 1883

## Authentication ##
allow_anonymous false
password_file /mosquitto/config/password.txt

docker-compose.yml

version: '3'

services:
  mqtt:
    container_name: mqtt
    image: eclipse-mosquitto:2.0
    restart: unless-stopped
    volumes:
      - ./config:/mosquitto/config
      - ./data:/mosquitto/data
      - ./log:/mosquitto/log
    ports:
      - 1883:1883
      - 9001:9001

Ejecutar servicio mqtt y verificar estado de la instancia:

docker-compose up -d
docker-compose ps

Acceder a contenedor mqtt y crear un usuario y clave para temas de acceso y autenticación (reemplazar username por nombre de usuario)

docker exec -it mqtt sh

/# mosquitto_passwd -c /mosquitto/config/password.txt username

Reiniciar contenedor mqtt (por alguna razón no funciona si no se reinicia antes..) y abrir puerto tcp 1883 del firewall local (en mi caso fedora linux 34)

docker-compose restart

sudo firewall-cmd --permanent --zone=public --add-port=1883/tcp
sudo firewall-cmd --reload

Instalar contenedor docker con cliente mqtt:

docker pull efrecon/mqtt-client

Subscripción a topic 'test/device' de instancia docker mqtt (en mi caso 172.25.0.2), con usuario 'lab' y clave '12345':

docker run -it --rm efrecon/mqtt-client sub \
        -h 172.25.0.2 \
        -p 1883 \
        -t "test/device" \
        -u lab -P 12345 \
        -v

Publicar mensaje con formato json a topic 'test/device' en instancia docker mqtt (en mi caso 172.25.0.2), con usuario 'lab' y clave '12345', mas feedback de resultados (-d):

docker run -it --rm efrecon/mqtt-client pub \
        -h 172.25.0.2 \
        -p 1883 \
        -t "test/device" \
        -m '[{"json":"validated","data":42},{"to":2,"test":"with"}]' \
        -u lab -P 12345 -d

Subscripción a todos los topic '#' de instancia docker mqtt (en mi caso 172.25.0.2), con usuario 'lab' y clave '12345':

docker run -it --rm efrecon/mqtt-client sub \
        -h 172.25.0.2 \
        -p 1883 \
        -t "#" \
        -u lab -P 12345 \
        -v



¿Tienes alguna consulta?
Puedes contactarme enviándome un mensaje desde aquí.