[How to] create a MQTT Docker container



  • I partially run my IoT implementation on docker. Today I was trying to test a mqtt broker inside docker. I always create my containers with permanent volumes and I maintain a separate folder for containers in my nas.

    I installed all kinds of containers and pointing the storage to their config folder like -v /mnt/docker-data/mqtt/config:/mosquitto/config always worked. But mosquitto didn't want to run using remote volumes. Always complains about not being able to access the config file:

    1565537402: Error: Unable to open config file /mosquitto/config/mosquitto.conf.
    

    It doesn't matter if you try to change the owner of the folders or even give rwx to anyone.
    After studying the project's dockerfile and folder structure I came to the conclusion that it's not prepared to be installed in one go, using persistent volumes (can be done in two execs). The project docker directions are not so clear and seem to be made for auto-consumption (like not providing a default configuration file)

    So I made a small snippet to properly install and do a minimal configuration for the mosquitto container, pasted below.

    Usage: # ./mqtt.sh /mnt/<thefolderwhereyoupersistdockervolumes>

    #!/bin/bash
    VOLUME="$1"
    
    # Only if persistent volumes/configuration doesn't exist >>>>>
    if [ ! -d "$VOLUME"/mqtt ]; then
      mkdir -p $VOLUME/mqtt/config $VOLUME/mqtt/data $VOLUME/mqtt/log
    
      curl https://raw.githubusercontent.com/eclipse/mosquitto/master/mosquitto.conf -o $VOLUME/mqtt/config/mosquitto.conf
      cat <<EOT >> $VOLUME/mqtt/config/mosquitto.conf
    
    persistence true
    persistence_location /mosquitto/data/
    log_dest file /mosquitto/log/mosquitto.log
    EOT
    
      chown -R 1883:1883 $VOLUME/mqtt
    fi
    
    docker run --name mqtt --restart=unless-stopped \
      -p 1883:1883 \
      -p 9001:9001 \
      -v $VOLUME/mqtt/config/mosquitto.conf:/mosquitto/config/mosquitto.conf:ro \
      -v $VOLUME/mqtt/data:/mosquitto/data \
      -v $VOLUME/mqtt/log:/mosquitto/log \
      -v /etc/localtime:/etc/localtime:ro \
      -d eclipse-mosquitto
    
    docker exec -it mqtt mosquitto_passwd -c /mosquitto/config/pwfile iot
    # Add to a shared network between iot containers. (Node-Red, InfluxDb...)
    docker network create iot
    docker network connect iot mqtt
    

    Notes: This snippet is stupid. It doesn't care what he gets as parameter, for example. So be smart when using it. And remember not adding the name of the container to the route. He always adds and assumes "mqtt"
    Sample parameter: /mnt/docker-data will create: /mnt/docker-data/mqtt so take into account if you already have that folder.


 

Suggested Topics

190
Online

8.7k
Users

9.5k
Topics

99.6k
Posts