In diesem Beitrag lernst du alle Grundlagen der Containerization mit Docker auf dem Raspberry Pi.
Bei Docker handelt es sich um eine noch recht neue Visualisierungstechnologie, die bei vielen großen Unternehmen mittlerweile zum Einsatz kommt. Ich möchte dir in dieser Serie zunächst die Grundlagen von Docker erklären, wie du einfache Anwendungen wie z.B. Heimdall installierst und später dann einen DNS-Filter wie Pi-hole oder AdGuard einrichtest, einen eigenen VPN-Tunnel mit wireguard aufbaust und/oder einen eigenen lokalen GitHub-Klon Gogs und Jira-Alternative Redmine einrichtest. Dadurch lernst du Stück für Stück Docker und seine Eigenarten, sowie Portainer zur Administration von Docker kennen.
- Die Hardware für diesem Blog
- Was unterscheidet Docker von einer virtuellen Maschine
- Kurze Einführung in die Begriffe / Docker Raspberry Pi
- Docker auf dem Raspberry Pi installieren
- Portainer zur Dockerverwaltung
- Die Portainer-Oberfläche für Docker auf dem Raspberry Pi
- Das Applikations-Dashboard Heimdall
- Kurzeinführung in Heimdall
- Zusammenfassung
Die Hardware für diesem Blog
Vom Prinzip kannst du jeden Raspberry Pi nehmen. Solltest du noch keinen Raspberry Pi besitzen, dann schau dir einmal den Raspberry Pi 400 als Kit an und bestelle auch gleich einen ausreichend großen USB-Stick dazu. Es sollte aber zumindest ein Raspberry Pi 3, besser noch ein 4er mit mindestens 4GB RAM sein.
WARENKORBWas unterscheidet Docker von einer virtuellen Maschine
Wenn man etwas über Docker liest, kommt man schnell an den Punkt, wo der Vergleiche zu virtuellen Maschinen aufgezeigt wird. Vom Prinzip verfolgen beide ein ähnliches Prinzip, eine Anwendung möglichst isoliert bereitzustellen.
Als erstes möchte ich dir zeigen, wie sich eine virtuelle Maschine von Docker in ihrer Architektur im Wesentlichen unterscheidet, siehe Abbildung 1.
Das Prinzip der virtuellen Maschine liegt darin, dass Software einen kompletten PC, mit all seiner Hardware emuliert. Die Applikation läuft auf dem Betriebssystem der virtuellen Maschine und ist über diese erreichbar. Problem dabei ist, dass eine virtuelle Maschine enorm hardwarehungrig ist. Meist werden zur Bereitstellung von virtuellen Maschinen, kurz VMs, Serverracks eingesetzt, die in Ihrer Hardware skalierbar sind.
Docker arbeitet da ein bisschen anders. Docker stellt Applikationen in einem Container bzw. durch das Image bereit, welches nur die nötigen Bibliotheken und Programme zur Nutzung der Applikation enthält. Man spricht hier auch von Microservice-Architecture. Dadurch sind die Images extrem klein im Vergleich zu VMs und das Starten, Stoppen und Neustarten der Applikation geht schneller als bei einer VM. Nachteil ist aber, dass Docker den Kernel vom Hostsystem nutzt, was eine VM wiederum nicht macht. Wird also ein Docker-System kompromittiert, können alle Docker-Container kompromittiert werden. Durch die Docker-Images ist es ohne große Probleme möglich, eine Applikation auf jedem beliebigen System auszuführen, was bei einer VM meist schwieriger ist.
Die Frage, wo Docker und eine VM läuft ist schnell geklärt. Ein Docker oder ein VM kann im Prinzip auf jedem System laufen. Gerade bei einer VM ist aber Power gefragt, weswegen auf einem Raspberry Pi eine VM nicht laufen wird. Docker hingegen läuft auf einem Raspberry Pi, jedoch sollte man sich die Frage stellen, ob es klug ist für z.B. ein Produktivsystem Docker tatsächlich einsetzen zu wollen. Privat nutze ich Docker in Kombination mit diversen Applikationen, jedoch gibt es viele Images, die nicht auf den Raspberry Pi ausgelegt sind. Dazu später mehr.
Die Frage, ob man nun lieber Docker oder eine VM nutzen sollte, liegt ganz im Anwendungsbereich! Generell kann Docker eine VM nicht ersetzen und umgekehrt.
Kurze Einführung in die Begriffe / Docker Raspberry Pi
Wenn du mit dem Thema Docker anfängst, wirst du wahrscheinlich schnell mit Begriffen wie Docker-Container, Docker-Image, Docker-Volumen, Bind und vielen mehr konfrontiert. Ich möchte dir an dieser Stelle den Einstieg einfach machen und die wichtigsten Grundbegriffe schon einmal vorab erklären. Wen es ins Detail geht, werde ich das in diesem und allen weiteren Blogabschnitten erklären.
Was ist ein Docker? Streng genommen ist Docker, wie du es ja schon gelesen hast, eine Methode, um eine Applikation zu virtualisieren. Damit das funktioniert, brauchst du ein sogenannten Docker-Container, welcher wiederum aus einem Docker-Image erzeugt wird. Um es einmal einfacher zu erklären, kannst du dir ein Image wie eine DVD vorstellen. Die Daten sind fest auf der DVD bzw. dem Docker-Image hinterlegt und du kannst diese erst einmal nicht modifizieren. Diese DVD legst du in ein DVD-Laufwerk, welches die Daten ausliest und bereitstellt.
Das wäre in dieser Analogie der Docker-Container. Damit ist auch geklärt, warum man öfters liest, dass Daten in einem Docker-Container flüchtig sind bzw. ein Docker-Container vergisst. Stoppe ich den Container oder starte diesen neu, werden alle Daten resettet und du bekommst den ursprünglichen Zustand von dem Docker-Image präsentiert. Damit genau das nicht passiert, kannst du Daten auch in ein Volumen oder ein Bind, ein spezieller Ordner auf dem Hostsystem, auslagern. Dieses Volumen oder Bind musst du dann in den Docker-Container mounten, weswegen der Docker-Container genau diese Daten nutzt, um weiterzuarbeiten.
In der Regel wird bei Starten des Containers geprüft, ob das Volumen oder Bind schon nutzbare Daten hat und wenn nicht, werden Default-Daten angelegt, die dann ebenfalls nach einem Neustart weiterhin vorhanden sind. Welche Pfade du in ein Volumen oder Bind auslagern musst, verrät dir die docker hub – Seite der Applikation. Dann gibt es noch die Enviorments, was vom Prinzip Parameter sind, die ein Docker-Image zwingend braucht. Diese Enviorments können bei einem Image vorhanden sein, müssen es aber nicht. Ob und welche es gibt, bzw. was ihre Funktion ist, findest du bei docker hub meist in der Beschreibung. Damit die Docker-Container mit der Außenwelt kommunizieren können, z.B. eine Datenbank oder eine Webappilkation, musst du die Ports zwischen Host und Docker-Container verknüpfen. Das Interessante dabei ist, du kannst das gleiche Docker-Image auf mehreren Docker-Containern laufen lassen aber durch andere Ports erreichbar machen.
Das klingt erst einmal sehr kompliziert und es könnte sein, dass du gerade das Gefühl hast, dass Docker eher was für IT-Nerds ist, tatsächlich ist es aber schnell gelernt und nach ein paar erstellten Docker-Containern selbsterklärend.
Docker auf dem Raspberry Pi installieren
Um Docker zu nutzen, braucht es wenige Befehle auf der Konsole. Zunächst braucht der Raspberry Pi sein Betriebssystem, meist Raspberry Pi OS, welches schnell auf die SD oder besser einem USB-Device installiert wurde. Hier empfehle ich meinen Blogbeitrag zum Thema „Den Raspberry Pi absichern“, wo ich das genau erklärt habe. Danach öffnest du das Terminal und lädst zunächst ein Skript herunter, welches Docker auf unserem Raspberry Pi installieren wird, siehe Code 1.
curl -fsSL https://get.Docker.com -o get-Docker.sh
Code 1: Skript von Docker.com zum installieren
Das Skript selbst ist recht klein, mit gerade einmal 19kByte, siehe Abbildung 2, jedoch wird es gleich beim Ausführen eine Menge an unserem Raspberry Pi verändern bzw. anpassen und installieren.
Zunächst führt das Skript, wenn mit Code 2 zum Starten mit root-Rechten angestoßen, ein Update aller installierten Pakete durch und installiert im Anschluss alle benötigten Pakete für Docker.
sudo sh get-Docker.sh
Code2: Das Skript get-Docker ausführen
Danach fügt es die Paketquelle von Docker, samt GPG-Schlüssel, dem Paketmanager apt hinzu, um dann Docker zu installieren. Dabei handelt es sich um die Pakete Docker-ce, Docker-ce-cli und containerd.io. Je nach Internetleitung kann die Installation einen kurzen Moment dauern, jedoch solltet ihr am Ende eine Erfolgsmeldung im Terminal sehen, siehe Abbildung 3.
Damit nicht nur der Benutzer root Docker ausführen darf, sollte der Benutzer pi der Gruppe Docker hinzugefügt werden, siehe Code 3.
sudo usermod -aG docker $USER
Code 3: pi der Gruppe Docker hinzufügen
Danach kannst du entweder den Raspberry Pi neustarten oder mit Code 4 die Gruppenrichtlinien neu laden.
newgrp docker
Code 4: Die Gruppenrichtlinien neu einlesen
Nun solltest du noch prüfen, ob Docker auch funktioniert. Was wäre da also besser als ein Image mit dem treffenden Namen hello-world? Dieses startest du mit dem Befehl aus Code 5.
docker run hello-world
Code 5: hello-world-Container im Docker starten
Wenn alles funktioniert hat, dann solltest du eine Ausgabe wie in Abbildung 4 sehen. Zugegeben, der Container macht erst einmal nicht viel, außer eine Ausgabe in der Konsole zu erzeugen.
Doch sollte es keine keinerlei Fehlermeldung bis hierhin gegeben haben, so weißt du, dass Docker ordnungsgemäß installiert wurde und einsatzbereit ist.
Portainer zur Dockerverwaltung
Vom Prinzip kann Docker über die Kommandozeile genutzt werden. Egal ob um neue Container anzulegen, Images herunterzuladen oder Docker Compose zu verwalten. Aber einfacher bzw. schöner wäre doch eine grafische Oberfläche, mit der wir diese Arbeit durchführen. Die Rede ist von Portainer, welches genau dies übernimmt. Portainer ist ein sehr mächtiges Tool und läuft als Docker-Container auf dem Raspberry Pi. Bevor der Container gestartet wird, musst du erst einmal ein Docker-Volumen erstellen. Dies machst du mit dem Befehl aus Code 6.
docker volume create portainer_data
Code 6: Dockervolumen für Portainer erstellen
Dieses Volumen brauchen wir, da ein Docker-Container beim Neustart seine Daten verliert. Um dies zu umgehen, soll der Docker-Container von Portainer ein Volumen einbinden, welches die angepassten oder erstellten Daten speichert. Im nächsten Schritt soll Portainer gestartet werden, was mit dem Befehl aus Code 7 geschieht.
docker run -d -p 8000:8000 -p 9443:9443 --name portainer -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data cr.portainer.io/portainer/portainer-ce:latest
Code 7: Portainer starten
Den oben genannten Befehl, auch wenn du Ihn ggf. schon ins Terminal eingegeben hast, möchte ich noch erklären. Zunächst das Attribut -d welches den Docker-Container im Hintergrund ausführt. Mit -p verknüpfen wir die Ports vom Container mit dem Port des Hostsystems, also dem Raspberry Pi. In unserem Kommando die Ports 8000 und 9443 mit demselben Port des Raspberry Pis. Letzteres ist die https-Verbindung im Webbrowser. Zuletzt wird mit -v die im Container vorhandenen Pfade mit dem Volumen und zuvor noch der Socket von Docker mit Portainer verknüpft. In Fall von Portainer speichern wir die Daten für Portainer im eben angelegten Volumen. Mittels –restart=always wird der Docker-Container immer wieder neugestartet, egal ob durch einen Fehler oder einen Neustart des Raspberry Pi.
Damit Portainer überhaupt laufen kann, muss zunächst das Image von Portainer in der Community Edition heruntergeladen werden, siehe Abbildung 5. Hier brauchst du nichts zu machen, durch unseren Befehl, wird das von selbst durchgeführt.
Portainer wird in der Regel von docker hub heruntergeladen und auf dem Raspberry Pi gespeichert. In unserem Fall, da eine Webadresse angegeben wurde, wird Portainer von portainer.io heruntergeladen. Durch das Tag latest, welches mit :latest am Ende des Image-Parameters eingetragen wurde, wird die aktuellste Version genutzt. In der Konsole siehst du nach dem Herunterladen und Ausführen erste einmal nichts, aber der Container von Portainer sollte im Hintergrund laufen.
Ob Portainer läuft, können wir mit zwei verschiedenen Methoden herausfinden. Die erste Variante ist über den Befehl aus Code 8.
docker ps
Code 8: Liste alle aktiven Docker-Container
Dieser Befehl listet alle aktiven Container von Docker auf, siehe Abbildung 6. Jeder Container erhält dabei eine zufällige Container ID und wir sehen diverse Informationen zu dem Container.
Was direkt ins Auge fallen könnte ist, dass die Ports 8000 und 9443 für IPv4 und IPv6 freigegeben und an den Docker-Container von Portainer weitergeleitet wird.
Die Portainer-Oberfläche für Docker auf dem Raspberry Pi
Die zweite Variante zu prüfen, ob Portainer gestartet wurde, ist einen Webbrowser mit der Adresse vom Pi und dem Port 9443 zu öffnen, siehe Abbildung 7.
Denke bitte daran, dass die Adresse wie folgt aussieht https://IP-vom-PI:9443. Da Portainer das erste Mal gestartet wird, musst du zu Beginn noch ein sicheres Passwort für den Administrator admin eintragen. Dieses musst du dir entweder aufschreiben oder merken, weil zurücksetzen kannst du es nicht mehr. Danach landest du in der Home-Ansicht von Portainer, siehe Abbildung 8.
Auf der rechten Seite, hier markiert mit der rot umrandeten 1, kommst du in die einzelnen Untermenüs, welche ich teilweise gleich noch näher erläutern werde. In der Mitte, rot umrandete 2 oder dem Dashboard, siehe Abbildung 9, siehst du den Status von den Docker-Containern und weitere Informationen wie Images, Volumes oder Networks. Stacks lasse ich an dieser Stelle einmal aus, das wird in einem späteren Beitrag relevant werden.
Wechseln wir zunächst einmal in den Reiter Containers, mit dem entsprechenden Menüeintrag auf der rechten Seite, siehe Abbildung 10.
Hier sehen wir erst einmal zwei Dinge. Zum einen den Container von dem „hello-world“-Beispiel und den Portainer-Container. Bei letzterem könntest du dich nun ein bisschen wundern, da wir ja gerade in Portainer arbeiten und es im ersten Moment keinen Sinn ergibt, dass dieser Container hier erscheint. Tatsächlich liest Portainer über den Docker-Socket alle Container aus und zeigt diese an. Da Portainer auch als Docker-Container läuft, wird daher auch Portainer als solcher angezeigt. Im nächsten Schritt soll nun ein neuer Container erzeugt werden, mit dem du dann auch arbeiten kannst.
Das Applikations-Dashboard Heimdall
Bei dem Namen Heimdall könnten einige nun kurz an die Marvel-Filme von Thor denken. In der nordischen Mythologie ist Heimdall der Götterwächter und bewacht die Brücke, bzw. den Bifröst, zwischen den Welten. Ähnlich kannst du dir auch das Applikations-Dashboard Heimdall vorstellen. Jeder kann sich ein eigenes Profil erstellen und für alle Web-Applikationen einen Button erstellen, der dich dann dorthin bringt. Teilweise haben diese Buttons sogar interessante Zusatzfunktionen. Gerade Heimdall ist ein super Einstieg in Portainer und die diversen Menüs.
Das Docker-Image von Heimdall herunterladen
In den Basics von Docker habe ich geschrieben, dass jeder Container ein Image braucht. Heimdall ist da keine Ausnahme und so muss dieses Image erst einmal gesucht und runtergeladen werden. Erste Anlaufstelle für Images ist docker hub. Suche hier nach Heimdall, siehe Abbildung 11, wobei du eine Menge an Ergebnissen erhalten wirst.
Wichtig ist, dass du das Tag arm siehst, siehe rote Umrandung von Abbildung 11, da sonst das Image auf dem Pi nicht funktionieren würde. Gerade die Community um linuxserver.io stellen viele Images für den Raspberry Pi bereit, weswegen ich zum Eintrag linuxserver/heimdall nur raten kann. Gleichzeitig sind die Dokumentation und die GitHub-Pflege der einzelnen Images sagenhaft, was dir gerade am Anfang zu einem leichten Einstieg verhilft.
Wenn du nun auf der Seite von linuxserver/heimdall bist, siehst du auf der rechten Seite direkt den Docker-pull-Befehl, siehe Abbildung 12.
Weiter unten auf der Seite findet du einen Bereich Usage der dir erklärt, wie du mittels Docker-Compose, eine Art Skriptsprache, den Container zum Laufen bekommt. Es werden dabei alle wichtigen Einstellungen für Enviorments, Volume und Ports gezeigt, was wir gleich brauchen werden, siehe Abbildung 13.
Zunächst wollen wir aber das Image runterladen. Dazu wechselst du in Portainer ins Menü Images und suchst dort nach dem Image linuxserver/heimdall, siehe Abbildung 14.
Mit einem Druck auf den Button Pull the image, wird das Image dann bei docker hub gesucht und die Version mit dem Tag latest runtergeladen. Theoretisch kannst du, wenn du bei docker hub dir die Tagseite genauer ansiehst mittels :TAGNAME aussuchen, welche Version du haben willst. Je nach Größe vom Image und deiner Internetleitung, kann der Download kurz dauern. Danach siehst du aber in der unteren Liste einen weiteren Eintrag mit einem Flag Unused, was das Heimdall-Image ist, siehe Abbildung 15.
Aus dem Heimdall-Image wird ein Docker-Container
Der nächste Schritt ist nun, aus dem Image ein Docker-Container zu erzeugen. Dazu wechselst du in den Menüpunkt Containers von Portainer und wählst den Button Add container aus, siehe Abbildung 16.
Jetzt kommt der Moment, wo die Usage-Dokumentation der docker hub – Seite von Heimdall benötigt wird, daher solltest du diese parallel geöffnet haben. Zunächst braucht unser neuer Docker-Container einen Namen, hier Heimdall, sowie die Zuweisung, welches Image genutzt werden soll, hier linuxserver/heimdall, siehe Abbildung 17.
Als nächstes müssen die Netzwerkports vom Container mit dem Hostsystem, also dem Raspberry Pi, gemappt werden. Im Fall von Heimdall ist das der Port 80 und 443. In der Kartei Networt ports configuration drücken wir zweimal den Button publish a new network port und tragen die Ports ein, siehe Abbildung 18.
Da ich persönlich beim Öffnen der Website meines Docker-Pis die Heimdall-Seite gezeigt bekommen möchte, sind der Host- und Container-Port identisch. Achte dabei darauf, dass es sich um einen TCP-Port handelt und nicht UDP! Willst du einen anderen Port vom Host nutzen, so musst du später die Webadresse nach dem Schema http(s)://IP-vom-PI:Eingestellter-Port aufrufen.
Als nächstes musst du die Environments, das Volume und die Restart policy korrekt eintragen. Diese Einstellungen findest du am Ende der Seite. Bevor du damit aber beginnst, solltest du im Tab Command & logging bei Console den Punkt Interactive & TTY (-I -t) auswählen, siehe Abbildung 19.
Damit haben wir später Zugriff über die Konsole auf den Container und müssen nicht erst umständlich über docker-Kommandos versuchen Zugang zu bekommen.
Nun Wechsel in den Tab Volumes und richte mit dem Button map additional volume einen neuen Verweis für einen Container-Pfad zum Hostsystem ein, siehe Abbildung 20.
Hier wird der Ordner /config aus dem Image mit dem Ordner /home/pi/heimdall/config gemappt. Das kannst du dir wie eine Art Verknüpfung auf einem PC vorstellen, wobei hier der Container-Ordner quasi ausgetauscht wird. Das geht in diesem Fall aber nur, da ich die Option Bind anstelle von Volume ausgewählt habe. Der Vorteil bei einem Bind ist, dass ich auf die Daten zugreifen kann, was bei einem Container-Volume schwieriger ist. In dem oben gezeigten Beispiel wird im Arbeitsverzeichnis vom User pi, also /home/pi, der Ordner /heimdall/config erzeugt und in den Container gemountet.
Nun müssen noch die Environments im Tab Env eingetragen werden. Drücke dazu dreimal den Button Add an enviroment variable und trage die Werte für PUID, PGID und TZ ein, siehe Abbildung 21. Wenn du ein Standard Raspberry Pi OS hast, hat der Benutzer pi jeweils die 1000 für PUID und PGID.
Die entsprechenden Einstellungen kannst du aus Abbildung 21 oder dir die Environments auf der docker hub – Seite von linuxserver/heimdall unter Usage ansehen. Da ich mich in der Zeitzone von Berlin befinde, trage ich hier für das Environment TZ entsprechend Europe/Berlin ein.
Bevor der docker-Container nun deployed werden kann, solltest du noch im Tab Restart policy die Restart policy von Never auf Always umstellen, siehe Abbildung 22.
Im Anschluss kannst du auf den Button Deploy the container drücken. Wenn alles richtig eingestellt ist, wirst du beim erfolgreichen deploy, direkt auf die Container-Seite von Portainer weitergeleitet und siehst einen gestarteten Heimdall-Container, siehe Abbildung 23.
An der Stelle musst du ggf. noch ein bisschen warte, da beim ersten Starten vom Heimdall-Container noch einige Keys und Konfigurationen im /config-Ordner erzeugt werden müssen. Bei einem Pi 4 mit 4GB dauert der erste Start ungefähr 2 Minuten, danach kannst du aber die Heimdall-Seite erreichen, wobei du vorher das selbsterzeugte SSL-Zertifikat akzeptieren musst, siehe Abbildung 24. Wird der Container neu gestartet, entfällt diese Wartezeit, da die Daten dann schon vorhanden sind.
Kurzeinführung in Heimdall
Die Webapplikation von Heimdall ist intuitiv und schnell gelernt. Über die Menüleiste am rechten unteren Rand, siehe Abbildung 25, kannst du Heimdall komplett nach deinem Wunsch konfigurieren.
Ich empfehle am Anfang unter dem Menü Einstellungen die Sprache auf Deutsch zu schalten, dann wird es ggf. ein bisschen leichter bei der Erstellung der Web-Shortcuts. Wie du eine Applikationsliste erzeugst, will ich dir in einem einfachen Beispiel zeigen.
Wechsle zunächst in die Applikationsliste und führe ein Update der App Liste durch, siehe Abbildung 26.
Über den Button Hinzufügen erstellst du ein neues Anwendungselement, siehe Abbildung 27.
In meinem Beispiel erstelle ich nun einen Shortcut zu meiner FritzBox, wozu es auch ein Application Type gibt, siehe Abbildung 28. Gerade durch das Applications Type AVMFritzBox werden schon einige Bilder und Buttonanpassungen vorgenommen.
Lediglich der Name und die URL muss noch nachgetragen werden. Theoretisch kannst du über den Button Hochladen einer Datei auch ein anderes Icon auswählen, sofern es dir nicht gefällt oder du die Applikation nicht in der Liste findest. Nach dem Speichern erscheint der Button in deiner Übersicht, siehe Abbildung 29.
Je nach Geschmack und Arbeit, kann die Übersicht schon einige Shortcuts zu wichtigen Webapplikationen zeigen, wie in meiner Übersicht, siehe Abbildung 30.
Zusammenfassung
Ich habe dir bisher Docker und Portainer versucht näher zu bringen. Ich hoffe die Erklärung zwischen einem Docker-Container zu einer VM ist mir insoweit gelungen, dass dieser Unterschied nun klar ist. Mit deinem ersten Docker-Container Heimdall habe ich dir zudem gezeigt, wie einfach es ist, ein Docker-Image runterzuladen und als Container dann zu starten. Auf viele Eigenheiten von Docker bin ich nicht eingegangen, das hätte hier aber den Rahmen um weiten gesprengt. Nicht zuletzt gibt es von Michael Kofler und Bernd Öggl ein komplettes Buch zu dem Thema Docker, was die Komplexität verdeutlichen soll. Wahrscheinlich hat dich dieser doch recht umfangreiche Beitrag etwas erschlagen, aber ab jetzt werden die Themen in dieser Serie einfacher bzw. kompakter. Gerade die Grundlagen von Docker sind wichtig, damit du später in deinem Test- bzw. Produktivumfeld sicher arbeiten kannst.
Für weitere spannende Raspberry Pi Tutorials, klicke einfach hier.
Hallo Zusammen,
Super Zusammenfassung und erleichtert wirklich den Einstieg in Docker auf dem PI. Ich glaube da ist ein Fehler in dem Code um den Portainer Container zu erstellen.
docker run -d -p 8000:8000 -p 9443:9443 –name portainer -v /var/run/Docker.sock:/var/run/Docker.sock -v portainer_data:/data cr.portainer.io/portainer/portainer-ce:latest
da fehlt doch das
–restart=always
oder?
VG Timo
Hatte da auch das Problem das Portainer das Docker enviroment nicht erkannt hat.
Lösung: Das “D” von Docker in “/var/run/Docker.sock:/var/run/Docker.sock” muss klein sein. 😉
Korrekt also:
docker run -d -p 8000:8000 -p 9443:9443 –name portainer -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data cr.portainer.io/portainer/portainer-ce:latest
Ansonsten super erklärt! Danke.
Hallo Timo,
ja da hast word (Schande meinerseits) leider falsch korrigiert und ich habe es nicht gesehen. Tatsächlich muss der Service bzw Sock docker hier klein geschrieben werden.
Das ich das restart flag nicht nutze liegt daran, sollte portainer abstürzen, dann wird automatisch neu gestartet. Macht aber in diesem Fall keinen Sinn, da ich die Ursache in den Logs suchen muss, warum dies passiert ist.
Ich habe die entsprechende Passage / Codezeile angepasst, somit sollte alles laufen.
Gruß
Jörn Weise
Nicht ganz – Du hast in der Zeile oben “/var/run/Docker.sock:/var/run/docker.sock” geschrieben, aber beide “D” müssen klein sein, also “/var/run/docker.sock:/var/run/docker.sock”.
Dafür muss aber in Daniels Codezeile noch aus dem “-name” ein “–name” werden, also korrekt so:
docker run -d -p 8000:8000 -p 9443:9443 –-name portainer -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data cr.portainer.io/portainer/portainer-ce:latest
Liebe Grüße,
Oliver
Hallo Oliver,
das eine “D” ist mir tatsächlich bei der Korrektur wieder durch die Lappen gegangen, aber korrigiert worden, das mit dem –name kann ich aber leider nicht verstehen. In der Codezeile oben ist eindeutig schon seit dem letzten Update –name gewesen, was ich auch noch einmal überprüft habe. Ich denke da hat dein Browser dir einen Streiche gespielt.
Danke für das Feedback und noch einen schönen Abend.
Gruß
Jörn
Was ich vergessen hatte: Vielen Dank für den Beitrag!
Nachdem ich eine Weile mit Docker auf der Synology herumgespielt hatte (und dabei feststellen musste, dass das Ding anfängt zu swappen wie nix Gutes), dachte ich mir, dass ich das Monitoring meiner technischen Infrastruktur doch lieber mit Prometheus auf dem Pi mache.
Die Darstellung mache ich über die Grafana Cloud, also off-site. Prometheus braucht nicht soo viel Speicher (so viele Punkte zum Überwachen habe ich auch nicht) und daher reicht hier der Pi.
Aber das Management der Container über Portainer zu regeln und die Darstellung über Heimdall – das ist schon ein ziemlicher Sprung in Sachen Usability gewesen.
Nochmals danke dafür!
Liebe Grüße,
Oliver
Ich bin gestern einfach nicht dahinter gekommen wie ich die Container richtig verwende. Deine detaillierte Anleitung hat mir gezeigt wo ich nicht alles ausgefüllt habe. Das Erkunden des Raspberry Pi kann weiter gehen!
Bis jetzt habe ich einen Pi mit Pi-Hole am laufen. Möchte aber weitere Sachen darauf laufen lassen. Deshalb experimentiere ich auf einem zweiten Pi was ich mit einem Docker so alles machen kann. Die Idee ist mindestens noch searXNG laufen zu lassen und eine Webseite/Applikation mit dem lokalen Wetter.
Hallo Toni,
tatsächlich war ich bei searxng schon am überlegen, einen Beitrag zu machen.
Gerade in Verbindung mit pihole wäre das eine super Sache, um noch mehr Privatsphäre in den eigenen vier Wänden zu haben.
Gruß
Jörn
Guten Tag,
Wenn ich die Seite aufrufe kommt ist 404 not found
Was mache ich falsch
Hallo Dennis,
an welcher Stelle den genau? Wenn es Portainer ist, dann denke bitte an http”S”, da http hier nicht geht.
Ansonsten sollte es nach der Anleitung gehen.
Gruß
Jörn
Hallo Oliver,
vielen Dank für deine super Anleitung!
Eine kleine Anmerkung hätte ich dennoch:
Auf der arm64 Version scheint Docker nicht zu laufen.
Könntest du das bitte mal prüfen und ggf. am Anfang deines Blogs einen kleinen Hinweis anbringen?
(oder habe ich das überlesen?)
Vielen Dank
Andreas
Hallo Andreas,
das wäre mir an dieser Stelle nun komplett neu. Ich habe docker auf dem Pi in drei unterschiedlichen Varianten erfolgreich ans laufen gebracht:
– Mit 32Bit-Kernel und 32Bit- Oberfläche
– Mit 64Bit-Kernel und 32Bit-Oberfläche (hier das Flag in der Config.txt setzten)
– Mit dem kompletten 64Bit Raspberry Pi OS
Bei keinen dieser drei Varianten habe ich Probleme gehabt Docker zu installieren.
Ich habe auch gerade noch mal mein TestPi für diese Beiträge überprüft und es ist das Raspberry Pi OS 64bit installiert. Daher würde ich mich an der Stelle fragen, wie Sie darauf kommen, dass ARM64 nicht unterstützt wird?
Könnte es sein, dass Sie mit einem 64Bit-Kernel aber 32Bit Oberfläche ein arm64-Bit Container zu starten? Hier habe ich schon oft den Fall gehabt, dass ARM64v8 zwar also Container unterstützt wird, Docker auf dem Pi aber keinen brauchbaren Container findet. Ich denke das liegt damit zusammen, dass zwar der 64Bit-Kernel läuft, aber die Oberfläche in 32bit.
Gruß
Jörn Weise
Danke für die Anleitung, Jörn! Das ist eine große Hilfe.
Eine Anmerkung: Mein Portainer hat initial die lokale Umgebung nicht erkannt. Das könnte an einem Tippfehler im Teil “-v /var/run/docker.sock:/var/run/docker.sock” des Run-Befehls gelegen haben. Seltsamerweise hat eine Neuinstallation von Portainer mit korrekten Parametern das Problem nicht behoben.
Die Lösung: Ich konnte aber per “add environment” und dann die Option “Edge Agent” eine Verbindung auf “/var/run/docker.sock” herstellen. Jetzt sehe ich die Umgebung in der Home-Ansicht und bekomme auch das Menü links (mit Dashboard, App-Templates, Container, …), wenn ich sie anwähle.
Vielleicht hilft’s irgendwem!
Danke für den Hinweis. Das gleiche Problem hatte ich vor ca. 2 Wochen auch und habs seitdem auch nicht nochmal genauer untersucht.
Dein Post kürzt mein Problem sicherlich deutlich ein. 😉
hi Nik,
habe die gleiche Installation durchgeführt mit dem gleichen Ergebnis wie bei Dir, die lokale Umgebung wurde nicht erkannt.
habe nachdem ich Deine Mail gelesen habe versucht sie ebenfalls anzulegen aber leider ohne Erfolg (absoluter Docker Neuling).
Könntest Du mir evt. einen Screenshot oder genauere Angaben bereitstellen wie ich die Umgebung korrekt angelegt bekomme?
Gruss
Jakob
Hi zusammen,
leider klappt bei mir die Erstellung des Dockervolumen für Portainer nicht.
Es kommt folgende Meldung:
docker run -d -p 8000:8000 -p 9443:9443 –name portainer -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data cr.portainer.io/portainer/portainer-ce:latest
Unable to find image ‘cr.portainer.io/portainer/portainer-ce:latest’ locally
docker: Error response from daemon: Get “https://cr.portainer.io/v2/”: dial tcp 0.0.0.0:443: connect: connection refused.
See ‘docker run –help’.
Habt Ihr ne Idee?
Kurzes Update:
Google konnte mir helfen, irgendwie hatte er wohl ein Problem mit dem Abruf auf https://cr.portainer.io/v2/.
Somit erstmal erledigt. Danke 🙂
Hallo, Thomas.
Dein Kommentar ist zwar schon ein wenig her, aber vielleicht hast Du ja immernoch das Problem.
Ich hatte die gleiche Fehlermeldung.
Da ich einen älteren Pi als Pihole benutze, habe ich dort mal in die Query-List geschaut und mir wurde die Verbindung nach https://cr.portainer.io per Blockliste gesperrt. Ich habe die URL auf die Whitelist gesetzt und nach ein paar Sekunden konnte sich der neue Pi verbinden.
Ich hoffe, das hilft Dir, oder anderen mit diesem Problem weiter.
Ich wünsche frohe Festtage und einen guten Rutsch ins Jahr 2023.
Gruß,
Alex
Hi zusammen,
leider klappt bei mir die Erstellung des Dockervolumen für Portainer nicht.
Es kommt folgende Meldung:
docker run -d -p 8000:8000 -p 9443:9443 –name portainer -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data cr.portainer.io/portainer/portainer-ce:latest
Unable to find image ‘cr.portainer.io/portainer/portainer-ce:latest’ locally
docker: Error response from daemon: Get “https://cr.portainer.io/v2/”: dial tcp 0.0.0.0:443: connect: connection refused.
See ‘docker run –help’.
Habt Ihr ne Idee?
Moin,
könnte man die Anleitung mal Bitte reparieren?
Das Depot »https://download.docker.com/linux/raspbian bookworm Release« enthält keine Release-Datei.
Dank Frank I.
Hallo Frank,
was genau soll den an der Anleitung genau repariert werden? Portainer und docker laufen wunderbar, das Problem liegt wohl eher an deinem Raspberry Pi OS, da du hier eine nicht offiziellen Release mit dem Codename bookworm verwendest 😉
Damit ist klar, dass docker und Co kein passendes Repository für dich haben, da die aktuelle Release auf den Namen bullseye hört.
Gruß
Jörn
Linux ist immer sehr frustrierend, besonders wenn solche Anleitungen nicht klappen.
Moin!
Alles lief, bis zum ersten Reboot des Raspberrys. Jetzt läuft Heimdall noch, aber Portainer nicht mehr.
Heimdall nutzt https://192.168.1.153, alles Okay!
Portainer hat bis zum Reboot auch unter https://192.168.1.153:9443 geantwortet. Nun heißt es, die Seite kann nicht gefunden werden.
Mit Docker PS wird auch nur Heimdall als Image angezeigt. Ich vermute, Portainer ist nicht gestartet, aber wo und wie kann ich das einsehen ?? Das sind meine ersten Schritte Zum Thema Docker, wollte eigentlich danach Bitwarden installieren…wäre daher über Tipps sehr dankbar.
Gruß
Knut
Da bin ich noch einmal….nach Eingabe von
docker restart portainer
läuft der jetzt.
Die Restart Policy stand auf None, habe ich jetzt auf Always gestellt…bin mal gespannt, ob der nach einem Reboot nun auch da ist…
Reboot erfolgt: Alles da !
Wünsche Euch einen guten Rutsch !!
Gruß
Knut
Danke für die Anleitung! Bei mir läuft alles bis zur Einrichtung von Heimdall. Hier erhalte ich immer die Fehlermeldung “Failure unable to remove container”. Dabei versuche ich doch gar nicht, einen Container zu entfernen, sondern einen anzulegen. :-/ Wo könnte das Problem liegen?
Hi Oliver,
hast Du für diese Meldung eine Lösung gefunden, ich habe genau dasselbe Problem.
Gruß
Arno
Hallo Jörn,
vielen Dank für diese tolle Anleitung die mir sehr beim Einstieg in Docker geholfen hat.
Ich bin auf einen Fehler gestoßen den ich selbst beheben konnte, möchte hier allerdings für alle “nachfolgenden” einen kurzen Hinweis hinterlassen:
In der “Abbildung 20: Docker-Container-Pfad mit Hostsystem verknüpfen” wird als Host der Pfad ” /home/pi/heimdall/config” gemappt.
In der Abbildung ist der “Schalter” auf “Read Only”.
Hier muss tatsächlich “write” ausgewählt werden, da ansonsten beim Start des Containers der Error
chown: changing ownership of ‘/config’: Read-only file system
mkdir: cannot create directory ‘/config/keys’: Read-only file system
entsteht.
Sollte dies der Fall sein, muss der Container gestoppt werden, und einfach im Modus “Duplicate/Edit” der Schalter auf “write” gesetzt werden. Danach läuft alles wie geschmiert.
Vielen Dank!
Hallo ,
ich bin entsprechend deiner Anleitung vorgegangen und erhalte beim deployen die folgende Fehlermeldung:
Failure
Unable to remove container
Auto remove ist aber ausgeschaltet.
Gruß
Arno
Danke für die Super Anleitung,
Ich habe mich doch so das eine oder andere Mal mit der Commandline rumgeschalgen Portainer.io sieht da sehr vielversprechend aus.
Heimdall läuft auch! ????
Jetzt sind gleich mealie.io und paperless-ngx dran.
Beste Grüße Jens
Danke für die Anleitung. Super verständlich und alles am laufen.
Christian
Super verständlich
und tadellos dokumentiert.
Jeder Schritt hat funktioniert.
Bis hin das Heimdall läuft.
Herzlichen Dank!
Hallo Jörn,
Super Anleitung.
Die Option –restart=always hast Du zwar beschrieben, ist aber in der Box von Code 7 noch nicht enthalten.
Noch ein Tipp. Falls es beim Anlegen von Heimdall zu einem Fehler 500 kommt kann das daran liegen, dass auf dem Host bereits eine Anwendung auf Port 80 oder 443 läuft. Dann einfach andere Ports nehmen.
Gruß
Rolf
Bestens erklärt, alles verstanden, aber letztendlich doch erstmal gescheitert:
für einen Raspberry Pi 4 gibt es keine linuxserver/heimdall Version mehr.
Gruß
Christoph
präziser formuliert:
für einen Raspnerry 4 “mit 32-Bit Betriebssystem” gibt es keine linuxserver/heimdall Version mehr.
Nach Umstieg auf Raspberry Pi OS (64-Bit) klappt es hier.
Nochmals vielen Dank für das superbe Tutorial.
Gruß
Christoph
Ich habe einen Raspi 400 mit Kernel 64 Bit. Beim Starten wird bei bullsey kurz im Screen 32 bit angezeigt. ich habe das Problem, das Heimdall nicht läuft und eine Fehlermeldung ausgibt, das das Betriebssytem nicht passt. Muß hier alles auf 64 Bit umgestellt sein?
Sehr gut erklärt, danke!
Würde das auch einer Pi Ubuntu Installation funktionieren wie angedacht?
Gruß
Mateusz
Ich schließe mich an, eine wirklich gute Anleitung. Hut ab, das muss einiges an Zeit in anspruch genommen haben.