© saicle/Shutterstock.com
Eine Einführung in die System-Level-Virtualisierung

Docker-Basics


Möchte man sich tiefer in eine neue Technologie einarbeiten, ist fundiertes Grundlagenwissen unabdingbar. Zum Auftakt dieses Entwickler Magazin Spezials möchten wir Sie deshalb in die Basics von Docker einführen. Dabei wird unter anderem demonstriert, wie man hundert virtuelle Maschinen auf einem eigenen Rechner starten kann. Alle Beispiele können von GitHub heruntergeladen und ausprobiert werden.

Der Einsatz von virtuellen Maschinen hat viele Vorteile. Sie lasten Hardware besser aus, man kann leicht Backups machen und einzelne Dienste auf einer Hardware voneinander isolieren. Virtuelle Maschinen haben aber auch Nachteile. Ihre Images sind meist mehrere Gigabytes groß und sperrig. Wesentlicher ist jedoch, dass virtuelle Maschinen viele Ressourcen verbrauchen, da stets ein gesamter Rechner emuliert und ein Betriebssystemkernel gestartet werden muss. Docker [1] ist eine leichtgewichtige Alternative, die System-Level-Virtualisierung unter Linux nutzt und so die Vorteile von virtuellen Maschinen ohne die genannten Nachteile erreicht. Dieser Einführungsartikel bezieht sich auf die Docker-Version 1.2.0. Alle Beispiele sind vollständig auf GitHub unter [2] verfügbar.

Was ist Docker?

Docker hat in diesem Jahr sehr viel Traktion entwickelt und wird in aktuellen Distributionen von Red Hat und Ubuntu ausgeliefert. Firmen wie Spotify, Google, BBC, eBay, CenterDevice und seit Kurzem auch Zalando setzen Docker bereits produktiv ein. Die geschickte Kombination aus Laufzeitumgebung und Image Repository erleichtert den Einsatz von virtuellen Maschinen enorm. Zur Unterscheidung von Hypervisor-basierten virtuellen Maschinen wird von System-Level-basierten virtuellen Maschinen oder einfach Containern gesprochen. Damit ist Docker ein hervorragendes Werkzeug, um die tägliche Arbeit von Entwicklern und Administratoren zu vereinfachen.

Docker nutzt spezielle Kernelfunktionalitäten, um einzelne Prozesse in Containern voneinander zu isolieren. Für Prozesse, die mit Containern gestartet werden, scheint es so, als würden sie auf einem eigenen System laufen. Bis Version 0.8.1 setzte Docker für die Prozess­isolation das Linux-Containers-Projekt (LXC, [3]) ein. Seit Version 0.9 bringt Docker eine eigene Containerbibliothek namens libcontainer [4] mit. LXC wird jedoch weiterhin unterstützt.

Die Basis von Linux-Containern sind Kernel-Name­spaces, cgroups und Containertemplates. Wie Java Packages ermöglichen Kernel-Namespaces eigene Namensräume für Prozesse zu erzeugen. Prozess-IDs, Mount Points, Netzwerkgeräte und mehr können so pro Prozess wiederverwendet werden. Zum Beispiel können zwei Prozesse auf die Netzwerkschnittstelle eth0 zugreifen, die jedoch tatsächlich vom Kernel auf die zwei physikalischen Schnittstellen eth1 und eth2 gemappt werden. Die Prozesse bekommen davon nichts mit. cgroups ist eine Kernelerweiterung, die ursprünglich von Google entwickelt worden ist und es erlaubt, Ressourcenbeschränkungen auf Prozessebene zu definieren. Damit lässt sich zum Beispiel festlegen, wie viel Speicher ein Prozess nutzen darf. Containertem­plates sind eine Konvention einer Verzeichnisstruktur, die das Root-Dateisystem eines Linux-Containerprozesses darstellt.

Solche Linux-Container werden zum Beispiel von Heroku eingesetzt, um Prozesse einzelner Kunden voneinander zu trennen. Docker ist eine offene Implementierung dieses Konzepts, das darüber hinaus noch viele weitere spannende Funktionen mitbringt. Ferner bietet es Werkzeuge zum Erstellen, Austauschen und Ausführen von Linux-Containern, sodass diese einfach genutzt werden können. Es wird als Open Source federführend von der Firma Docker, Inc. entwickelt.

Ein typisches „Hello World“ mit Docker zeigt das Listing 1. Was hier genau passiert, wird im Folgenden genau erklärt.

Listing 1

> docker run -t ubuntu:14.04 /bin/echo "Hello World" Unable to find image 'ubuntu:14.04' locally Pulling repository ubuntu 826544226fdc: Download complete 511136ea3c5a: Download complete b3553b91f79f: Download complete ca63a3899a99: Download complete ff01d67c9471: Download complete 7428bd008763: Download complete c7c7108e0ad8: Download complete Hello World

Docker-Bestandteile

Docker besteht grundsätzlich aus drei Teilen: Docker Daemon, Docker-Images und Docker Repository (Abb. 1). Der Docker Daemon verwaltet die Laufzeitumgebung von Docker-Containern. Genauso wie virtuelle Maschinen auf Images basieren, basieren Docker-Container auf Docker-Images. Diese unterscheiden sich jedoch in einem wichtigen Punkt von Images in virtuellen Maschinen: Sie sind stapelbar. Docker Repositories sind eine Art GitHub für Images. Images werden in Repositories wie in einem Source Code Repository versioniert abgelegt. Es gibt ein öffentliches, von Docker, Inc. betriebenes Repository, das Docker Hub genannt wird. Dort findet man für sehr viele Dienste, wie zum Beispiel MongoDB, RabbitMQ, Redis, CouchDB, Elasticsearch, Postgres, MySQL, Apache Tomcat etc. fertige Images. Es werden auch komplette Stacks für Programmiersprachen wie Go, Java, Ruby etc. angeboten. Alle Images aus diesem Artikel findet man ebenfalls unter [5]. Man kann aber auch private, nur für einen geschlossenen Personenkreis zugängliche Repositories betreiben. Im Artikel „Docker-Tools und -Helferlein“ auf der Entwickler-Magazin-Website [6] wird beschrieben, wie man eine eigene Docker Registry betreiben kann.

pustina_basics_1.tif_fmt1.jpgAbb. 1: Bestandteile von Docker – siehe auch [7]

Abbildung 1 veranschaulicht die Bestandteile von Docker und zeigt, wie diese miteinander verbunden sind. Zusätzlich wird boot2docker dargestellt, das Docker auf Windows und OS X mithilfe von VirtualBox zugänglich macht. Weitere Details dazu lesen Sie weiter unten im Abschnitt Installation.

Stapelbare Dateisysteme

Bei stapelbaren Dateisystemen werden einzelne Schichten aufeinander gelegt. Jede dieser Schichten wird dabei getrennt erstellt. Bekannt ist dieses Verfahren von so genannten Live-CDs, bei denen ein Betriebssystem von einer CD gestartet wird. Dabei ist der Inhalt der CD unveränderbar. Um dennoch Dateien anlegen und löschen zu können, wird zunächst der Inhalt der CD als nur-lesbar gemountet und anschließend eine zweite, im Hauptspeicher gehaltene, schreibbare Schicht über die erste gelegt. So entsteht für den Benutzer die Illusion eines schreibbaren Dateisystems mit allen Dateien der CD.

Das gleiche Prinzip verwendet Docker für Images. Im Gegensatz zu Images von virtuellen Maschinen werden Änderungen an Docker-Images Schicht für Schicht gespeichert. Auf diese Weise genügt es, nur diese Änderungen zu speichern, sodass Docker-Images kleiner ausfallen und wiederverwendbar sind.

Abbildung 2 zeigt ein Beispiel dazu. Ausgehend von einem Debian-Basis-Image werden in zwei Schichten zunächst Emacs und Apache hinzugefügt. Dieses Dr...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang