Docker
Docker
22/11/2019
Homeautomation
IOT

# Docker

Ich denke ich brauche nicht all zu viel über Docker berichten. Denn das Netz ist vvoll davon, warum als nochmal das Thema durchkauen? Kommen wir zum wesentlichen 😉.

# Das Problem

Mein Problem war, das ich eine alte Ubuntu Version besaß. Diese wurde mir bei meinem VDR (opens new window) beigelegt. Ich habe speziell easyvdr verwendet, da ich hier wenig Aufwand bei viel Nutze hatte.

Dies ganze ist schon eine Weil her, damals gab es Docker nicht so wie heute und es wurde alles im Haupt-/ Hostsystem installiert. Das ist aber schon gut 10 Jahre her. Ja... 10 Jahre... lief das Gerät Pausenlos... bis Heute.

Nach 10 Jahren, dachte ich mir "Mach ich mal ein Update" und es kommt, wie es kommen muss. Es klappt nicht wie es sollte, nach einer Neuinstallation war alles super... neue Ubunut Version... alles fix eingerichtet und dann am richtigen Platz, alles angeschlossen und schon ging der Rechner nicht mehr an.

Ich also bei Ebay Kleinanzeigen einfach mal ein günstigen Minipc rausgesucht, denn für meine Heimautomatisierung musste ich folgende Programme nur laufen haben:

  • FHEM
  • IoBroker
  • Mosquitto

Nun bei Ebay habe ich dann eine Winbox DC100 von MSI gewählt.

Winbox DC 100

Diese hat 4 GB Hauptspeicher ne kleine Festplatte und vom Prozessor (i3 reicht das allemal aus.

Nun gut die Hardware ist gekauft, dass Ziel gesteckt. Es kann losgehen

# Einrichtung

Ich habe die Grundlage mit der neuen Ubuntu Bionic Weaver (opens new window) Version gelegt. Dies ist aktuell und sollte auch das untersützen was ich benötige. Eine detaillierte Installation muss ich denke ich nicht aufzeigen, weil das bei ubuntu schon sehr gut beschrieben ist.

# Installation Docker

Als nächstes installiere ich Docker, denn ich will los von der Hostinstallation und mich hin zu Docker bewegen. Damit kann ich auch einmal etwas experimentieren, ohne etwas kaputt zu machen.

Dazu reicht es aus die foelgneden Befehl also Root User auszuführen.

  1. Einmal die notwendigen Pakete installieren:

apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

  1. Das Zertifikat für den Source Sever einrichten

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

  1. Das Repo in den Sourcelisten hinzufügen

add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs) \n stable"

  1. Nun noch einmal die Paketlisten aktualisieren

apt-get update

  1. Docker installieren

apt-get install docker-ce docker-ce-cli containerd.io

Anschließend ist Docker komplett installiert und kann somit auch verwendet werden. Nun starten wir mit der Einrichtung, denn von einer Installation kann man jetzt nicht mehr sprechen denn es werden ja fertige Abbilder "kopiert" und verwendet. Klasse! 😃

# Vorbereitungn

Je stopp! Bevor ich nun alles Zeige wie ich das Containergeraffel aufgebaut habe, wollte ich noch etwas loswerden... 😉 Mir war aufgefallen, dass die Container auch eine unterhalten müssen. Beispielsweise muss ioBroker mit Fhem Kommunizieren. Damit das passieren kann, muss ein Netzwerk in der Containerstruktur erstellt werden. Soweit ich das verstehe ist das ein Virutelles Netz, in dem dann die Container eingehangen werden können.

Ich habe ein Netzwerk mit den Namen homeautomation mit folgendem Befehl erstellt

docker network create homeautomation

Dies ist die simpelste Form des Netzwerks, das kann noch viel mehr. Was alles möglich ist steht hier (opens new window) weiter beschrieben.

# Installation FHEM

Jeder fragt sich was Fhem ist. Fehm ist eine auf Perl basierte Umgebung, die mit den gängisten Heimautomatisierungs Geräten sprechen kann. Natprlich brauch man dazu entsprechende Hardware wie ein CUL Stick von Busware (opens new window) oder ein Jeelink Interface (opens new window).

Das kann ich, wenn der Bedarf besteht, auch gern weiter erläutern, hier soll es aber Grundsätzlich nur um die Einrichtung der Software gehen.

# Erstellung eines Containers

Ich habe rausgefunden, das für FHEM auch schon ein Docker Image (opens new window) existiert. Das verwende ich einmal. Dazu habe ich nach etwas bastelei folgenden Befehl erstellt

docker run -d -e HOST_HOSTANME='FHEM' --device=/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AI04PIH9-if00-port0 --device=/dev/serial/by-id/usb-busware.de_CUL433-if00 --device=/dev/serial/by-id/usb-busware.de_CUL868-if00 --name fhem -p 8083:8083 -p 7072:7072 -v /docker/fhem:/opt/fhem fhem/fhem --net homeautomation

Was bedeutet das nun?

Wert Eigenschaft
-e HOST_HOSTNAME='FHEM' Dies definiert den Hostname des Images
--device=/dev...../ Dies sagt dem Image, das es das Gerät vom HostSystem in den Conainer verbinden soll. Damit FHEM auf die Hardware zugreifen kann.
--name fhem Dies ist der Name des Containers, der erstellt werden soll.
-p 8083:8083 Das Fehm Webfrontend habe ich auf den Port 8083 gestellt, dieser Port muss somit auch freigegeben werden, so dass auch von außen auch darauf zugreifen kann.
-v /docker/fhem:/opt/fhem Damit beim Neustarten eines Containers nicht immer die kompletten Einstellungen erneut durchgeführt werden müssen. Ist das Verzeichniss, in dem die Einstellungen abgespeichtert sind, nach außen hin gemapped. So dass man diese Daten wegsichert.
-net homeautomation Die ist das Netzwerk, in dem sich die Container befinden werden.

Fhem ist nun nach absetzen des Befehls einsatzbereit und duch die Option -d ist dies auch im Hintergrund gestartet.

# Konfiguration

Nun FHEM kann verwendet werden, ich habe noch eine Konfiguration aus meinem Altsystem. Damit ich das nicht alles händisch übertragen muss, werde ich die Konfiguration in dem Konfigurationsverzeichnis einfügen und FHEM neustarten.

Somit habe ich die Inhalte in /docker/fhem/fhem.cfg mit denen aus meiner gesicherten Überschrieben. Ein Neustart des Images habe ich dann wie folgt erledigt

  1. Container Stoppen / Killen (Frag mich warum es den Stop Befehl gibt 😉 )

docker kill fhem

  1. Entfernen des Containser

docker rm fhem

  1. Starten des Containers

docker run -d -e HOST_HOSTANME='FHEM' --device=/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AI04PIH9-if00-port0 --device=/dev/serial/by-id/usb-busware.de_CUL433-if00 --device=/dev/serial/by-id/usb-busware.de_CUL868-if00 --name fhem -p 8083:8083 -p 7072:7072 -v /docker/fhem:/opt/fhem fhem/fhem --net homeautomation

Läuft!

FHEM

# Installation ioBroker

Fhem hat lange für mich vieles automatisiert. Jedoch ist die Syntax teilweise komplex und ehrich gesagt wurde vieles in einer Datei geschrieben und die Module (Perl) waren auch nicht so dolle.

Daher habe ich nach Alternativen gesucht, heraus kamen einige Systeme wie NodeRed usw. Jedoch habe ich gesehen das ioBroker mittlerweile eine sehr große Comunity besitzt. Somit habe ich angefangen das einzusetzen. Da es auf eine Bustechnologie arbeitet war das Thema für mich auch interessant geworden, da hier auch andere Szenarien möglich waren, als nur das einschalten eines Lichts.

Ab einsatz dessen, habe ich auch viel mehr Sensoren im Einsatz, neben fertig gekauften auch mal selbst gebauten Sensoren. Zuerst kommt aber erst mal die Einrichtung.

# Container Erstellung

Hier gibt es auch ein fertiges Image für ioBroker (opens new window). Dieses hat aber div. Einstellungen. Ich habe mich aber dafür entschlossen nur ein Standart zu betreiben. Die zusätzlichen Module halten sich dabei in grenzen.

Folgender Befehl ist dabei herausgekommen

docker run -d -e HOST_HOSTANME='IOBROKER' --name=iobroker -p 1880:1880 -p 1887:1887 -p 8081:8081 -p 8082:8082 --restart=always -e PUID=1000 -e PGID=996 -e TZ=Europe/Berlin -v /docker/iobroker:/opt/iobroker/ buanet/iobroker:latest --net homeautomation

Viele Einstellungen sind wie oben auch definiert, nur das hier mehr Umgebungsvariablen eingestellt werden:

Wert Erläuterung
-e PUID=1000 Dies ist die BenutzerID für die Benutzergruppe aus dem Root systen. Das ist wichtig wenn ein interne Prozess auf die externen Resourcen zugreifen will (sofern freigegeben)
-e PGID=996 Dies ist die GruppenID für die Benutzergruppe aus dem Root systen. Das ist wichtig wenn ein interne Prozess auf die externen Resourcen zugreifen will (sofern freigegeben)
-e TZ=Europe/Berlin Die Zeitzone für Deutschland.

Die Konfigurationen werden hier auch ebenfalls außerhalb des Containers abgelegt. Somit im verzeichsni /docker/iobroker. Beim Start des Containers erstellt das Startup Skript automatisch die Grundinstallation und setzt somit ein Minimalsetz in das Verzeichnis. Der Start dauert etwas (bei mir ca 5 minuten), danach ist das Frontend über http://server:8081 erreichbar.

# Konfiguration

Auch hier habe ich noch vom Ursprungssytem mithile des Befehls

iobroker backup

Eine Backupdatei erstellt, dies macht nichts anderes, als das gesammte Verzeichnis (welches sich bei mir aktuell unter /docker/iobroker befindet) in ein Archiv zu komprimieren.

Dieses habe ich somit im neuen System rüberkopiert, und die Inhalte in das Zielverzeichnis /docker/iobroker extrahiert. Anschließend habe ich iobroker noch mal neu gestartet mit folgenden Befehlen

  1. Container Stoppen / Killen

docker kill iobroker

  1. Entfernen des Containers

docker rm iobroker

  1. Starten des Containers

docker run -d -e HOST_HOSTANME='IOBROKER' --name=iobroker -p 1880:1880 -p 1887:1887 -p 8081:8081 -p 8082:8082 --restart=always -e PUID=1000 -e PGID=996 -e TZ=Europe/Berlin -v /docker/iobroker:/opt/iobroker/ buanet/iobroker:latest --net homeautomation

Nun läuft auch das schon mal 👍.

iobroker

Jedoch kann es FHEM nicht auffinden? Warum? iobroker Fhem

Ach ja stimmt, FHEM läuft nicht auf einen Hostsystem, es läuft in einem Container, der eine eigene IP-Adresse besitzt. Diese muss ich nun in iobroker eintragen.

# FHEM Anbinden

Ich muss zuerst einmal rausfinden, welche IP der Container besitzt. Dazu kann ich mit docker inspect fhem alles abfragen.

In meinem Fall war das die IP 172.20.0.3

IP-Adresse

Diese habe ich dann in der Konfiguration der FHEM Instanz eingegeben. Und anschließend hat sich iobroker dann auch direkt verbunden. Hurra! 🎉

Fehm Konfiguriert Nun kann ioBroker auch mit FHEM kommunizieren und Befehle absetzen. FHEM kann hingegen dirket mit den Geräten sprechen, wie wir uns erinnern haben wir auch Geräte gemapped, auf die FHEM zugreifen will.

# Mosquitto

ioBroker bringt einen MQTT Dienst mit, jedoch ist dieser etwas beschrnkt in der Anwendung. Es kann nur Nachrichten empfangen und jemand anderes kann es auslesen. Quais nur eine Queue.

Moswuitto bringt dort den Topic Ansatz mit. Das bedeutet das eine eingehende Nachricht gleichzeitig an mehrere Empfänger gehen kann.

# Erstellung eines Containers

Na hier gibt es auch wieder nen fertiges docker Image (opens new window). Dieses liefert das komplette Set mit, welches den Broker und dessen Konfiguration anlegt. Auch hier gilt es, dass ich die Konfiguation nicht immer wieder neu erstellen mag, daher wird das Verzeichnis mit der Konfiguration wieder auf dem Host-System gemappt.

Folgender Befehl kam somit dabei heraus:

docker run -d -e HOST_HOSTANME='MOSQUITTO' -p 1883:1883 -p 1886:1886 -v /docker/mosquitto:/mosquitto/ eclipse-mosquitto --net homeautomation

Ich werde hier die Tabelle sein lassen, da hier auch nicht viele neuigkeiten auftreten. Grundsätzlich wird nur das /docker/mosquitto Verzeichnis zugewiesen. Ebenso der Port 1883 und 1886 nach außen freigegeben und dem Netzwerk homeautomation angefügt.

Eine konfiguratin habe ich erst mal nicht direkt vorgenommen, weil der Broker schon auf dem richtigen Port liegt und somit auch dann sofort Einsatzbereit ist.

# Fazit

Ich hatte erst leichte Befürchtungen gehabt was docker mit iobroker angeht. Auch die Unterstützung der Hardware Peripherie mit FHEM, doch das hat sich eifnach in Luft aufgelöst. Mir ist klar geworden das Docker sehr mächtig ist. Auch die Kommunikation unter den Containern ist problemlos verlaufen, somit kann alles miteinander reden und es verhält sich so. Ist wie im Hostsystem nur gekapselt in Container und kann immer von außen aktualisiert werden. Wenn etwas nicht klappt, dann wird die Version zurückgedreht.

Des Weiteren ist es mir auch möglich eine Skalierung forzunehmen mit Kubernetes, wenn ich das will. Aber naja, für den Heimgebrauch ist das nicht notwendig.

👋 Hi ich bin's, Sascha