Virtualisierungs-Tool

Docker - wo das Virtualisierungs-Tool helfen kann (und wo nicht)

22.05.2015
Von 


Matthias Lübken arbeitet als “the product guy” bei Giant Swarm in Köln. Dabei ist er auf der ständigen Suche nach dem perfekten Umgang mit Containern und Microservices.
Mit Docker lassen sich Anwendungen und Services in leichtgewichtige, unabhängige und wiederverwendbare Container kapseln. Aber was genau ist Docker, und wo liegen die Vorteile im Vergleich zu herkömmlichen Virtualisierungstechnologien?

Im vergangenen Jahr verging kaum eine Woche ohne eine neue Meldung zum Virtualisierungs-Tool Docker. Ganz gleich, ob es sich bei den Neuigkeiten um technische Neuerungen, aufkommende Konkurrenten, neue Partner oder immense Finanzierungsrunden handelt: Es besteht offensichtlich ein reges Interesse an Linux-Containern. In diesem Zusammenhang fallen immer wieder die Begriffe App-Container und Microservices. Was es hiermit auf sich hat und warum diese den aktuellen Container Hype begründen, wollen wir in diesem Artikel beleuchten. Zudem zeigen wir auf, wie Container in die aktuelle Landschaft von Virtualisisierungslösungen passen.

Die Technik hinter Docker

Obgleich sich Docker heute als allgemeine Plattform für verteilte Systeme vermarktet, liegt der Kern von Docker in Linux-Containern. Derartige Konzepte wurden bereits in anderen Betriebssystemen verfolgt, wie z.B. Jails in FreeBDS oder Zones in Solaris.

Container im Linux-Umfeld sind im Grunde ein Sammelbegriff für verschiedene Features des Linux-Kernels wie z.B. Namespaces und Cgroups. Da diese Kernel-Technologien für Anwender eher unzugänglich sind, wurde 2008 LXC (LinuX Containers) gestartet. Anwender waren hier hauptsächlich Systemadministratoren, die schnell eine neue Umgebung des Linux Hosts starten wollten. Es sollte ein komplett unabhängiges Betriebssystem gestartet werden, in dem allen Anwendungen und Benutzern suggeriert wird, auf einem komplett unabhängigen System zu laufen.

Diese Ziele verfolgen auch VMs (Virtuelle Maschinen). Entscheidender Unterschied ist jedoch, dass sich Linux-Container einen gemeinsamen Kernel teilen. Alle Container laufen hier also auf einem gemeinsamen Host-Betriebssystem. Bei VMs wird dagegen die komplette Hardware simuliert. So kann und muss jede VM ihr eigenes Betriebssystem mitbringen.

Der gemeinsame Kernel wird aber nicht als Nachteil gesehen. Vielmehr herrscht bei den Befürwortern von Containern die Auffassung, dass das Host-Betriebssystem nicht ausgetauscht werden muss. Im Gegenteil: ein gemeinsamer Linux-Kernel erlaubt vielmehr eine effizientere Ressourcenteilung.

Docker

Foto: Crisp Research

Docker setzt auf den oben genannten Technologien auf: So wurden intern bis zu Version 0.8 LXC verwendet, um Container zu starten. Zudem fügt Docker einige Funktionen hinzu, die den Umgang mit Containern wesentlich vereinfachen. Herauszustellen ist die Etablierung eines Container-Formats, das es ermöglicht, denselben Container auf verschiedenen Hosts laufen zu lassen.

Mit Docker kann man nun seinen Container beschreiben und ihn entweder direkt oder über eine Registry mit anderen Entwicklern austauschen. Das Container-Format hat dabei sehr hilfreiche Funktionen wie Layer, welches erlaubt auf bestehenden Container aufzubauen. Diese vordefinierten Container sind in einer großen Anzahl auf einer öffentlichen Registry verfügbar. Auch das Erstellen von eigenen Containern wird mit Docker wesentlich vereinfacht. Hierdurch sind bereits eine Reihe von Best Practices zum Entwickeln von Containern in der Docker Community entstanden.

Docker verpackt all diese Funktionen in eine vorkonfigurierte Umgebung mit einem Client und einer Laufzeitumgebung inklusive API. Die einfache Installation eröffnet auch weniger Linux-versierten Entwicklern den Zugang zu Containern.

Microservices

Der Erfolg von Docker ist von einem weiteren Trend getrieben. Bereits seit einigen Jahren werden Internet-Anwendungen stärker in einzelne Services modularisiert. Hat man z. B. eine E-Commerce Anwendung, wird diese nicht mehr als großer Monolith entwickelt, sondern in einzelnen Modulen, z. B. die Suche im Shop und ein Empfehlungsdienst für weitere Produkte. Diese Services bieten ihre Funktionen komplett autark an und können unabhängig vom Rest des Systems entwickelt werden.

Diese Architektur ist schon länger als Service-orientierte Architektur, kurz SOA, bekannt. Auch wenn im klassischen SOA nicht wirklich von unabhängigen Komponenten gesprochen werden konnte, war dies letztendlich die Idee hinter dem Architekturprinzip. Wo eine agile Architektur gefragt ist, erfuhr das Prinzip in den letzten Jahren eine Renaissance. Einzelne Komponenten sollen unabhängig entwickelt und - noch viel wichtiger - "deployed" werden können. Als Beispiel aus dem E-Commerce: Eine neue Version der Empfehlungs-Engine soll von einem autarken Team entworfen, entwickelt, deployed und betrieben werden, ohne andere Teams zu beeinflussen. Das Augenmerk liegt auf dem unabhängigen Deployment, was zurzeit vor allem unter dem von Martin Fowler geprägten Begriff "Micro Service Architektur" bekannt ist.

Bei der technischen Implementierung wollen die Teams frei in der Auswahl der Sprache und des Frameworks sein. Wichtig ist hierbei weiterhin, dass die Dienste unabhängig von den Anderen zu entwickeln und deployen sind. Viele Teams haben hierbei in den letzten Jahren auf Automatisierungs-Tools wie Chef oder Ansible gesetzt. Trotzdem führte dieser Ansatz nicht bei allen Entwicklungsteams zu Zufriedenheit. Der Umgang mit VMs war schwerfällig und auf einem Entwicklungsrechner reichen die Ressourcen oft nicht aus, um mehrere VMs laufen zu lassen.

Anwendungsentwickler als Nutzer von Containern

Zurück zu Docker: Docker hat die Einstiegshürde für den Umgang mit Containern so stark gesenkt, dass diese nun nicht mehr nur Systemadministratoren vorbehalten sind. Anwendungsentwickler nutzen Container, um ihre Anwendungen zu modularisieren und einzelne Services in einzelnen Containern unabhängig voneinander zu deployen. Container ermöglichen also eine agile und effiziente Umsetzung einer Micro Service Architektur.

In dieser Sichtweise liegt auch der Unterschied und die Abgrenzung zu VMs. Docker bewirbt die Entwicklung von einzelnen Services bzw. Anwendungen pro Container. Bei VMs werden außerhalb der Microservices Architekturen dagegen ganze Systeme mit einer Reihe von Services und Anwendungen virtualisiert. Dies verdeutlicht auch die unterschiedlichen Anforderungen an Container und VMs: Container erlauben die leichtgewichtige Entwicklung von unabhängigen Services, während VMs ein bewährtes Konzept der Virtualisierung von Hardware Ressourcen nebst der damit einhergehenden Sicherheit darstellen.

Dies ist eine Momentaufnahme: Die Entwicklung hin zu mehr Container-basierten Systemen ist absehbar. Bereits heute gibt es eine Vielzahl von Möglichkeiten, Container sicher voneinander zu trennen. Sie werden mit neueren Sicherheitsfeatures im Linux-Kernel sukzessive verbessert. Hingegen bieten VMs eine Vielzahl von Tools, die das Management von VMs erleichtern. Hier haben Container-basierte Systeme noch einigen Nachholbedarf.

Fazit

Sowohl VMs als auch Container haben ihre Daseinsberechtigung. VMs sind derzeit die sicherste Möglichkeit, Anwendungen auf einem Host voneinander zu trennen. Demgegenüber ist der leichtgewichtige Umgang mit Containern nun auch für Anwendungsentwickler möglich. Sicher ist, die Entwicklung von Containern wird weiter voranschreiten und zukünftig werden weitere Möglichkeiten im Umgang mit Containern gefunden. So gibt es bereits erste Systeme, die ein komplettes Datencenter abstrahieren und es dem Anwender ermöglichen, seine Container beliebig zu verteilen und zu skalieren. (mb)

"Dieses Thema können Sie auch als Vortrag auf der DWX - Developer Week vom 15.-18. Juni 2015 auf dem Messegelände Nürnberg hören. Mit über 200 Sessions von mehr als 150 Experten ist die Developer Week eine der größten unabhängigen Entwicklerkonferenzen Europas für Web- Mobile und .NET-Entwickler. Weitere Informationen zum Programm und den Experten finden Sie unter www.developer-week.de."