Mehrere Docker-Container mit Avahi-Daemons

669
Maciej Wilczyński

Ich versuche, ein Smart-Home-Raspberry Pi mit Docker einzurichten, um jedes Element des Systems zu isolieren. Zwei dieser Docker verwenden jedoch Avahi, um sich selbst im Heimnetzwerk zu senden - einer enthält Homebridge, der andere Shairport-Sync.

Nach langem Kampf habe ich es geschafft, Avahi an einem der folgenden Punkte arbeiten zu lassen: Host OS, Homebridge Container ODER (eigentlich Xor) Shairport Container. Wenn jedoch mehr als ein Dämon ausgeführt wird, funktioniert nur einer von ihnen (der erste wird gestartet). Die anderen führen eine endlose Schleife mit "Host-Namenskonflikt, Wiederholung mit HOSTNAME-n" durch, wobei n gegen unendlich geht.

Gibt es eine Möglichkeit, damit es funktioniert?

0

1 Antwort auf die Frage

0
ssice

Ihr Problem besteht darin, dass Sie versucht haben, zweimal denselben Host (dieselbe IP-Adresse) von verschiedenen Netzwerkschnittstellen aus anzukündigen.

Wenn der erste Container gestartet wird, meldet Avahi über mDNS Ihre Anwesenheit (z. B. "hostname.local. MDNS_IN A 192.168.0.10" und zugehörige _service._x.hostname.local SRV-Einstellungen).

Wenn der zweite Container gestartet wird, kündigt ein neuer Avahi über mDNS erneut seine Anwesenheit an. In diesem Fall wird sich der erste Avahi darüber beklagen, dass der Hostname / die IP-Adresse geleast wurde. Der zweite Avahi versucht dann einen anderen Hostnamen, falls es sich um eine Kollision mit einem Hostnamen handelt.

Es war jedoch keine Kollision mit einem Hostnamen, sondern eine IP-Kollision. Damit dies funktioniert, müssen für jeden Dienst unterschiedliche IP-Schnittstellen vorhanden sein. Weisen Sie dem Himbeer also auf verschiedenen virtuellen Schnittstellen von eth0 mehrere IP-Adressen zu, und binden Sie dann jede virtuelle Schnittstelle an einen anderen Container (und verwenden Sie für jeden Andockdienst unterschiedliche Hostnamen).

Damit dies möglich ist, müssen für Ihr Raspberry Pi mehrere IPs in Ihrem Subnetz verfügbar sein.

Wenn Sie nur die Schnittstellen zum Broadcasting der Dienste verwenden möchten (und nicht nach anderen mDNS-Diensten suchen), können Sie eine iptables-Regel hinzufügen, die den Multicast-Verkehr zwischen Ihren eigenen Schnittstellen verbietet.