Mit Docker lassen sich mehrere Dienste wie Mosquitto, Node-RED, Nginx oder Datenbanken schnell als eigene Container starten. Spannend wird es jedoch, sobald diese Container miteinander kommunizieren sollen.
Ein häufiger Fehler ist dabei, nur auf die IP-Adresse des Containers zu schauen. Unterschiedliche IP-Bereiche können zwar ein Hinweis auf unterschiedliche Docker-Netzwerke sein, entscheidend ist aber: In welchem Netzwerk hängt der Container wirklich?
Docker bringt standardmäßig das Netzwerk bridge mit. Wird ein Container ohne eigene Netzwerkangabe erstellt, landet er meist dort. Wird er später mit docker start erneut gestartet, bekommt er keine neue Netzwerkkonfiguration, sondern verwendet weiterhin die ursprüngliche.
Für einfache Tests kann das funktionieren. Für saubere Setups ist jedoch ein eigenes Docker-Netzwerk oder Docker Compose meist die bessere Lösung.
In diesem Beitrag zeige ich dir anhand von Node-RED und Mosquitto, wie du das Netzwerk deiner Container prüfst und sie sauber miteinander verbindest.
Ausgangslage: Zwei Container, aber unterschiedliche Netzwerke
In meinem Beispiel laufen zwei Dienste als Docker-Container. Zum einen Node-RED für die Automatisierung und Verarbeitung der Daten, zum anderen Mosquitto als MQTT-Broker.
Beide Container wurden erfolgreich gestartet und sind vom Host-System aus erreichbar. Node-RED lässt sich zum Beispiel über den Browser öffnen, und auch der Mosquitto-Broker läuft grundsätzlich. Auf den ersten Blick sieht also alles korrekt aus.
Beim Blick auf die internen Docker-IP-Adressen zeigt sich jedoch ein wichtiger Unterschied:
Mosquitto läuft in diesem Beispiel unter der IP-Adresse 172.19.0.2, während Node-RED die IP-Adresse 172.18.0.2 erhalten hat. Die unterschiedlichen IP-Bereiche sind ein deutlicher Hinweis darauf, dass beide Container nicht im selben Docker-Netzwerk hängen. Sicher prüfen lässt sich das jedoch erst über die tatsächliche Netzwerkzuordnung des Containers.
$ docker inspect -f '{{range $name, $network := .NetworkSettings.Networks}}{{println $name $network.IPAddress}}{{end}}' nodered
bridge 172.17.0.3
$ docker inspect -f '{{range $name, $network := .NetworkSettings.Networks}}{{println $name $network.IPAddress}}{{end}}' mosquitto
bridge 172.17.0.2
Genau hier liegt das Problem: Nur weil beide Container vom PC aus erreichbar sind, bedeutet das nicht automatisch, dass sie auch untereinander kommunizieren können.
Der Host-Rechner kann die Container über veröffentlichte Ports erreichen, zum Beispiel Node-RED über den Browser oder Mosquitto über den MQTT-Port. Die direkte Kommunikation zwischen zwei Containern läuft jedoch über das Docker-Netzwerk. Befinden sich die Container nicht im selben Netzwerk, kann Node-RED den Mosquitto-Broker nicht ohne Weiteres erreichen.
In meinem Fall war genau das die Ursache: Beide Dienste liefen korrekt, aber Node-RED konnte keine Verbindung zum Mosquitto-Broker aufbauen, weil beide Container in unterschiedlichen Docker-Netzwerken gestartet wurden.
Container-ID und Namen der Container ermitteln
Bevor die interne IP-Adresse eines Docker-Containers ausgelesen werden kann, muss zunächst bekannt sein, wie der Container heißt. Alternativ kann auch die Container-ID verwendet werden.
Damit die Ausgabe von Docker übersichtlich bleibt, kann man sich mit folgendem Befehl nur die Container-ID und den Namen anzeigen lassen:
docker ps --format "table {{.ID}}\t{{.Names}}"
Die Ausgabe sieht dann zum Beispiel so aus:
In diesem Beispiel heißt der Node-RED-Container nodered und der Mosquitto-Container mosquitto. Diese Namen können anschließend direkt für den docker inspect-Befehl verwendet werden.
Die IP-Adresse des Node-RED-Containers lässt sich zum Beispiel so auslesen:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nodered
Für den Mosquitto-Container entsprechend:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mosquitto
Alternativ kann statt des Containernamens auch die Container-ID verwendet werden. In der Praxis ist der Name jedoch meist deutlich lesbarer und einfacher zu merken.
Docker-Netzwerk erstellen
Damit sich die Container gegenseitig erreichen können, erstellen wir zuerst ein eigenes Docker-Netzwerk. In meinem Beispiel verwende ich den Namen iot-net.
Der Befehl dazu lautet:
docker network create iot-net
Damit legt Docker ein neues benutzerdefiniertes Netzwerk an. Der Name iot-net ist frei gewählt und kann natürlich angepasst werden.
Nach dem Erstellen müssen die gewünschten Container noch mit diesem Netzwerk verbunden werden.
Container mit dem Docker-Netzwerk verbinden
Nun verbinden wir beide Services mit dem zuvor erstellten Netzwerk iot-net. In meinem Beispiel heißen die Container nodered und mosquitto.
Dazu werden folgende Befehle ausgeführt:
docker network connect iot-net nodered
docker network connect iot-net mosquitto
Damit werden beide bereits laufenden Container zusätzlich mit dem Docker-Netzwerk iot-net verbunden.
Anschließend kann geprüft werden, ob beide Container wirklich im Netzwerk vorhanden sind:
docker network inspect iot-net --format '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{println}}{{end}}'
Die Ausgabe sieht in meinem Fall so aus:
mosquitto 172.21.0.3/16
nodered 172.21.0.2/16
Jetzt befinden sich beide Container im selben Docker-Netzwerk und können sich darüber gegenseitig erreichen. Wichtig ist dabei nicht mehr die direkte IP-Adresse, sondern der Containername. Node-RED kann Mosquitto nun also über den Namen mosquitto und den Port 1883 ansprechen.
Container wieder aus dem Docker-Netzwerk entfernen
Falls ein Container später nicht mehr Teil des Netzwerks sein soll, kann die Verbindung wieder getrennt werden. Der Container selbst wird dabei nicht gelöscht, sondern nur vom Netzwerk iot-net entfernt.
Für Node-RED:
docker network disconnect iot-net nodered
Für Mosquitto:
docker network disconnect iot-net mosquitto
Anschließend kann wieder geprüft werden, ob noch Container mit dem Netzwerk verbunden sind:
docker network inspect iot-net --format '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{println}}{{end}}'
Wenn keine Ausgabe mehr erscheint, sind keine Container mehr mit diesem Netzwerk verbunden.
Nun kann das Docker-Netzwerk vollständig gelöscht werden:
docker network rm iot-net
Wichtig: Ein Docker-Netzwerk kann nur gelöscht werden, wenn keine Container mehr damit verbunden sind. Falls Docker hier eine Fehlermeldung ausgibt, sollte zuerst geprüft werden, welche Container noch im Netzwerk hängen.
Docker Compose Variante
Wenn Node-RED und Mosquitto dauerhaft gemeinsam betrieben werden sollen, ist Docker Compose meist die bessere Lösung. Der große Vorteil: Das Netzwerk kann direkt in der docker-compose.yml definiert werden. Dadurch muss man die Container nicht nachträglich per docker network connect miteinander verbinden.
Ein einfaches Beispiel könnte so aussehen:
services:
mosquitto:
image: eclipse-mosquitto
container_name: mosquitto
ports:
- "1883:1883"
networks:
- iot-net
nodered:
image: nodered/node-red
container_name: nodered
ports:
- "1880:1880"
volumes:
- node_red_data:/data
networks:
- iot-net
volumes:
node_red_data:
networks:
iot-net:
name: iot-net
driver: bridge
Gestartet wird das Setup anschließend mit:
docker compose up -d
oder wenn du den Dateinamen angepasst hast:
docker compose -f docker-compose-nodered_mosquitto.yml up -d
Docker Compose erstellt nun automatisch das Netzwerk iot-net und verbindet beide Container damit. Dadurch befinden sich Node-RED und Mosquitto direkt im selben Docker-Netzwerk.
Innerhalb von Node-RED wird als MQTT-Broker dann nicht die IP-Adresse des Mosquitto-Containers eingetragen, sondern einfach der Servicename bzw. Containername: mosquitto
Der Port bleibt: 1883
Also lautet die Verbindung in Node-RED: mosquitto:1883
Der Vorteil dieser Lösung ist, dass Docker Compose das Netzwerk bei jedem Start automatisch korrekt einrichtet. Dadurch entfällt das manuelle Erstellen und Verbinden per docker network create und docker network connect.
Fazit
Wenn sich Docker-Container nicht gegenseitig erreichen, liegt die Ursache häufig nicht an der Anwendung selbst, sondern am verwendeten Docker-Netzwerk. Interne IP-Adressen wie 172.18.0.2 oder 172.19.0.2 wirken zwar auf den ersten Blick eindeutig, sind für die Kommunikation zwischen Containern aber oft nicht die beste Lösung.
Wichtiger ist, dass sich die betreffenden Container im selben Docker-Netzwerk befinden. Erst dann können sie sich zuverlässig untereinander erreichen – idealerweise über ihren Container- oder Servicenamen statt über eine feste IP-Adresse.
Für schnelle Tests lässt sich ein gemeinsames Netzwerk bequem per docker network create und docker network connect aufbauen. Wer mehrere Dienste dauerhaft betreibt, fährt mit Docker Compose meist noch besser, da sich Netzwerk, Container und Ports direkt in einer zentralen Datei definieren lassen.
Am Ende gilt also: Nicht die IP-Adresse ist entscheidend, sondern das richtige Docker-Netzwerk. Ist dieses sauber eingerichtet, funktioniert auch die Kommunikation zwischen den Containern zuverlässig.
Letzte Aktualisierung am: 18. Mai 2026










