Linux Virtualisierung-Software

So setzen Sie Docker-Virtualisierung richtig ein

23.01.2016 von Thorsten Eggeling
Mit Docker isolieren Sie Software in abgeschotteten Containern. Die Technik eignet sich vor allem für die Webentwicklung und die saubere Trennung von Webdiensten und Betriebssystem.

Virtualisierung erhöht die Sicherheit, weil dabei Betriebssysteme und Programme in abgeschotteten Umgebungen (VM) laufen. Die Vollvirtualisierung wie im Artikel „Virtualbox 5.0“ ab Seite 64 beschrieben fordert allerdings erhebliche Ressourcen des Host-Systems. Zudem müssen Sie Gastsysteme und Anwendungen regelmäßig aktualisieren, um potenzielle Sicherheitslücken zu reduzieren. Docker bietet eine alternative Technik, mit der sich Pflege und Administrationsaufwand für virtualisierte Anwendungen verringern lassen. Die in diesem Artikel verwendeten Beispieldateien und Kommandozeilen können Sie über www.pcwelt.de/docker herunterladen. Entpacken Sie die Datei „docker.tar.gz“ im Home-Verzeichnis. Dabei entsteht der Ordner „docker“.

1. Dienste und Anwendungen im Container-Container

Statt eines kompletten Systems virtualisiert Docker nur Teile davon. Dabei setzt es direkt auf dem laufenden Linux-Kernel auf und nutzt dessen Fähigkeiten geschickt, um isolierte Container für Programme bereitzustellen: Control Groups (Cgroups) limitieren Speicher, CPU-Zyklen und I/O-Leistung für einen Prozess und Kernel-Namespaces isolieren Prozesse strikt voneinander. Für virtuelle Festplatten-Images, die Snapshots und Layer unterstützen, kommen wahlweise die Dateisysteme BTRFS oder AUFS zum Einsatz. Docker dient für alle Komponenten als Verwaltungswerkzeug und definiert ein portables Container-Format, das es erlaubt, Container zwischen Linux-Systemen zu verschieben. Ein weiterer Pluspunkt ist, dass man bei Docker kein Gastsystem benötigt. Docker macht System-Images verbreiteter Linux-Distributionen über ein Online-Verzeichnis verfügbar. Zum Start eines Containers kann Docker einfach das gewünschte Gastsystem über eine Internetverbindung herunterladen. Es gibt aber auch Einschränkungen: Die Technik eignet sich nicht zur Vollvirtualisierung von Systemen, da Docker-Container immer den Linux-Kernel des Host-Systems mitbenutzen. Dementsprechend können Container ausschließlich Linux-Systeme und -Programme enthalten.

Programme starten: In einem Container installieren und starten Sie Programme wie gewohnt.

Docker emuliert auch keine Hardware oder gar andere Prozessorplattformen. Das Konzept hat also mehr mit einer Chroot-Umgebung oder mit Free-BSD-Jails gemein als mit Virtualisierung. Zurzeit ist der Einsatzbereich vor allem auf typische Server-Dienste wie Content-Management-Systeme, Datenbanken oder Mailserver beschränkt. Programme für die grafische Oberfläche sind in Docker eigentlich nicht vorgesehen. Einige Gnome-Entwickler arbeiten im Projekt „Sandboxed Apps“ jedoch an dieser Option. Über ein paar Umwege können Sie schon jetzt etwa einen Firefox aus einem Docker-Container starten (-> Punkt 6).

2. Docker installieren

Docker ist in den Paketquellen populärer Linux-Distributionen meist enthalten. In Ubuntu 14.04/14.10 und seinen Varianten heißt das Paket „docker.io“, bei Fedora 20 „docker-io“. Schuld daran ist ein Namenskonflikt mit dem älteren System-Tray-Tool docker. Auch wenn die Einrichtung über das Paketmanagement einfacher ist, empfehlen wir die manuelle Installation der aktuellsten Version, die wir in diesem Artikel für Ubuntu 14.04 beschreiben. Docker ist noch relativ neu und daher in stetiger Entwicklung, und einige Zusatz-oder Verwaltungsprogramme erfordern neuere Versionen als jene, die im Ubuntu-Repositorium bereitstehen.

Wichtiger Hinweis: Docker unterstützt offiziell nur 64-Bit-Linux-Systeme. Die Installation ist auch auf 32-Bit-Systemen möglich, aber nicht empfehlenswert.

Zur Installation öffnen Sie ein Terminal und führen dort folgende drei Zeilen aus:

sudo apt-get update

sudo apt-get install wget

wget -qO- https://get.docker.com/ | sh

Docker läuft als Systemdienst mit root-Rechten, und auch der Client braucht privilegierte Rechte. Treten Sie der Gruppe „docker“ mit dem Kommando

sudo usermod -a -G docker Benutzername

bei, damit Sie den Docker-Client ohne sudo aufrufen können. Danach starten Sie Linux neu, damit der Docker-Dienst läuft und die Gruppenmitgliedschaft gültig wird.

Grafische Oberfläche für Docker nutzen

Docker im Browser: Panamax ermöglicht die komfortable Konfiguration von Docker-Containern.

Die Akrobatik auf der Kommandozeile ist nicht für jeden Nutzer eine Freude. Grafische Front-Ends für Docker gibt es bisher jedoch nur wenige. Eines davon ist Panamax, über das Sie Docker-Container im Browser-Fenster erstellen können. Bevor Sie das System nutzen können, installieren Sie Virtualbox, wie im Artikel „Virtualbox 5“ ab Seite 64 beschrieben. Zusätzlich benötigen Sie das Tool Vagrant ab Version 1.6. Laden Sie das Installationspaket im Download-Bereich von www.vagrantup.com herunter und installieren Sie es. Danach führen Sie folgende Befehlszeile aus.

curl http://download.panamax.io/installer/ubuntu.sh | bash

Panamax richtet in Virtualbox eine virtuelle Maschine mit der Bezeichnung „panamax-vm“ ein und installiert darin das System Core-OS und Docker. Die Panamax-Oberfläche rufen Sie im Browser über „ http://panamax.local:3000“ auf.

Für einen ersten Test klicken Sie auf „Manage“, auf „Application“ und dann auf „Create a New Application -> From a Docker Compose YAML“. Über „Browse local files“ öffnen Sie die Datei „docker-compose.yml“ aus dem Verzeichnis „Panamax“ der entpackten Beispielsammlung „docker.tar.gz“. Klicken Sie auf „Run Compose YAML“. Die Oberfläche wechselt zur Ansicht „Application Services“. Im Bereich unter „Application Activity Log“ sehen Sie die Ausgaben der startenden Container. Es gibt drei Docker-Container mit den Namen „wordpress“, „mariadb“ und „jwilder_nginx-proxy“. Per Klick auf den jeweiligen Link dahinter können Sie die Eigenschaften etwa unter „Environment Variables“ ansehen und bearbeiten. Die Wordpress-Startseite rufen Sie im Browser über „ http://panamax.local“ auf.

Neue Applikationen erstellen Sie mit „Create a New Application -> From a Template or Image“. Über die Suche stellen Sie die gewünschten Images zusammen und passen die Konfiguration an.

3. Erste Versuche mit Docker

Als ersten Test erstellen und starten Sie einen Container mit Bash in einem virtuellen Ubuntu:

docker run -t -i --rm ubuntu bash

Docker lädt dabei ein minimales Image von Ubuntu mit etwa 190 MB herunter und startet die Shell in der isolierten Umgebung. Parameter „--rm“ sorgt für ein temporäres Image, alle Änderungen darin gehen also verloren. „-t“ emuliert ein Terminal-Device für bash, und „-i“ ermöglicht dessen interaktive Nutzung. Mit exit beenden Sie diese Shell wieder und schließen den Container.

Eine durchsuchbare Datenbank aller verfügbaren Images gibt es unter https://registry.hub.docker.com. Sie können als Basis neben Ubuntu auch Cent-OS, Fedora oder Debian verwenden. Viele Images enthalten bereits Software, etwa die Datenbank My SQL oder das Content-Management-System Wordpress. Meist benötigen diese eine spezielle Konfiguration oder arbeiten mit anderen Images zusammen. Wenn Sie selbst ein angepasstes Image erstellen wollen, geben Sie folgenden Befehl ein:

docker run -t -i ubuntu bash

Sie befinden sich in der Shell des Containers und installieren mit

den Midnight Commander. Verlassen Sie nun die Shell mit exit. Diesen Container können Sie jetzt mit dem Image verschmelzen. Geben Sie zuerst

docker ps -l

ein, was den gerade neu angelegten Container mit dem installierten Midnight Commander auflistet. Aus der Liste benötigen Sie die Container-ID auf der linken Seite. Lautet diese ID beispielsweise „ceb400fdc892“, dann sichern Sie mit

docker commit ceb400fdc892 ubuntu-mit-mc

den Container-Zustand dauerhaft in ein Image „ubuntu-mit-mc“. Wenn Sie daraus mit

docker run -i -t ubuntu-mit-mc bash

einen neuen Container erstellen, dann können Sie mit dem Befehl mc den dort installierten Midnight Commander im virtuellen Ubuntu starten. Mit exit verlassen Sie den Container.

Remote-Desktop: Einzelne Anwendungen oder kompletten Desktop auf entfernten Rechner holen.

4. Docker-Container verwalten

Welche Container gerade laufen, erfahren Sie über docker ps. Wenn Sie einen interaktiven Container („run -i“) mit exit verlassen, wird er gestoppt. Mit docker -a erhalten Sie eine Übersicht mit allen vorhandenen Containern. Wenn Sie die Beispiele in Punkt 3 ausprobiert haben, dann sehen Sie zwei inaktive Container und deren IDs, die Sie mit dem Befehl

docker start Container-ID

wieder starten können. Mit

docker attach Container-ID

stellen Sie wieder eine interaktive Verbindung zur Shell (wenn vorhanden) des Containers her.

Docker kennt viele weitere Befehle. Eine Übersicht erhalten Sie beim Aufruf ohne Parameter. Der Befehl docker run --help liefert Infos zu weiteren Optionen. Wichtig sind noch die Befehle „rm“, der Container löscht, sowie „rmi“ zum Löschen von Images.

5. Docker-Images per Script bauen

Die in Punkt 3 vorgestellten Kommandos eignen sich für schnelle Tests, sind aber auf Dauer zu umständlich. Neue Images lassen sich jedoch per Script erzeugen. Erstellen Sie eine Textdatei mit dem Namen „Dockerfile“ und diesen Zeilen:

FROM ubuntu:14.04

Wechseln Sie in einem Terminal-Fenster mit cd in das Verzeichnis, in dem Sie die Datei gespeichert haben, und starten Sie die Befehlszeile

docker build -t=ubuntu-mc-2 .

Beachten Sie den Punkt am Ende der Zeile. Durch diesen lädt Docker die Datei „Dockerfile“ aus dem aktuellen Verzeichnis. Hinter „-t=“ steht die Bezeichnung für den neuen Container. Das Ergebnis ist identisch mit dem aus Punkt 3. Hinter allen Image-Downloads stecken derartige „Dockerfile“-Dateien. Einen Link darauf finden Sie bei fast jedem Eintrag im Repository. Die Inhalte lassen sich so leicht analysieren und anpassen.

6. Desktop-Programme starten

Parameter und Befehle im Docker-Script über die sich mehrere Docker-Container erstellen lassen.

Über Docker-Scripts lassen sich auch grafische Anwendungen sowie ein SSH-Server installieren. Vom Host aus verbinden Sie sich dann per SSH mit einem laufenden Container und können über X11-Forwarding auch Desktop-Programme anzeigen. Wie das geht, zeigt die Beispieldatei im Verzeichnis „docker-firefox“. Geben Sie in diesem Verzeichnis zunächst diesen Befehl ein:

docker build -t firefox .

Sollte Firefox laufen, beenden Sie das Programm. Danach geben Sie

docker run -ti --rm -e DISPLAY=$DISPLAY

-v /tmp/.X11-unix:/tmp/.X11-unix firefox

ein. Dabei erhalten Sie wahrscheinlich die Fehlermeldung „Error: cannot open display: :0“. Ursache dafür sind die Sicherheitseinstellungen des X-Servers, der für die Darstellung von Fenstern auf Ihrem Desktop zuständig ist. Geben Sie

xhost +

ein, damit sich X11-Clients auch von anderen Rechnern aus verbinden können, und führen Sie die „docker run“-Zeile erneut aus. Nun startet Firefox ohne Fehler. Das Verfahren hat jedoch Nachteile. Ein so gestartetes Programm liegt zwar im Docker-Container, läuft aber im Kontext des lokalen X-Servers. Ist hier bereits Firefox gestartet, übernimmt die neue Firefox-Instanz dessen Arbeitsverzeichnis, Plug-ins und Add-ons. Damit entfällt die Trennung von Host-System und Container. „xhost +“ reduziert außerdem die Sicherheit. Im Heimnetz ist das kein Problem, in Firmennetzen ist diese Einstellung jedoch nicht zu empfehlen.

Einen anderen Ansatz verfolgt das Image „docker-desktop“. Die dort erwähnten Kommandos haben wir in unserer Beispieldatei im Verzeichnis „docker-desktop“ in den Scripts „1_build-docker-desktop.sh“ und „2_start-docker-desktop.sh“ untergebracht, die Sie nacheinander starten. Das über das Dockerfile erstellte Image enthält einen SSH-und X-Server sowie den Display-Manager xdm. Nach dem Start des zweiten Scripts erfolgt die Verbindung über ssh, wobei Sie das auf dem Bildschirm angezeigte Passwort für die Anmeldung eingeben. Im Container starten Sie dann etwa xterm, firefox oder libreoffice. Alternativ kommt das Tool xpra für die Anzeige des gesamten Desktops zum Einsatz. Dieses Verfahren ist deutlich sicherer, derzeit jedoch noch nicht stabil. Bei unseren Tests starteten die Scripts im Container nicht immer zuverlässig.


7. Webapplikation mit Docker erstellen

Es ist möglich, Container miteinander zu verbinden und dadurch komplexe Anwendungen zu erstellen. So benötigt etwa ein Content-Management-System einen Webserver und eine Datenbank. Diese dürfen in unterschiedlichen verknüpften Containern liegen. Das lässt sich zwar auch direkt mit Docker erledigen, einfacher geht es jedoch mit docker-compose. Installieren Sie das Tool im Terminal nach:

sudo -i

curl -L https://github.com/docker/compose/releases/download/1.4.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-com pose

Verlassen Sie die sudo-Umgebung mit exit, und wechseln Sie mit cd in das Verzeichnis „docker-wordpress“ der Beispieldateien. Starten Sie hier

./1.Get_Wordpress.sh

Das Script lädt Wordpress herunter und kopiert Konfigurationsdateien aus dem Verzeichnis „conf“. Alle erforderlichen Dateien liegen anschließend unter „wordpress“. Nach

docker-compose up

in diesem Verzeichnis liest das Tool die Konfiguration aus der Datei „docker-compose.yml“. Mit „build .“ erstellt es zuerst das Image „orchardup/php5“. Dieses enthält PHP5 und stellt den in PHP eingebauten Webserver bereit. Das zweite Image enthält die Datenbank „mariadb“. Auf Basis dieser Images erstellt docker-compose die Container „wordpress_web“ und „mariadb“. Über die Anweisung

links:

-db

werden die Container verbunden. Beachten Sie die Einrückungen solcher Zeilen. Diese müssen bei Änderungen erhalten bleiben. Die Anweisungen unter „volumes:“ sorgen jeweils für die Verbindung von lokalem Dateisystem und Container-Dateisystem. Das lokale Verzeichnis „wordpress“ lässt sich dann direkt im Container nutzen, eigene Anpassungen bleiben erhalten. Auch die Datenbankdateien und die „php.ini“ sind von außen erreichbar.

Auf den Webserver greifen Sie über „ http://localhost:8000“ zu. Es begrüßt Sie der Installationsassistent von Wordpress, und das CMS lässt sich wie gewohnt einrichten. Mit Strg-C beenden Sie die laufenden Container,docker-compose start startet sie danach im Hintergrund neu. Mit docker-compose rm entfernen Sie die Container. Da die wichtigsten Dateien außerhalb der Container gespeichert sind, bleiben Konfiguration und Daten erhalten.

Tipp: In der Beispieldatei ist zusätzlich der Ordner „docker-wordpress-nginx“ enthalten. Überdocker-compose up erstellen Sie hier eine Wordpress-Installation mit dem leistungsfähigeren Webserver Nginx.

(PC-Welt/ad)