In diesem mehrteiligen Artikel möchte ich in einem pragmatischen Ansatz Docker und dessen Einsatz in Java-Projekten vorstellen.
Teil 1: Was ist eigentlich Docker?
Architektur
Docker ist eine Container-Lösung, die für eigene Anwendungen eine gekapselte und konfigurierbare Laufzeitumgebung zur Verfügung stellt.
Im Gegensatz zu einer Virtualisierungssoftware wie VMware Player oder Virtual Box sind diese Container jedoch leichtgewichtig, da sie kein komplettes Betriebssystem emulieren. Sie werden statt dessen “nur” in abgeschotteten Bereichen auf einem Host-System ausgeführt.
Layers und Images
Docker-Images werden durch so genannte “Layer” komponiert, wobei jedes Layer dem Image eine bestimmte Funktionalität oder Ressource (z.B. das Dateisystem oder Netzwerk) hinzufügt. Nachdem auf diese Art und Weise eine Basis geschaffen wurde, werden auf dem Image weitere Programme installiert und konfiguriert. Auf diese Art und Weise wird das Basis-Image modifiziert und dadurch effektiv um weitere Layers erweitert.
Hier als Beispiel die einzelnen Layers eines Images für einen MySQL-Datenbankserver:
Beachten Sie hier insbesondere die Größe des Images und wie viel die einzelnen Layer dazu beitragen.
Images werden intern durch einen Hash-Wert eindeutig identifiziert. Dies ermöglicht folglich eine sehr effiziente Verwaltung: Haben zwei Images den gleichen Hash-Wert, so müssen diese zwangsläufig identisch sein. Deshalb können Images zentral in einem Repository verwaltet werden! Somit kann eine Docker-Installation auf dem Zielsystem einen lokalen Cache einrichten. Und zentrale Repositories sind im Internet verfügbar, als Paradebeispiel Docker Hub. Das Angebot ist übrigens sehr umfassend: Linux-Betriebssysteme, Datenbanken, Server-Lösungen…, ein Erkunden ist sehr zu empfehlen!
Die Installation eines Images auf einem eigenen Rechner ist brilliant einfach: Sie benötigen z.B. eine MySQL-Datenbank?
docker pull mysql
Das war es bereits!
Container
Docker-Container werden aus einem Image heraus erzeugt. Auch der Container selbst wird über einen Hash-Wert identifiziert. Folglich kann er in einem Cache auf dem Host-Dateisystem abgelegt werden. Der Container selber wird anschließend auf dem Host ausgeführt.
Beim Erzeugen des Containers aus einem Image können verschiedene Konfigurationen durchgeführt werden:
- Port-Mappings: Enthält das Image beispielsweise einen Datenbank-Server, der auf dem Port 3306 lauscht, so kann der Host diesen Port auf 4306 bereitstellen.
- Mounten von Dateisystemen: Ein beliebiges Verzeichnis des Hosts kann in den Container gemounted werden. Auch hier ist eine Datenbank ein gutes Beispiel: So kann beispielsweise das Log-Verzeichnis im Host-Dateisystem liegen. Nicht vergessen: Das Dateisystem des Containers ist komplett abgeschottet und deshalb sonst nicht zugreifbar!
- Setzen von Environment-Variablen: Das Image definiert einen beliebigen Satz von Keys, die beim Erzeugen des Containers mit Values vorbelegt werden können. Welche Keys benutzt werden hängt natürlich vom Image ab. So könnte ein Datenbank-Container das Root-Password setzen lassen.
Auch hier wieder ein konkretes Beispiel: Wir erzeugen den MySQL-Container und starten diesen anschließend:
docker run -p 4306:3306 -v /my_log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=pw mysql
Und schon läuft eine MySQL-Datenbank auf dem Port 4306 und verwendet intern das angegebene Root-Passwort. Als Log-Verzeichnis benutzt der Container das Verzeichnis /my_log
des Hosts.
Im nächsten Teil des Artikels werden wir uns dann näher mit der Installation der Werkzeuge beschäftigen. Außerdem werden wir ein erstes eigenes Docker-Image erzeugen.
Seminare zum Thema