Docker Grundlagen
Workshop

Version 1.0
erstellt 2. Februar 2019
zuletzt bearbeitet 9. Februar 2019

Rainer Suhm

1  Einführung

Auszug aus der deutschen Wikipedia  1
Docker ist eine Open-Source-Software zur Isolierung von Anwendungen mit Containervirtualisierung.
Docker vereinfacht die Bereitstellung von Anwendungen, weil sich Container, die alle nötigen Pakete enthalten, leicht als Dateien transportieren und installieren lassen. Container gewährleisten die Trennung und Verwaltung der auf einem Rechner genutzten Ressourcen. Das beinhaltet laut Aussage der Entwickler: Code, Laufzeitmodul, Systemwerkzeuge, Systembibliotheken - alles was auf einem Rechner installiert werden kann.

2  Grundlagen

Die Virtualisierungstechnik, die Docker anwendet, wird Containervirtualisierung, oder treffender Anwendungsvirtualisierung genannt. Dabei wird nur eine Anwendung (oder Anwendungsgruppe) virtualisiert, nicht ein ganzes Betriebssystem. Die Anwendung läuft abgeschirmt vom System, benutzt dabei aber Kernel und Systemressourcen des Hosts. Daher müssen keine virtuellen Geräte, keine virtuelle Platte, kein virtueller Speicher definiert werden.
Der Gast hat keinen Zugriff auf die Festplatteninhalte des Hosts, ebenso wenig auf den vom Host genutzten Speicher. Die Trennung zwischen Hostsystem und Gastanwendung ist möglich durch Nutzung von von cgroups und namespaces.
Cgroups und Namespaces sind Mechanismen, die der Linuxkernel zur Verfügung stellt. Daher ist Docker ausschließlich unter Linux verfügbar. Weil der Gast den Kernel des Hosts verwendet, sind auch ausschließlich Linuxgäste möglich.
Es gibt ein verbreitetes Nicht-Linux-System, das angeblich Dockeranwendungen möglich macht. Aus technischer Sicht ist das vollkommener Bullshit, da schlicht unmöglich. Die Umsetzung erfolgt dadurch, dass dieses System ein minimales Linux in klassischer Betriebssystemvirtualisierung startet (HyperV). Dieses Linux dient dann als Dockerhost.

2.1  cgroups

Cgroups (Kurzform von control groups) erlauben es, eine Gruppe zu definieren und Anwendungen dieser Gruppe zuzuweisen. Über die cgroup ist es möglich, den Anwendungen innerhalb der cgroup Ressourcen zuzuteilen, bzw. zu beschränken.

2.2  namespaces

namespaces trennen die Anwendung vom Rest des Systems. Anwendungen innerhalb eines namespaces sehen nur sich gegenseitig, aber sonst nichts vom System. (Beispiel mit htop im Container).

3  Begrifflichkeiten

3.1  Image

Als Image wird ein Abbild einer Dockeranwendung bezeichnet. Analog zu einem Programm liegt es einfach tot auf der Platte 'rum und macht nichts außer Plattenplatz zu belegen. So wie z.B. ein ISO-Image einer DVD ist im Dockerimage alles, was die ,,gedockerte'' Anwendung braucht, zusammengefasst (allerdings besteht ein Dockerimage nicht nur aus einer einzigen Datei - für das Ausrollen kann das Image aber einfach als tar-Archiv verpackt werden).

3.2  Container

Als Container wird eine laufende Instanz eines Images bezeichnet. Das ist analog zum Begriff Prozess, der laufende Programme bezeichnet. Ein normales Programm kann mehrfach gestartet werden, dann gibt es mehrere Prozesse. Das gilt auch für Docker: Von einem Image können mehrere Container gestartet werden. Diese sind dann alle gegeneinander abgeschottet.

4  Docker

4.1  Allgemeines

Wenn cgroups und namespaces Features des Kernels sind stellt sich die Frage, welche Leistung eigentlich Docker erbringt. Nun, Docker macht das bedien- und verwaltbar. Niemand muss sich damit herumschlagen, wo und wie Images abgelegt werden. Niemand muss sich Namen für cgroups und namespaces ausdenken und sich um Zuweisungen kümmern. Außerdem stellt Docker einfache Schnittstellen zum Verpacken und Versenden von Images zur Verfügung. So können Anwendungen leicht ausgerollt werden. Weil alle Abhängigkeiten einer Anwendung (Libraries, Pfade, ...) im Image sind, kann ein Image einfach von einem Hostsystem auf ein anderes übernommen werden - z.B. von einem aktuellen Arch Linux auf ein älteres Ubuntu oder gar auf SUSE.
32-Bit-Images laufen auch auf 64bittiger Hardware, umgekehrt jedoch nicht. Da der Kernel des Hosts verwendet wird, muss die CPU-Architektur bei Host und Gast übereinstimmen. Es ist z.B. nicht möglich, ein ARM-Image auf Intel-X86-Hardware zu verwenden.

4.2  Architektur

Die Anwendung Docker ist zweigeteilt. Ein Dienst (dockerd) macht die Arbeit, eine Anwendung (docker) bildet die Benutzerschnittstelle und kommuniziert mit dem Dienst.
Docker benötigt root-Rechte, was aus Sicherheitserwägungen kritisiert wird. Wenn ein Benutzer Mitglied der Gruppe docker ist, kann docker ohne explizite root-Rechte ausgeführt werden. Die Sicherheitsimplikationen bleiben dennoch bestehen.
Als Alternative schickt sich das Programm podman an, docker-kompatibel ohne Dienst zu laufen. Bis jetzt habe ich keine nennenswerten Erfahrungen damit gemacht.

4.3  Die wichtigsten Aufrufparameter

5  Übungen

5.1  Interaktive Anwendung

Wir arbeiten auf einer Konsole im laufenden Dockercontainer. Schnittstelle zum Host ist ein Ordner des Hosts, den wir im Container sichtbar machen.

5.2  Webservice

Wir bieten einen Webservice an, der in einem Container läuft. Das Image wird automatisch erstellt mittels docker build ... und einem Dockerfile. Schnittstelle für den Webservice ist ein Port, über den wir von außen auf den Service im Container zugreifen.

6  Zusammenfassung

6.1  Vorteile

6.2  Nachteile

6.3  geeignete Anwendungsfälle

In den folgenden Fällen kann Anwendungsvirtualisierung vorteilhaft sein:

7  Literatur


Footnotes:

1https://de.wikipedia.org/wiki/Docker_(Software)


File translated from TEX by TTH, version 4.12.
On 9 Feb 2019, 23:59.