In diesem Anfänger-Tutorial zu Docker bist du der neue Entwickler bei LerneProgrammieren. Für eine neue App, die erstellt werden soll, musst du die Software Redis (eine In-Memory Datenbank, NoSQL) aufsetzen und einrichten.
Als absoluter Anfänger mit Redis bist du natürlich überfordert, da du nicht weißt, wo du starten sollst. Du hast allerdings im Internet gelesen, dass sich Docker sehr gut eignet, um Services in die Entwicklung und Produktion einzubringen.
Ziel: In diesem Tutorial lernst du, wie du Redis als Docker-Container aufsetzt, damit die neue LerneProgrammieren App die Weltherrschaft an sich reißen kann. Danach kannst du in diesem Artikel mehr zu Docker lernen (für Anfänger).
Deine Entwicklungsumgebung verfügt bereits über die neueste Version der Docker-Engine sowie den Zugriff auf Docker. Lokal hast du auf deinem Windows-Rechner den "Docker Desktop" Client eingerichtet, der sich über ein GUI sowie über die Kommandozeile steuern lässt.
Ich gebe dir schnell einen groben Überblick, "was Docker eigentlich ist" und dann starten wir direkt mit deiner Praxis-Aufgabe in diesem Tutorial.
Was ist Docker?
Stell dir vor, du arbeitest an einer komplexen App. Da du Hilfe bei der Entwicklung benötigst, schickst du deinen Code an einen Mitarbeiter.
Fall 1 - Ohne Docker: Dieser führt genau diesen Code, mit genau dem gleichen Datensatz aus, erhält aber ein etwas anderes Ergebnis. Das kann verschiedene Gründe haben, z.B. ein anderes Betriebssystem, eine andere Version der Programmiersprache, etc.
Docker versucht solche Probleme zu lösen.
Fall 2 - Mit Docker: Ein Docker-Container kann als ein Computer in deinem Computer gesehen werden. Das Gute daran ist, dass du deinen Code an deinen Mitarbeiter schicken kannst, dieser den Computer startet, deinen Code ausführt und er exakt das gleiche Ergebnis wie du erhältst.
Kurz gesagt: Du solltest Docker benutzen, weil es erlaubt dir, Abhängigkeiten vom Betriebssystem bis hin zu kleinsten Versions-Details exakt zu reproduzieren.
Grundwortschatz von Docker einfach erklärt - Images & Container
Die Worte "Images" und "Container" werden im Folgenden noch öfter auftauchen. Eine Instanz eines Images, wird Container genannt. Ein Images ist die Einrichtung des virtuellen Computers, quasi die Dateien und Abhängigkeiten.
Wenn du ein bestimmtes Image ausführst, hast du eine Instanz davon, die wir Container nennen. Du kannst viele laufende Container desselben Images haben.
Tutorial-Schritt 1 - Einen Container starten
Die erste Aufgabe ist es, den Namen des Docker-Images zu identifizieren, das für die Ausführung von Redis konfiguriert ist.
Mit Docker werden alle Container basierend auf einem Docker-Image gestartet. Diese Images enthalten alles, was zum Starten des Prozesses benötigt wird. Das bedeutet im Umkehrschluss, dass der Host keine Konfiguration oder Abhängigkeiten benötigt.
Unter registry.hub.docker.com/ kannst du die vorhandenen Base-Images finden. Alternativ kannst du in deiner Kommandozeile den Befehl docker search <Image Name>
verwenden, um nach Images zu suchen. Da du auf der Suche nach "Redis" bist, würde der Befehl wie folgt aussehen:
docker search redis
Da Redis ein Datenbanksystem ist, willst du es als Hintergrunddienst laufen lassen, damit du weiterarbeiten kannst. Standardmäßig werden Container nämlich als Vordergrundprozess gestartet.
Um Redis als Hintergrundprozess laufen zu lassen, musst du den Befehl "docker run" mit der Option "-d" verwenden. Das sieht dann so aus:
docker run -d redis
Da du das Redis-Image das erste Mal verwendest, musst es zunächst heruntergeladen werden. Dieser Prozess erfolgt, nach Ausführung des obigen Befehls, automatisch.
Tutorial-Schritt 2 - Laufende Container auflisten
Der gestartete Redis-Container läuft nun im Hintergrund. Mit dem Befehl docker ps
kannst du alle laufenden Container auflisten. Dieser Befehl zeigt auch den Nicename-Name (Shortname) und die Container-ID an.
Mit diesen Informationen kannst du (auf Wunsch) mehr über den Container erfahren:
- Der Befehl
docker inspect <Nicename|ContainerID>
liefert mehr Details über einen laufenden Container, wie zum Beispiel seine IP-Adresse. - Der Befehl
docker logs <Nicename|ContainerID>
zeigt die aufgezeichnete Log zu Lese- und Schreibprozessen des jeweiligen Containers an.
Tutorial-Schritt 3 - Zugriff auf Redis
Endlich hast du es geschafft. Deine Redis-Instanz läuft.
Doch, Moment mal. Irgendwie hast du keinen Zugriff darauf?
Der Grund für dieses Problem ist, dass jeder Container in einer Sandbox (isolierte Umgebung) läuft.
Wenn ein Service für einen Prozess zugänglich sein soll, der nicht in einem Container läuft, dann muss der Port über den Host geöffnet werden. Sobald der Port offen ist, ist es möglich, auf den Prozess zuzugreifen, als ob er auf dem Host OS selbst laufen würde.
Tipp: Redis läuft auf dem Port 6379
Um deine Instanz für den Host zugänglich zu machen, musst du im nächsten Schritt den Port (in diesem Fall, Port 6379) binden. Du musst dafür den <Hostport> sowie <Containerport> angeben. Außerdem vergeben wir noch einen leicht zu merkenden Namen für den Hostport. Der Befehl dafür sieht so aus:
docker run -d --name redisPort -p 6379:6379 redis:latest
Tutorial-Schritt 4 - Persistente Daten
Super! Wir nehmen jetzt an, dass du bereits seit einer Woche mit Docker-Containern gearbeitet hast. Du musst jedoch feststellen, dass deine wertvollen Daten immer wieder entfernt werden, sobald du einen Container löscht oder neu erstellst.
Für die LerneProgrammieren App ist das keine gute Lösung, da die Daten gespeichert (persistent) und wiederverwendet werden müssen, auch wenn Container entfernt oder neu erstellt werden.
Um das Problem zu lösen, musst du ein Verzeichnis (Volume) mit der Option -v <Host-Pfad>:<Container-Pfad> binden. Wenn ein Verzeichnis gebunden, genauer gesagt gemountet, wird, kann auf die Dateien, die in diesem Verzeichnis auf dem Host existieren, durch den Container zugegriffen werden. Alle Daten, die in das Verzeichnis innerhalb des Containers geändert oder neu erstellt werden, werden im gebundenen Verzeichnis des Hosts gespeichert.
Dadurch kannst du Container nach Lust und Laune ändern, ohne jedes Mal deine wertvollen Daten zu verlieren. Beim Redis-Image werden Log-Files und weitere Dateien im /data-Ordner abgespeichert.
Die Daten, die persistent sein sollen, solltest du auf dem Host unter /opt/docker/data/redis ablegen. Da du jetzt sowohl Host-Pfad als auch Container-Pfad definiert hast, kannst du sie in deinen Befehl schreiben:
docker run -d --name redisMount -v /opt/docker/data/redis:/data redis
Fazit zum Tutorial
In diesem ersten Anfänger-Tutorial zu Docker-Containern und Images hast du deine Aufgabe, die In-Memory Datenbank Redis, aufzusetzen erfolgreich erfüllt. Du hast dich dafür entschieden, Redis als Docker Container laufen zu lassen, um es einfacher zu verwalten und für andere zugänglich zu machen. Du hast Redis gestartet, Container-Daten aufgelistet, den Zugriff auf Redis zwischen der Docker-Instanz und dem Host hergestellt sowie eine persistente Datenspeicherung vom Container zum Host vorgenommen.
Wenn du mehr zu Docker erfahren möchtest, kannst du das wichtigste Praxiswissen in wenigen Stunden im LerneProgrammieren-Onlinekurs "Docker-Schnellstart" lernen. Weiterhin empfehle ich dir die vielen weiteren Tutorials in unserem Blog.
- Programmiere echte Apps als Anfänger
- Keine Installation, sofort loslegen
- Komplett praxisbezogen
- Zugriff auf Online-Editor