Anwendungsvirtualisierung Docker-Container bei der Software-Entwicklung nutzen

Autor / Redakteur: Christian Rentrop / Stephan Augsten

Mit der Open-Source-Virtualisierung Docker lassen sich Anwendungen in geschützten VM-Containern einrichten, entwickeln und nutzen. Durch System-Level-Virtualisierung bleibt der Overhead gegenüber VirtualBox und Co. aber klein – und die Anwendung frei migrier- und skalierbar.

Anbieter zum Thema

Während der Container ein geschlossenes, verkapseltes System darstellt, hat der „Unterbau“ bestenfalls Einfluss auf die Geschwindigkeit.
Während der Container ein geschlossenes, verkapseltes System darstellt, hat der „Unterbau“ bestenfalls Einfluss auf die Geschwindigkeit.
(Bild: Bernard Spragg. NZ - flickr.com / CC0 )

Um das Prinzip der Virtualisierungslösung Docker zu verstehen, genügt es, sich an einen größeren Fluss oder eine Bahnstrecke zu stellen: Wann immer ein schweres Transportschiff oder ein langer Güterzug vorbeizieht, sieht man vor allem eines: Massenhaft Container!

Die weltweit standardisierten Boxen sind heutzutage unerlässlich für den weltweiten Handel, die gesamte Infrastruktur ist an sie angepasst. Der Container an sich ist ein geschlossenes, verkapseltes System und der „Unterbau“ – Schiff, Eisenbahn, LKW, ja sogar das Flugzeug – hat bestenfalls Einfluss auf die Geschwindigkeit des Transports.

Gleichzeitig kann der Container sich aber nicht selbst transportieren – ohne die passende Basis nutzt er nichts. Ähnlich ist es auch bei der Virtualisierungslösung Docker, der sich damit allerdings perfekt für die Entwicklung und den Betrieb skalierbarer Anwendungen und Systeme eignet.

Der Übersee-Container der Virtualisierungslösungen

Ähnlich wie beim Übersee-Container entscheidet nämlich nicht der Inhalt, sondern die Bauform über die Nutzbarkeit: Docker-Container enthalten alle notwendigen Bauteile, um eine virtuelle Maschine zu betreiben – aber eben auch nur diese. Den Rest erledigt der Host-Unterbau, dessen Linux-Basis Docker in Form Systemlevel-basierter Virtualisierung verwendet. Das hat den Vorteil, dass Docker keine Hardware emulieren und keine zusätzliche Betriebssysteminstanz einbinden muss, wie es etwa bei der beliebten VirtualBox von Oracle nötig ist.

Um auch hier bei der Container-Analogie zu bleiben: Während Docker ein Übersee-Container ist, ist VirtualBox eher ein Lastwagen mit eigenem Motor und Rädern. Beide haben ihre Vor- und Nachteile. Man muss allerdings kein Ingenieur sein, um zu erkennen, dass der Lastwagen, würde er nur auf Schiffen und Zügen transportiert, permanent unnötig Platz und Ressourcen verbrauchte.

Der Vorteil isolierter Applikationen

Die Docker-Engine ersetzt den in virtuellen Maschinen üblichen Hypervisor für die Hardware-Emulation und macht damit das zusätzlich virtualisierte Betriebssystem samt des damit verbundenen Aufwands für Wartung und Pflege dieses zusätzlichen Systems – des „Antriebsstrang“ des LKW – überflüssig: Alle für den Betrieb benötigten Komponenten befinden sich im Container, die Umgebung ist vom Host-System isoliert.

Anders als bei einer Sandbox müssen zusätzliche Software-Komponenten – etwa ein Apache-Webserver – aber auch nicht im Host-System installiert werden. Durch diese Idee „isolierter Applikationen“ ist Docker besonders ressourcensparend und effektiv nutzbar, insbesondere bei Hosting- und Cloud-Anwendung. Zumal der Container jederzeit auf leistungsfähigere Hardware umgezogen und damit skaliert werden kann.

Auch Ausfälle treten nicht mehr auf: Bricht ein Server zusammen, kann die Docker-VM einfach auf einen anderen Rechner gesetzt werde. Damit ist Docker optimal für die Entwicklung immer komplexerer Cloud-Anwendungen. Kein Wunder also, dass Docker trotz seines noch relativ geringen Alters bereits viele Freunde gefunden hat: Die Amazon Web Services nutzen die Software, zudem ist sie Teil einiger wichtiger Linux-Distributionen. Unternehmen wie Microsoft, IBM und Hewlett-Packard unterstützen die Docker-Entwicklung im Rahmen einer Partnerschaft.

Docker ist praktisch für Entwickler

Für Entwickler bietet das natürlich einige Vorteile: Einerseits wird Docker bereits heute von vielen großen und wichtigen Unternehmen genutzt und ist damit ein weiterer (inoffizieller) Standard. Gleichzeitig hat Docker aber auch einige praktische Vorteile für die Software-Entwicklung, so zum Beispiel die Möglichkeit, dass Entwicklungsumgebung und Produktionsumgebung komplett identisch sind.

Die Software läuft also später im gleichen Docker-Container, in dem sie entwickelt wurde, was das Risiko von Bugs, die durch Portierungs- und Versionsprobleme verursacht werden, nicht nur reduziert, sondern quasi ausmerzt. Das gilt natürlich bereits bei der Entwicklung: Docker bietet die Möglichkeit, ein ganzes Team mit einer nicht nur einheitlichen, sondern einer identischen Entwicklungsumgebung auszustatten.

Und auch zu Testzwecken haben die Docker-Container Vorzüge. Da Software nicht im Host-System, sondern in einem Container installiert wird, entfällt beim Testen der Aufwand, verschiedene Software-Versionen zu installieren oder vollständige VirtualBox-VMs mit verschiedenen Betriebssystemen und Softwareständen einzurichten und zu pflegen. Wird softwareseitig etwas benötigt, kann es einfach dem Docker-Container hinzugefügt werden. Und zu guter Letzt ist natürlich auch die Kompilierung von Anwendungen einfacher – da auch unter MacOS und Windows die gleiche VM-Umgebung eingesetzt wird.

Docker in der Praxis

Die Erstellung von Docker-VMs ist dementsprechend sinnvoll – und auch einfach zu bewerkstelligen: Nach der Installation der Software stellt die Docker-Engine alle notwendigen Funktionen zur Verfügung. Gesteuert wird Docker via Kommandozeile. Zunächst muss der Unterschied zwischen Docker-Container und Docker-Image verinnerlicht werden. Die Begriffe werden synonym verwendet, der Unterschied ist letztlich, ob es sich um eine VM als Datei (Image) oder eine laufende VM (Container) handelt.

Das eigentliche Anlegen des Images ist dann erstaunlich simpel: Zunächst wird mit einem Standard-Unix-Befehl wie „touch“ eine sogenannte Dockerfile angelegt, eine Textdatei, die Anweisungen enthält, was die Docker-VM zu tun hat. Wichtig ist: Diese Dockerfile muss auch exakt so heißen, der Kommandozeilen-Befehl lautet also

touch Dockerfile

Anschließend können Sie die Dockerfile mit einem Editor wie nano bearbeiten.

In diesem Dockerfile wird üblicherweise ein Basis-System aufgerufen, zumeist ein Linux. Auf Grundlage dieses Systems – es wird nicht komplett geladen – bauen Sie dann die Dockerfile auf und geben wie bei einem Script ein, was geschehen soll. Hier können Sie zum Beispiel Prozesse aufrufen, Bibliotheken laden oder Skripte laufen lassen. Das erfolgt mit Hilfe von Umgebungsvariablen, die auf der Docker-Website erklärt werden. Anschließend müssen Sie das Dockerfile abspeichern.

Die eigentliche Erstellung des Docker-Images erfolgt dann mit dem Befehl

docker build

innerhalb des Dockerfile-Verzeichnisses.

Dieses Image hat zunächst nur eine ID. Diese können Sie kopieren und dem Image mit dem Befehl

docker run --name name-des-containers ID

einen neuen, eindeutigen Namen verpassen. Das war es dann auch schon.

Mit dem Befehl

docker run name-des-containers

starten Sie die Docker-VM. Alles, was jetzt passiert, erfolgt innerhalb dieser VM. Um sie zu verlassen, müssen Sie nur ein weiteres Terminal-Fenster starten und hier

docker stop

eingeben, um die Docker-VM wieder zu beenden. Auf diese Weise können Sie beliebige Docker-Container erstellen. Sinnvoll ist, als Basis-Linux ein sehr simples Linux zu verwenden, um den Speicherplatz des Docker-Containers nicht unnötig aufzublähen.

Über die Dockerfile lässt sich genau bestimmen, welche Komponenten des Basis-Systems wie verwendet werden sollen, wodurch Docker-Container ausgesprochen schlank und ressourcenschonend arbeiten. Und natürlich können die fertigen Docker-Container genau wie echte Übersee-Container problemlos ausgetauscht werden – solange auf dem Host-System die Docker-Umgebung installiert ist.

(ID:44546190)