„Installieren Sie eine Linux-VM und bauen Sie die Umgebung identisch nach.“
Drei Monate nach meinem Einstieg war die Stimmung im Büro angespannt. Unser einziger Senior wurde auf ein anderes Projekt versetzt und war so sehr mit dem Packen seiner Sachen beschäftigt, dass von Übergabe kaum die Rede sein konnte. Der Teamleiter hatte sich dagegen schon lange aus der eigentlichen Entwicklungsarbeit zurückgezogen und war von aktuellen Technologietrends weit entfernt.
Eines Tages rief mich der Teamleiter zu sich. „Wenn Ihr Senior weg ist, sind Sie der Einzige, der die Server noch betreuen kann. Selbst wenn der Server ausfällt, müssen Sie ihn allein wiederherstellen können. Installieren Sie Linux als virtuelle Maschine, VM, auf Ihrem aktuellen Entwicklungs-Laptop, also Windows, und bauen Sie exakt dieselbe Umgebung wie auf dem Produktivserver nach.“
Ab diesem Tag begann mein Elend. Ich installierte VMware, lud die Ubuntu-ISO herunter, und allein die Installation fraß einen halben Tag. Ich durchsuchte das Firmen-Wiki, um Java, Node.js und PostgreSQL einzurichten. „Neu ist bestimmt besser“, dachte ich und installierte Java 17, nur um festzustellen, dass der Legacy-Code auf Java 8 basierte und nicht einmal baute. Also alles wieder löschen und neu installieren. Jedes Mal, wenn ich nur eine Zeile Code änderte, musste ich mvn build ausführen, die jar-Datei in die VM schieben und dort starten. Es war reiner Schmerz.
Dann kam mir plötzlich eine Frage. „Moment mal. Beim letzten Deployment auf den Produktivserver hat doch einfach ein einziger docker service update-Befehl gereicht, oder?“
Meine lokale virtuelle Maschine war so schwerfällig und voller Konfigurationsaufwand. Was war also dieses Ding namens Docker auf dem Produktivserver, das mit nur einem Befehl ein Update erledigte?

Die schwere Lösung: die virtuelle Maschine
Die Methode, die mir der Teamleiter aufgetragen hatte, also Linux auf Windows zu installieren, ist genau das, was eine virtuelle Maschine, VM, ist. Man baut auf einem physischen Rechner, dem Host, ein komplettes ‘virtuelles Haus’, also ein Guest OS.
Am Ende isoliert eine VM die Umgebung zwar zuverlässig, aber für Entwicklung oder Deployment ist sie einfach zu schwer und zu langsam, um sie ständig hin und her zu bewegen.
Die leichte Revolution: Docker
Genau deshalb entstand Docker, also die Container-Technologie. Docker baut nicht wie eine VM ein komplettes Haus. Es spannt stattdessen ein Zelt auf.
Der update-Befehl, den ich auf dem Produktivserver ausführte, installierte also kein schweres Betriebssystem neu. Er bedeutete nur: „Altes Zelt abbauen, neues Zelt mit der neuen Code-Version wieder aufstellen.“ Natürlich musste das in Sekundenschnelle fertig sein.

[Code Verification] Ist Docker wirklich so leichtgewichtig?
Reden wir nicht nur davon, dass Docker leicht ist, sondern überprüfen wir es wirklich. Wenn man eine Linux-, also Ubuntu-, Umgebung starten will, ist der Unterschied zwischen VM und Docker drastisch.
# Ubuntu mit Docker-Befehl starten (bei fehlendem Image wird heruntergeladen)
$ docker run -it ubuntu:latest /bin/bash
Ergebnis:
Kaum hatte ich Enter gedrückt, war ich schon in einer Ubuntu-Umgebung. Möglich ist das, weil ein Docker-Container kein echtes Betriebssystem ist. Er ist nur „ein isolierter Raum, der sich den Kernel des Host-OS, also meines Rechners, leiht und dabei so tut, als wäre er ein eigenes OS.“
Praxis-Tipp: der wahre Grund für Docker
Seit wir Docker im Arbeitsalltag eingeführt haben, hat sich mein Leben komplett verändert.
Zum Schluss: Wir liefern nicht nur eine Datei, sondern eine ganze Umgebung
Mit Docker hat sich das Entwicklungsparadigma verändert. Wir schicken nicht mehr nur den Quellcode, .java, auf den Server. Wir frieren die OS-Einstellungen, Bibliotheken und Umgebungsvariablen, die der Code braucht, in einem ‘Image’ ein und schicken das ganze Paket.
Doch wie wird dieses magische ‘Docker-Image’ eigentlich erzeugt? Ist es nur eine komprimierte Datei? Überraschenderweise ist ein Docker-Image wie ein Kuchen aus mehreren Schichten, also Layern, aufgebaut.
Beim nächsten Mal schauen wir uns das Geheimnis hinter Dockers Effizienz genauer an: Images und ihre Layer-Struktur.