FHEM in einem Docker Container installieren

Bisher habe ich meinen Homeserver auf einem Rechner einfach so installiert. Bis vor kurzem dachte ich, das es eine super Idee ist das einfach so aufzusetzen. Nuja bis mein Rechner einmal abgeraucht ist und ich logischerweise kein Backup davon hatte. Es war schon etwas mühselig alles wieder zu installieren. Daher habe ich mir überlegt einen ganz anderen Ansatz zu fahren. Anstatt das wieder auf dem System selbst zu installieren, habe ich mir gedacht das ganze in einem Docker Container zu installieren.

Ich erspare jetzt eine Einführung in Docker, da dies zu genüge im Internet zu finden ist. Kurz um es ist ein Dienst der Prozesse kapseln kann, so dass man diesen Zustand immer wieder zurücksetzen bzw wiederherstellen kann.

Erstellen eines Containers

Ich habe mir docker Images angesehen, da ich weniger Erfahrungen damit habe, dachte ich mir schaue ich mir bestehende Docker Container an, die auch bereits FHEM isntallieren. So bin ich auf diesen hier gestoßen. Um also ein Docker -Image zu definieren, benötigt man ein sog. DOCKER-File.

Das DOCKERFILE

Das beinhaltet in der Regel alle Anweisungen, die man üblicherweise auch in der Shell durchführen würde. Ich habe aus dem Beispiel oben den Großteil übernommen und starte mit dem folgendem

 

Was wird hier nun definiert? Zuerst wird gesagt, das ich ein debian:jessie Image als Basis nehme. Anschließend werden Maintainer Informationen angegeben (ich), danach erfolgt schon das erste richtig Kommando “apt-get update” damit aktualisieren wir die Paketinformationen. Danach werden einige Pakete mit Hilfe von apt-get installiert. Man sieht schon schnell das die ganzen RUN – Kommandos quasi die Befehlszeilen Befehle ausführt. Daher würde ich mir ersparen es im Detail zu erklären. Im Prinzip werden benötigte Pakete installiert und die aktuelle Zeitzone gesetzt.

Dann erfolgt ein COPY befehl. Hier werden Dateien aus dem aktuellen ROOT Verzeichnis in dem Docker Image hineinkopiert. Somit kopiere ich eine .conf hinein, die später für den Start Der Rest der Datei enthält folgendes:

Hier kopiere ich meine aktuellen FEHM Daten (Web Frontend und .config-Datei) hin das /opt/fhem Verzeichnis des Images, des Weiteren wird die Berechtigung so gesetzt, das jeder lesen darf. Um später auch den Zugriff auf das System zu erhalten wird auch der Port bekannt gegeben unter dem man das Web Frontend später erreichen will. Somit Port 8080. Wichtig ist der letzte CMD Eintrag. Dieser Befehl wird ausgeführt sobald das Image gestartet wird. Ich verwende supervisord, um fhem zu starten und dieser als daemon immer neu gestartet wird. Abgespeichert wird die Datei bei mit mit Namen “DOCKERFILE”.

Container Image “bauen”

Die Datei alleine bewirkt nicht, das ein Image erstellt wird, es definiert nur wie es erstellt werden soll. Um nun ein Image zu erstellen reicht es aus folgenden Befehl im gleichen Verzeichnis auszuführen in dem die Datei DOCKERFILE existiert:

In der Ausgabe sieht man wie die Befehle ausgeführt, und welche ausgaben diese Produzieren. Am Schluss steht dann folgendes:

Die hervorgehobene Buchstaben und Zahlenkombination ist dann die ID des Images. Dies war im prinzip schon alles. Nun kann jeder eigentlich selbst schon individuell die Befehle modifizieren wie jeder es will. Nur fehlt noch eines, der Test!

Testen des erstellen Images

Nun was nützt das beste Image wenn man nicht weis, ob es funktioniert. Ich habe immer folgenden Befehl verwendet um es im “interaktiven” Modus zu testen:

Hiermit gebe ich mit -it an, das der Container im Interaktiven Modus gestartet werden soll. Mit -p wird gesagt das der Port 8080 auf Port 8080 gebunden werden soll. Will man das Webinterface über Port 80 ansprechen muss das mit -p 80:8080 angegeben werden.  Nun habe ich nicht die komplette ID angegeben, das ist auch nicht notwendig. Docker schaut selbst nach welche ID zu der angegebenen passt. Ist keine eindeutige gefunden, so wird das auch sofort mitgeteilt, in dem Fall reicht es aus einfach einen Wert mehr anzugeben.

Nun ist der Container gestartet. Jedoch wenn der Prozess beendet ist, dann endet auch der Lebenzyklus des Containers. Damit dieser auch unabhängig läuft ist es möglich die Container im Deamon Modus zu starten:

Nach der Eingabe diesen Befehls startet das Image innerhalb weniger Sekunden und es ist nun alles im Container installiert. Es wird dann eine sehr lange ID ausgegeben, diese wird wichtig beim hochladen des Containser im Dockerhub.

Upload auf Docker Hub

Ich habe mir auch gedacht, das ich alles in meinem Github repo hochlade, jedoch ist das damit verbunden, das ich immer wieder das Image neu bauen müsste. Statdessen bietet docker die Möglichkeit fertige Images online zu speichern und bei Bedarf abzurufen. Für mich ist das Ideal, da ich damit am wenigsten Arbeit habe, um mein System wieder neu aufzusetzen. Die folgenden Aktionen können erst durchgeführt werden, wenn man bei docker hub einen Account besitzt.

Zuerst muss man sich auf der Commandozeile bei docker einloggen:

Anschließend wird man nach den Benutzernamen, dem Passwort und der E-Mail Adresse gefragt. Nach erfolgreichem Login kann dann einmal das lokale Image label (tagen).

Mit dem Befehl “docker tag” wird gesagt das, das image mit “e704….” auf der registry beejay/fhem hochgeladen werden soll. Bisher passiert noch nichts, es wird nur lokal als aktuelle Version bezeichnet.

Danach kann nun das Image auf dem Repo hochgeladen werden:

Nun wird alles was erstellt wurde hochgeladen, das kann je nach große dauern. Nachdem alles erfolgreich hochgeladen wurde ist es dann mit

jederzeit abgerufen werden.

Ich habe diesen Artikel eigentlich angefangen um mir noch mal in Erinnerung zu rufen, wie man ein Docker Image für FHEM erstellt. Jedoch finde ich das ich das auch mal öffentlich bekannt machen kann. Für Anregungen und Kritik bin ich offen.