Bedeutung von Containertechnologie in der Softwareentwicklung

Docker – was bringt’s für Entwickler?
Kommentare

Es ist selten, dass es ein Tool, das es Stand heute nur für Linux gibt, in unzählige Microsoft-Blogs und sogar auf die TechEd schafft. Docker ist dieses Kunststück im letzten Jahr gelungen. Ein Grund ist sicherlich zum einen die neue Offenheit von Microsoft hinsichtlich Linux. Der Hauptgrund ist aber die Begeisterung über das große Potenzial, das Docker hat. Dass Docker für Administratoren ein Thema ist, um das sie 2015 nicht herumkommen werden, scheint offensichtlich. Wie sieht es aber mit der Relevanz für uns Softwareentwickler aus? Wird Docker unseren Entwicklungsalltag beeinflussen?

Docker ist ein Werkzeug zur Virtualisierung von Anwendungen in Containern. Sie fragen sich vielleicht, wozu eine neue Virtualisierungstechnologie? Was ist falsch an Hyper-V, VMware und Co.? Sie bieten doch enorme Flexibilität. Ein Linux am Windows-Server betreiben? Kein Problem mit Hyper-V. Genau diese Flexibilität ist es, die klassische Virtualisierungslösungen oft langsam und schwerfällig erscheinen lassen. Stellen Sie sich vor, Sie könnten Ihren virtuellen Build-Server in unter einer Sekunde starten und genauso schnell wieder stoppen. Welche Auswirkungen hätte das auf den Build-Prozess? Es wäre denkbar, für jede Übersetzung Ihrer Anwendung eine neue, frische Serverinstanz zu starten. Was würde sich ändern, wenn Sie zum Debuggen nicht mehr einen lokalen Entwicklungswebserver starten, sondern jedes Mal einen frischen Server in Sekundenbruchteilen hochfahren, in dem Ihre Anwendung automatisch installiert wird? Ihre Anwendung würde später in Produktion exakt die gleiche virtuelle Infrastruktur vorfinden. Konfigurations- und Kompatibilitätsprobleme, die nur in der Produktionsumgebung auftreten, würden auf ein Minimum reduziert. Bei einer so leichtgewichtigen Virtualisierung könnte man auch viel „verschwenderischer“ mit virtuellen Maschinen umgehen. Warum mehrere Anwendungen auf einen Server packen, wenn man sie mithilfe von Containern sauber trennen kann? Wieso nicht die produktive Cluster-Umgebung mit Containern am lokalen Entwicklerrechner nachstellen? Mögliche Fehler durch gegenseitiges, negatives Beeinflussen oder Unterschiede zwischen Produktions- und Entwicklungsumgebung gehörten so der Vergangenheit an.

Containertechnologie = leichtgewichtige Virtualisierung

Bei klassischen Virtualisierungslösungen wie Hyper-V wird ein kompletter Computer mit eigenem Betriebssystem via Emulator oder Hypervisor simuliert. Als Benutzer eines solchen Systems können Sie jedes beliebige Betriebssystem als virtuelle Maschine installieren. Selbst die Mischung von Betriebssystemen (z. B. Windows auf Linux) ist kein Problem. Den Vorteil der Flexibilität bezahlt man durch relativ hohen Overhead. Will man zum Beispiel auf einem physischen Computer mehrere virtuelle Server mit identischen Betriebssystemen betreiben, braucht jeder virtuelle Server eine eigene Betriebssystemkopie. Das benötigt Speicher, erhöht den Wartungsaufwand und ist schwerfällig in der Handhabung (z. B. langsames Starten der Server). Container sind eine leichtgewichtigere Alternative. Statt jedem Container sein eigenes Betriebssystem zu geben, laufen Container im User Space und verwenden alle einen zentralen Betriebssystemkernel. Jeder Container enthält nur die Software, die spezifisch für ihn ist (z. B. Konfiguration, Programme etc.; Details hier). Das spart Geld, da mehr virtuelle Server auf einer physischen Maschine betrieben werden können (High Density Hosting). Darüber hinaus beschleunigt es die Verwaltung enorm. Kein Vorteil ohne Nachteil. Da sich alle Container auf einem Host einen Kernel teilen, ist es nicht möglich, verschiedene Betriebssysteme zu mischen. Windows auf Linux oder umgekehrt? Mit Containern nicht möglich. Dafür sind weiterhin klassische Virtualisierungslösungen notwendig. Insofern sind Container und heute übliche Virtualisierung komplementäre Technologien und weniger Konkurrenten.

Was ist Docker?

Docker ist keine komplett neue, eigene Containertechnologie. Die Plattform, die von der gleichnamigen Firma Docker, Inc entwickelt wurde, übernimmt das Deployment von Anwendungen (nicht vollwertigen Servern) in eine bestehende Ausführungsumgebung für Container. Docker steht im Moment nur für Linux, nicht jedoch für Mac OS X oder Windows zur Verfügung, da es auf LXC (Linux Containers) aufbaut. Natürlich können Sie Docker innerhalb einer virtuellen Linux-Maschine auf Ihrem Windows-Rechner ausführen. Dafür müssen Sie jedoch zum Beispiel auf Hyper-V zurückgreifen. Detailinformationen finden Sie im Kasten „Docker unter Windows“.

Docker unter Windows

Das direkte Ausführen von Docker-Containern ist im Moment nur unter Linux, nicht jedoch unter Windows oder Mac OS X möglich. Mit boot2docker steht eine leichtgewichtige Linux-Distribution zur Verfügung, die speziell für das Ausführen von Docker-Containern entwickelt wurde. boot2docker gibt es sowohl für Windows als auch für Mac OS X. Als Virtualisierungslösung wird dabei VirtualBox von Oracle genutzt. Vorsicht also bei gleichzeitiger Verwendung von Hyper-V und boot2docker auf einem Entwicklungsrechner. Will man unter Windows nur den Docker-Kommandozeilenclient ausführen, also seinen Docker-Host aus der Ferne administrieren, kann man Docker auch unter Windows kompilieren und ausführen. Nähere Informationen dazu findet man hier. Einfacher und robuster ist jedoch im Moment definitiv die Verwendung unter Linux. Volle Unterstützung von Docker unter Windows inklusive zugehöriger Ausführungsumgebung für Container ist ein wichtiges Thema für Microsoft. Mitte Oktober 2014 wurde bekanntgegeben, dass Docker sowohl unter Windows-Server als auch in Microsoft Azure in Zukunft unterstützt werden wird. Auf die Verwendung von Docker in Microsoft Azure geht mein zweiter Artikel in diesem Heft im Rahmen eines Beispiels ein. Für Docker unter Windows-Server muss man auf die nächste Windows-Version warten.

Docker ist mehr als LXC

Ist Docker also nur ein Kommandozeilenprogramm zum Verwalten einer Containertechnologie, die sowieso in Linux integriert ist? Nein, Docker ist mehr:

  • Die Ausführungsumgebung für Container im Linux-Kernel ist eine wichtige Grundlage, jedoch für die tägliche Arbeit als Softwareentwickler nicht einfach genug verwendbar. Docker bietet ein portables Format zum Zusammenstellen und Übertragen (packaging) von Containern mit einem entsprechenden API, das ein bequemes Arbeiten mit Containern ermöglicht.
  • Docker hat einen De-facto-Standard für ein API für Anwendungscontainer geschaffen. Das hat den Vorteil, dass Tools unabhängig von der jeweiligen Containerimplementierung darauf aufsetzen können. Rund um Docker ist dadurch bereits ein reiches Ökosystem von Werkzeugen (z. B. Web-UI für Docker, Cluster-Management-Tools etc.) entstanden.
  • Docker enthält eine eigene Sprache (Dockerfile) zum Erstellen von Containern beziehungsweise den zugrunde liegenden Images über Quellcode. Mit einem Dockerfile lässt sich ein Container-Image immer wieder ohne manuelle Installations- oder Konfigurationsschritte neu erstellen.
  • Docker enthält eine Versionsverwaltung für Container-Images.
  • Container-Images können auf anderen Images basieren. Man kann also einen Basiscontainer für beispielsweise ASP.NET vNext erstellen und diesen als Grundlage für viele verschiedene Anwendungen verwenden.
  • Mit dem Docker Hub steht eine Plattform zum Teilen von Container-Images und Dockerfiles zur Verfügung. Hersteller wie Microsoft können dort offizielle Basis-Images anbieten (z. B. für ASP.NET vNext unter Ubuntu), und Sie können darauf aufbauen. Sie können aber auch Docker-Images für Ihre eigene Software dort anbieten, damit Ihre Kunden mit Docker Ihre Anwendung leichter installieren und betreiben können.

Docker-Grundbegriffe

Lassen Sie uns einen Blick auf die Grundbegriffe von Docker werfen: Als Benutzer von Docker haben Sie direkten Kontakt mit dem Docker Client. Diesen gibt es als Kommandozeilenprogramm (docker) und als REST-API. Der Docker Client kann, muss aber nicht, auf dem gleichen Rechner wie der Docker Host installiert sein. Auf dem Docker Host läuft der Docker Daemon. Er ist für die Ausführung der Anweisungen des Docker Clients verantwortlich. Bevor Sie einen Container starten können, müssen Sie ein Docker-Image dafür erstellen. Docker-Images verwenden ein Union-Dateisystem. Das bedeutet, dass mehrere Dateisysteme wie die Schichten einer Zwiebel übereinanderliegen. Ausgangspunkt ist ein Base Image (z. B. Ubuntu), das im Docker Hub fertig zur Verfügung steht. Das Base Image ist schreibgeschützt. Es wird aber eine beschreibbare Schicht darübergelegt, in der Sie neue Dateien erstellen können (z. B. Installation eines Webservers wie NGINX). Wenn Sie eine bestehende Datei ändern, wird diese in die beschreibbare Schicht kopiert und dort verändert. Ihr Image können Sie im nächsten Schritt nach der gleichen Logik als Basis für ein noch weiter spezialisiertes Image verwenden. Die Images sind also schlank, weil nur die Änderungen, nicht komplette Kopien der Base Images enthalten sind. Das erleichtert das Teilen (z. B. über den zuvor erwähnten Docker Hub) und Wiederverwenden enorm. Auf Grundlage eines Images können Sie einen Docker-Container starten. Images sind also das Packaging-Format während Container für die Ausführung verantwortlich sind. Für Anwendungen macht die Tatsache, dass sie in einem Container laufen, keinen Unterschied im Vergleich zur Ausführung auf einem physischen oder klassisch virtualisiertem Computer. Nicht triviale Anwendungen bestehen heute aus vielen verschiedenen Komponenten wie Datenbank, Caching-Service, Service-Bus, Webserver etc. Die Grundidee von Docker ist, dass jeder Service in einem eigenen Container isoliert werden kann. Man spricht in diesem Zusammenhang auch von Microservices. Um das zu erreichen, enthält Docker vielfältige Möglichkeiten zum Verknüpfen von Containern über Netzwerkports (Container Linking) oder das Dateisystem (Data Volumes). Neugierig geworden, wie Docker in der Praxis aussieht? Der nachfolgende Artikel „Docker und .NET – ein Beispiel“ (Seite XX) zeigt ein durchgängiges Beispiel mit Docker und ASP.NET vNext. Bevor wir zum Code übergehen, lassen Sie uns zusammenfassen, was Docker für uns Softwareentwickler bereithält.

Zusammenfassung

Der Schritt von heute üblicher Virtualisierung zu Docker hat ähnlich große Konsequenzen wie der Schritt weg von physischer Hardware, den wir vor Jahren erlebt haben. Statt tagelang auf die Lieferung eines neuen Servers zu warten, ist heute ein virtueller Rechner binnen Minuten vorbereitet. Durch Docker reduziert sich diese Zeit auf Sekunden. Dazu kommen bequeme Möglichkeiten zum Wiederverwenden und Verteilen von Images. Für uns als Softwareentwickler fallen dadurch viele Probleme weg. Anwendungen, die sich auf einem Server gegenseitig negativ beeinflussen, gehören der Vergangenheit an. Warum nicht auf dem Entwicklerlaptop die komplexe Cluster-Struktur der Produktivumgebung nachstellen, wenn die entsprechenden Docker-Container sowohl hier als auch dort ausgeführt werden können? Die Anwendungsmöglichkeiten sind vielfältig. Als Windows-Entwickler heißt es aber, noch etwas Geduld zu haben. Docker unter Windows ist Zukunftsmusik, wurde aber für die nächste Version von Windows-Server schon angekündigt. Nachdem .NET mittlerweile in großen Teilen bereit für Linux ist und andere Plattformen wie Node.js von Natur aus Linux unterstützen, kann vielleicht die eine oder andere Entwicklerin schon jetzt von der neuen Containertechnologie profitieren.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -