Lokalen MQTT-Server mit Docker betreiben

MQTT ist ein Nachrichten-Protokoll, das insbesondere von IoT-Geräten genutzt wird. Im Prinzip funktioniert es so, dass einzelne Geräte Informationen an einen MQTT-Server, auch Broker genannt, senden und von dort beziehen können. Der MQTT-Broker verwaltet die Informationen und kann diese auch speichern und zu einem späteren Zeitpunkt zur Verfügung stellen, wenn ein Gerät beispielsweise vorübergehend keine Netzwerkverbindung hat.

Auf einem normalen Linux-System lässt sich der Open Source MQTT Broker Mosquitto in der Regel schon aus den Paketquellen installieren. Da das letzte Systemupdate allerdings Probleme mit dem MQTT Broker verursacht hatte, habe ich beschlossen, auf einen Docker-Container umzusteigen.

Vorbereitungen

Um einen Docker-Container nutzen zu können, muss natürlich Docker auf dem System installiert sein. Aufgrund der einfacheren Verwaltung verwende ich zudem docker-compose. Während dies bei macOS und Windows automatisch mit installiert wird, muss man es bei Linux selbst installieren. Nähere Informationen zur Installation von Docker und Docker Compose kann man im Artikel über die Einrichtung eines ZigBee-Moduls nachlesen.

Installation von MQTT mittels docker-compose

Da ein Docker-Container Dateien nicht dauerhaft speichert, sondern nur solange, wie er läuft, ist es sinnvoll, ein paar Verzeichnisse anzulegen, auf die der Container dauerhaft zugreifen kann, sodass beispielsweise durch ein Update des Containers nicht die gespeicherten Daten verloren gehen. Ich habe dafür im /opt-Verzeichnis Unterordner für meine Docker-Container angelegt.

Im Verzeichnis /opt/mosquitto/config speichere ich die mosquitto.conf-Datei ab, die meine Mosquitto-Konfiguration enthält. Außerdem habe ich hier auch meine Passwort-Datei abgespeichert, die die Mosquitto-Nutzer und deren Passwörter enthält.

In der Konfigurationsdatei mosquitto.conf habe ich die folgenden Einträge vorgenommen:

# When run as root, drop privileges to this user and its primary
# group.
# Set to root to stay as root, but this is not recommended.
# If run as a non-root user, this setting has no effect.
# Note that on Windows this has no effect and so mosquitto should
# be started by the user you wish it to run as.
user mosquitto

# Port to use for the default listener.
port 1883
listener 9001
protocol websockets

# Save persistent message data to disk (true/false).
# This saves information about all messages, including
# subscriptions, currently in-flight messages and retained
# messages.
# retained_persistence is a synonym for this option.
persistence true

# Location for persistent database. Must include trailing /
# Default is an empty string (current directory).
# Set to e.g. /var/lib/mosquitto/ if running as a proper service on Linux or
# similar.
persistence_location /mosquitto/data

# Boolean value that determines whether clients that connect
# without providing a username are allowed to connect. If set to
# false then a password file should be created (see the
# password_file option) to control authenticated client access.
#
# Defaults to true if no other security options are set. If `password_file` or
# `psk_file` is set, or if an authentication plugin is loaded which implements
# username/password or TLS-PSK checks, then `allow_anonymous` defaults to
# false.
#
allow_anonymous false

# See the TLS client require_certificate and use_identity_as_username options
# for alternative authentication options. If an auth_plugin is used as well as
# password_file, the auth_plugin check will be made first.
password_file /mosquitto/config/passwd

Als nächstes legt man eine docker-compose.yml-Datei an, die bei mir so aussieht:

version: "2"
services:
  mosquitto:
    image: eclipse-mosquitto
    container_name: mqtt
    network_mode: host
    restart: always
    volumes:
      - /opt/mosquitto/config:/mosquitto/config
      - /opt/mosquitto/data:/mosquitto/data
      - /opt/mosquitto/log:/mosquitto/log
    ports:
      - "1883:1883"
      - "9001:9001"

Anschließend lässt sich der Docker-Container mit dem folgenden Befehl starten:

$ docker-compose up -d

Beim ersten Aufruf wird zunächst der Docker-Container heruntergeladen, weshalb der Start eine Weile dauert.

Standardmäßig akzeptiert Mosquitto Verbindungen ohne Benutzernamen und Passwort. Um den Broker etwas abzusichern, vergeben wir beim ersten Mal einen Benutzernamen und ein Passwort, über das sich die Geräte mit dem Broker verbinden können. Da Mosquitto in einem Docker-Container läuft, kann man die Terminalbefehle hierzu jedoch nicht einfach so eingeben, sondern muss sie quasi an den Container weiterleiten. Der Befehl für das Anlegen eines neuen Nutzers (während der Container läuft) sieht dann beispielsweise so aus:

$ docker-compose exec mosquitto sh -c "mosquitto_passwd /mosquitto/config/passwd [username]"

Es folgt die Aufforderung, ein Passwort zu vergeben. Anschließend ist der neue Benutzer erfolgreich angelegt.

Nun ist der MQTT-Broker fertig eingerichtet und kann benutzt werden. Standardmäßig verwendet er den Port 1883.

Die folgenden Beiträge könnten Dich auch interessieren: