Aus Linux-Magazin 08/2013

Linux Containers verwalten mit Docker

© 36clicks, 123RF.com

Docker ist das englische Wort für Hafenarbeiter. Das passt, denn die gleichnamige Software füllt und verschiebt Container – die unter anderem Webanwendungen enthalten.

Docker ist ein noch junges Open-Source-Werkzeug [1], das Deployments von Betriebssystemen und Webanwendungen um eine Facette erweitert. Es erzeugt und verwaltet Betriebssystem-Images mit vorkonfigurierten (Web)-Anwendungen, die der Admin verändert, teilt und auf Servern mit einer nur rudimentären Linux-Basis ausführt.

LXC (Linux Containers) heißt die Technologie, von der Docker abhängt und die auch Heroku für die Dynos einsetzt [2]. Sie steckt seit Version 2.6.29 im Kernel und stützt sich auf das Control-Groups-Feature [3]. Einen stabilen Support für LXC gibt es erst seit Kernel 3.8, was zur Folge hat, dass Docker nur auf Maschinen mit neueren Kernelversionen läuft [4].

Containerschiffe

Ein typisches Beispiel für eine Docker-Ladung wäre der LAMP-Stack. Er hängt von einer festgelegten PHP-Version ab, einer bestimmten Apache-Konfiguration und der Installation spezifischer Pakete. LAMP auf verschiedene Plattformen verteilen ist aufwändig, weil es unterschiedliche Paketmanager gibt und es zu Konflikten mit den Konfigurationen anderer Anwendungen kommen kann, die in derselben Umgebung laufen.

Docker isoliert die Komponenten in so genannten Containern, sodass Apache auf einem eigenen Betriebssystem läuft, frei von Konflikten mit Prozessen auf dem Hostsystem. Diese Container lassen sich als Images speichern, die man lokal bearbeiten, teilen und auf Server ausliefern kann. Der Admin muss also keine vorgegebene Umgebung für eine Anwendung schaffen, denn die bringt ihre Abhängigkeiten gleich mit.

Das Prinzip erinnert stark an die Images für virtuelle Maschinen, funktioniert aber ein wenig anders. Im Unterschied zu Hypervisor-basierten VMs wie Xen ist LXC keine vollständige virtuelle Maschine mit Hardware-Emulation, sondern bietet einen separaten Prozessraum samt Netzwerkschnittstelle an, in dem die Anwendungen laufen. Das Control-Groups-Feature des Kernel ermöglicht es, Prozessgruppen zu isolieren. Das hat den Nachteil, dass unter LXC keine Nicht-Linux-Systeme laufen. Dafür brauchen die Container weniger Ressourcen und starten spürbar schneller.

Befehlsgewalt

Docker verbindet LXC mit weiteren unterstützenden Technologien und verpackt das Ganze in einem intuitiv zu bedienenden Kommandozeilen-Interface. Zu den absetzbaren Kommandos gehört unter anderem »diff« , das es ermöglicht, das Dateisystem eines Containers mit dem seines Ursprungs-Image abzugleichen. Der »commit« -Befehl wiederum erstellt ein neues Image, in das die an dem Container vorgenommenen Änderungen einfließen, und »push« schickt die Kopie eines Image an den Docker-Index [5], ein Repository mit öffentlich zugänglichen Docker-Images.

Nicht alles passt

Für einige Anwendungsfälle eignet sich Docker weniger: Container können keine abweichenden Architekturen emulieren oder etwas anderes als den Linux-Kernel beherbergen. Auch die Sicherheit ist noch Work in Progress: User Namespaces, eine wichtige Komponente, um unerlaubte Zugriffe auf die Ressourcen des Hostsystems zu verhindern, gibt es erst ab Kernel 3.8.

Ein anderes Problem von Docker besteht darin, dass es das stapelbare Dateisystem Aufs benötigt, das nicht viele Kernel von Hause aus unterstützen. Daher arbeiten die Entwickler an einer Migration zu Btrfs oder Overlay-FS [6].

Container beladen

Als Beispielanwendung soll hier ein Docker-Image entstehen, auf dem ein LAMP-Stack läuft. Naturgemäß muss der Admin Docker dafür zunächst installieren. Wer Ubuntu 12.10/13.04 verwendet, ist aus dem Schneider und folgt einfach der Anleitung auf der Docker-Webseite. Andere Nutzer lassen Ubuntu entweder in einer virtuellen Maschine laufen oder greifen zu inoffiziellen Docker-Paketen, die es etwa für Open Suse 12.3 [7] und Gentoo [8] gibt.

Im nächsten Schritt gilt es, ein Basis-Image für den Container auszusuchen. Die Wahl fällt auf Centos, aber auch Ubuntu, Debian und weitere Distributionen stehen bereit. Docker bietet ein Verzeichnis öffentlich zugänglicher Images an, das man über »docker pull« anzapft:

$ docker pull centos

Ist das Basis-Image heruntergeladen, lässt sich ein neuer Container erzeugen:

$ docker run -i -t centos /bin/bash

Das startet die Bash als interaktiven Prozess. Der Entwickler tippt nun Befehle ein und führt im Container Anwendungen aus. Weil es sich bei dem Centos-Image nur um eine Minimalversion handelt, installiert der Docker-Nutzer den LAMP-Stack nach – natürlich über Yum:

$ yum install httpd php php-common php-cli php-pdo php-mysql php-xml php-mbstring mysqlmysql-server

Speichert der Admin den Container als Image, steht ihm für spätere Experimente bereits ein Container mit vorinstalliertem LAMP-Stack zur Verfügung. Nach Eingabe von »exit« landet der Docker-Anwender dann wieder auf der Konsole des Hostsystems. Hiermit zeigt

$ docker ps -a
ID IMAGE COMMAND CREATED STATUS COMMENT PORTS
1758290cbef2 centos:latest /bin/bash8 minutes ago Exit 0

das derzeit laufende Image an. Die Nummer unter »ID« identifiziert den eingesetzten Container. Sie lässt sich verwenden, um mit Docker ein neues Image zu erstellen:

$ docker commit 1758290cbef2 LAMP

Das trägt nun den Namen »LAMP« . Ein weiterer Befehl listet alle existierenden Images auf:

$ docker images
REPOSITORY TAG ID CREATED
LAMP latest 7c34f69c3f93 9 seconds ago

Der neue Container lässt sich dann wie das eben erstellte Image über

$ docker run -i -t LAMP / bin/bash

aufrufen. Der Befehl »php -v« prüft, ob PHP läuft.

LAMP in Aktion

Ein Webserver nützt nicht viel, wenn er keine Webseiten anbietet. Um einen Netzwerkzugriff zu ermöglichen, bietet Docker die Option, Ports vom Container an den Host weiterzuleiten. Dazu schließt der Entwickler den aktuellen Container und ruft ihn neu auf, wobei er zugleich Port 80 weiterleitet:

$ docker run -i -t -p :80 LAMP /bin/bash

Läuft Docker in einer virtuellen Maschine, muss der Admin zusätzlich Port 80 der VM an einen Port der Hostmaschine weiterleiten. Über den Befehl

$ echo "<?php echo 'Hello, world'; ?>" > /var/www/html/index.php

baut der Admin eine kleine Testwebseite und ruft dann über »/sbin/service httpd start« den Apache-Server auf. Über den Browser lässt sich nun die in Abbildung 1 gezeigte Webseite aufrufen. Ab diesem Punkt kann der Admin beliebige Open-Source-Webanwendungen installieren, etwa Drupal oder WordPress.

Abbildung 1: Im Docker-Container läuft ein Apache-Server, der eine einfache Webseite ausliefert.

Abbildung 1: Im Docker-Container läuft ein Apache-Server, der eine einfache Webseite ausliefert.

Es geht ein Schiff …

Docker ist derzeit noch Alphasoftware und nicht serienreif. Features wie die Fähigkeit, Speichermedien des Hostsystems in den Container einzubinden, befinden sich noch in der Entwicklung. Ein Projekt, um Docker als Backend-Anbieter für Vagrant (ein Tool für virtuelle Entwicklungsumgebungen) zu nutzen, ist zwar bereits in Arbeit, aber noch nicht fertig. Das Build-Filesystem, über das sich die Image-Erstellung skripten lässt, könnte durchaus bedienungsfreundlicher sein. Nicht zuletzt dauern die Aufräumarbeiten nach einem Build-Fehler noch deutlich zu lange.

Allerdings betreibt das Docker-Team einen sehr offenen Entwicklungsprozess auf Github [9]. Dort diskutieren sie neue Ideen öffentlich mit der Community. Langfristig möchte das Team eine breitere Palette an Kerneln, verschiedene Backends sowie Alternativen zu LXC und Aufs anbieten. Eine Plugin-Architektur soll eine bessere Integration in bestehende Cloudprovisioning-Tools ermöglichen. Docker ist aber schon jetzt eine großartige Idee, die aktuelle Version demonstriert schön das Potenzial Container-basierter Deployments.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 2 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben