Was ist Docker?

Docker versucht die Containerrevolution im Transportwesen auf die IT umzulegen. Anstatt viele unterschiedliche Artefakte individuell zu verteilen und zu administrieren, werden standardisierte Container verwendet, welche einheitlich erstellt, verteilt und betrieben werden können. Es handelt sich daher bei Docker um eine disruptive Technologie, da sie die Art und Weise, wie Software bisher betrieben wird, grundsätzlich in Frage stellt.

WIE FUNKTIONIERT DOCKER?

Docker isoliert Applikationen via Betriebssystem­virtualisierung in Containern und stellt somit eine ressourcen-freundliche Alternative (bzw. Ergänzung) zur herkömmlichen Virtualisierung mittels VMs dar. Es werden vor allem Ansätze der Softwareentwicklung verwendet um operative Probleme zu lösen (DevOps). Beispielsweise werden Images deklarativ beschrieben (=Source-Code), um eine vollständige Build-Pipeline (inkl. Systemumgebung & Konfiguration) zu erreichen, welche nicht mit der Erstellung eines WAR-Files bereits endet.

WOZU CONTAINER?

Der Betrieb von Applikationen in Containern ermöglicht eine komplette Isolierung von Applikationen, welche in einer einheitlichen Umgebung laufen und sich somit die Hardware-Ressourcen teilen, ohne den Ressourcen-Overhead klassischer Virtualisierun­gslösungen. Gleichzeitig erreicht man eine höhere Standardisierung der Software-Einheiten im Betrieb und kann basierend darauf Infrastruktur (Werkzeuge, …) entwickeln.
Skalierung: Standardisierte Container ermöglichen den Aufbau von darauf spezialisierter Infrastruktur (z.B. Rancher). Dadurch können komplette Software-Umgebungen in Minuten erstellt, passiviert, reaktiviert, verschoben, gesichert, … werden.
Komplexität: Durch den vereinheitlichten Betrieb wird Komplexität von den Applikationen hin zur Infrastruktur verschoben und dort applikationsüber­greifend behandelt. Beispiele: Logging, Volumes, Storage-Pools, Backups, Adress-Management (IPs, Ports, DNS), Zertifikate, Monitoring, Health-Checks, automatisierte Skalierung, Failover, Load-Balancing, Deployment, Upgrades, Hardware-Ressourcen-Management, Berechtigungen, Netzwerkkonfi­guration, Clustering, Software-Verteilung, Archivierung, …
Security: Die Isolierung von Applikationen via Container bietet auch zusätzlichen Schutz, da man aus dem Container nicht ausbrechen kann. Selbst ein erfolgreicher Hack einer Applikation isoliert den Angreifer innerhalb des Containers. Container Networking bringt zusätzlichen Schutz durch die Isolierung virtualisierter Container-Netzwerke. Der Angreifer könnte nur innerhalb des virtualisierten Netzwerks tätig werden, jedoch keine anderen Applikationen gefährden.

WORAUF BASIERT DOCKER?

Docker basiert auf mehreren Linux-Technologien, welche zu einem einheitlichen Container-Format (libcontainer) zusammengefasst werden. Den Kern bilden die Linux-Kernel-Funktionalitäten „namespaces“ und „cgroups“, sowie das Linux-Filesystem AUFS.
Namespaces: Isolierung von Linux-Resourcen (PID, hostname, userid, network, IPC, filesystem)
Cgroups: Isolierung von Hardware-Resourcen (Limitierung von Memory, CPU, Block IO)
AUFS: Hierarchische Filesystem-Layers, Union Mount (ermöglicht den hierarchischen Aufbau von Images und somit die Wiederverwendung von Filesystem-Layers )

WIE KOMMUNIZIEREN CONTAINER?

Die Prozesse innerhalb eines Containers verfügen über einen eigenen virtuellen Netzwerk-Stack (inkl. eigener Container-IP). Zur Kommunikation mit der Außenwelt (außerhalb der Container-Umgebung) ist ein Mapping zwischen Host-Netzwerk-Stack und Container-Netzwerk-Stack erforderlich. Dabei werden im Wesentlichen die Ports gemappt (Beispiel: Host-Port 80 auf Container-Port 8080). Die Kommunikation verläuft dann über das Bridge-Network „docker0“. Die Inter-Container-Kommunikation erfordert kein Mapping auf den Host-Netzwerk-Stack, sondern verläuft über virtualisierte Container-Netzwerke. Beispielsweise kann es ein Container-Netzwerk geben, welches einem Applikations-Container erlaubt mit einem Datenbank-Container über einen spezifischen „virtuellen“ Port zu kommunizieren. Innerhalb eines Hosts verläuft diese Kommunikation über das „docker0“-Bridge-Network und erfordert keine Belegung von Host-Ports. Bei der Kommunikation über mehrere Hosts hinweg werden VXLANs verwendet.

WIE ARBEITEN CONTAINER MIT PERSISTENTEN DATEN?

Jeder Container hat sein eigenes Filesystem, welches für dessen Applikationen sichtbar ist. Applikationen innerhalb des Containers haben keinen Zugriff auf das Host-Filesystem. Es ist jedoch möglich Dateien oder Verzeichnisse mittels Docker-Volumes aus dem Host-Filesystem oder des Filesystems eines anderen Containers in das Container-Filesystem zu „mounten“.
Stateful Container: Die einfachste Form der Persistenz ist der Stateful-Container. Daten werden hierbei einfach im Container gespeichert. Es ist jederzeit möglich ein Docker-Image aus einem laufenden Container zu generieren und zu exportieren oder in eine Registry zu pushen.
Data Container: Die Daten werden ebenfalls in einem Container gespeichert, jedoch in einem anderen. Dadurch werden Applikation und Daten in unterschiedliche Container getrennt. Beide Container besitzen ein eigenständiges Filesystem, jedoch wird ein Teil des Data-Container-Filesystems in das Application-Container-Filesystem gemounted. Es ist somit möglich nur die Daten alleine zu sichern oder den Applikations-Container bei einem Upgrade einfach auszutauschen.
Data Volumes: Es wird ein Directory oder ein File am Host-Filesystem zur Verfügung gestellt und in das Container-Filesystem gemounted.
Volume Plugins: Es ist auch möglich eigene Volume Drivers zu implementieren bzw. zu verwenden. Ein Beispiel hierfür ist Flocker.