himpler.com himpler.com

Traefik - Routing zu Containern mit Network Mode host

3 Min.

Dieser Beitrag wurde seit einem Jahr nicht mehr aktualisiert. Im Internet ist das manchmal eine halbe Ewigkeit. Es kann daher sein, dass die Informationen und Links nicht mehr aktuell sind.

Wie im letzten Beitrag schon gezeigt, nutze ich Traefik als Reverse Proxy für den externen Zugriff auf HomeAssistant. HomeAssistant lief dabei bis vor kurzem in einem von mehreren Docker-Containern in meinem Smart Home Stack im Bridge Modus. So kann mit wenig Konfiguration Docker als Service Provider in Traefik verwendet werden. Die Nutzung des Bridge Modus bringt jedoch auch Nachteile mit sich. Daher hier eine kleine Anleitung, wie man mit einer kleinen Änderung Traefik auch an HomeAssistant im Network Mode host routen lassen kann.

Network Mode in Docker

Zunächst als kleiner Reinholer: Ohne weitere Konfiguration wird ein Docker-Container im Network Mode bridge ausgeführt. Das führt dazu, dass Container innerhalb des Docker Netzwerks miteinander kommunizieren können, aber ansonsten isoliert sind. Die Kommunikation nach außen erfolgt über eine Brücke zum Netzwerk des Hosts.

Optional lässt sich der Container im Network Mode host starten. Dabei nutzt der Container dann nicht mehr das Docker-Netzwerk, sondern greift direkt auf die Netzwerkschnittstelle des Hosts zurück. Einfach umschrieben: Die Anwendung verhält sich so, als würde sie nativ auf dem Host laufen. Im Falle von HomeAssistant bringt das unter anderem diese Vorteile:

  • Das manuelle Portbinding entfällt.
  • Die Homekit Integration kann ohne die im letzten Post beschriebene Avahi Konfiguration genutzt werden.
  • Das Auto-Discovery Feature, welches neue Smarte Geräte im lokalen Netzwerk erkennt, funktioniert.
  • WakeOnLan von anderen Geräten im lokalen Netzwerk ist möglich.

Klingt erstmal gut, aber es gibt bekanntlich immer einen Haken ;) Traefik kann zwar auch dazu genutzt werden, um eingehenden Netzwerkverkehr direkt an auf dem Host laufende Dienste zu routen, allerdings kann man dann nicht mehr auf Docker als Service Provider zurückgreifen. Stattdessen wird der File Service Provider verwendet, der einen deutlich erhöhten Konfigurationsaufwand mit sich bringt. Und das wollten wir ja möglichst vermeiden.

Ein Feature Request zur Erweiterung des Docker Service Provides von Traefik ist bereits seit geraumer Zeit auf Github zu finden, eine Integration lässt aktuell aber noch auf sich warten. Wann und ob Container mit dem Network Mode host automatisch über den Docker Service Provider verwaltet werden können ist also unklar.

Zusätzlicher Host als Lösung

Es gibt aber bereits einen kleinen und sehr leicht umzusetzenden Workaround (Quelle), der uns den Weg über den File Service Provider und eine zusätzliche Konfigurationsdatei erspart. Dazu passen wir die docker-compose.yaml wie folgt an:

# docker-compose.yaml

homeassistant:
  container_name: homeassistant
  image: homeassistant/home-assistant:stable
  volumes:
    - ./volumes/homeassistant:/config
  environment:
    TZ: Europe/Berlin
  restart: unless-stopped
  network_mode: host
  labels:
    - "traefik.enable=true"
    - "traefik.http.routers.homeassistant.rule=Host(`ha.subdomain.duckdns.org`)"
    - "traefik.http.routers.homeassistant.entrypoints=websecure"
    - "traefik.http.routers.homeassistant.tls=true"
    - "traefik.http.routers.homeassistant.tls.certresolver=letsencrypt"
    - "traefik.http.services.homeassistant.loadbalancer.server.port=8123"

traefik:
  container_name: traefik
  image: traefik:v2.2
  restart: unless-stopped
  ports:
    - 80:80
    - 443:443
    - 8080:8080
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock:ro
    - ./volumes/traefik/traefik.yml:/etc/traefik/traefik.yml
    - ./volumes/traefik/acme.json:/acme.json
  extra_hosts:
    - host.docker.internal:172.17.0.1

Zunächst wird das Portbinding für HomeAssistant entfernt und der network_mode auf host gesetzt. Ebenso erhält der Container ein neues Label mit dem der Port für den Traefik Service definiert wird. Der Traefik Service in der compose Datei erhält einen neuen Eintrag extra_hosts mit Verweis auf das interne Docker Netzwerk.

Diese kleinen Anpassungen an der docker-compose.yaml führen letztlich dazu, dass Traefik über den Docker Service Provider automatisch eine Route erstellt. Nach einem Neustart von HomeAssistant und Traefik sollte unser Dashboard weiterhin die passende Route ausweisen und HomeAssistant über diese extern erreichbar sein. Gleichzeitig ist die Lovelace Oberfläche auch über http://<ip-adresse-des-hosts>:8123 erreichbar.

Das könnte dir auch gefallen