Docker
Docker - Isolierung von Anwendungen durch Container-Virtualisierung
Beschreibung
- Schlanke Frorm der Virtualisierungen

- Prozesse laufen auf dem Kernel des Host-Betriebssystems
- Abschottung durch
Linzenz
Docker ist freie Software
Realisierung von Containern
- Linux-Techniken

- Cgroups
- Namespaces
- Anfänglich LXC-Schnittstelle des Linux-Kernels
- Mittlerweile eine eigene Programmierschnittstelle namens libcontainer
- Als Speicher-Backend verwendet Docker das Overlay-Dateisystem aufs
- seit Version 0.8 wird auch btrfs unterstützt
Begriffe
| Begriff | Beschreibung |
|---|---|
| Volume | Container-Volume ermöglichrn es, dass Daten erhalten bleiben, auch wenn ein Docker-Container gelöscht wird. Volumes sind auch eine praktische Möglichkeit, Daten zwischen dem Host und dem Container auszutauschen. |
| Image | Ein Docker-Image ist eine schreibgeschützte Vorlage, die von der Docker-Engine benutzt wird, um einen Container zu erzeugen.
Speicherabbild eines Containers
|
| Container | Docker-Container sind isolierte Ausführungseinheiten für Anwendungen und ihre Abhängigkeiten
Aktive Instanz eines Images
|
| Layer | Teil eines Images und enthält einen Befehl oder eine Datei, die dem Image hinzugefügt wurde
|
| Dockerfile | Beschreibung zur Erstellung eines Docker-Container
|
| Repository | Satz gleichnamiger Images mit verschiedenen Tags, zumeist Versionen |
| Registry | Verwaltung von Repositories (Docker Hub, Artifactory, ...) |
Bibliotheken
| Begriff | Beschreibung |
|---|---|
| libcontainer | Schnittstelle zu den Grundfunktionen von Docker |
| libswarm | Schnittstelle, um Docker-Container zu steuern |
| libchan | Einfache („light weighted“) Kommunikation zwischen Prozessteilen und Prozessen |
Aufbau und Funktionen
- „Build, Ship and Run Any App, Anywhere“

Unter diesem Motto bewirbt die quelloffene Container-Plattform Docker eine flexible, ressourcensparende Alternative zur Emulation von Hardware-Komponenten auf Basis virtueller Maschinen (VMs)
- Während die klassische Hardware-Virtualisierung darauf beruht, mehrere Gastsysteme auf einem gemeinsamen Host-System zu starten, werden Anwendungen bei Docker mithilfe von Containern als isolierte Prozesse auf ein und demselben System ausgeführt
- Man spricht bei der containerbasierten Server-Virtualisierung daher auch von einer Operating-System-Level-Virtualisierung
Der Vorteil containerbasierter Virtualisierung liegt somit darin, dass sich Anwendungen mit unterschiedlichen Anforderungen isoliert voneinander ausführen lassen, ohne dass dafür der Overhead eines separaten Gastsystems in Kauf genommen werden muss
- Zusätzlich können Anwendungen mit Container plattformübergreifend und in unterschiedlichen Infrastrukturen eingesetzt werden, ohne dass diese an die Hard- oder Software-Konfigurationen des Hostsystems angepasst werden müssen
Docker ist das bekannteste Software-Projekt, das Anwendern und Anwenderinnen eine auf Containern basierende Virtualisierungstechnologie zur Verfügung stellt
- Die quelloffene Plattform setzt dabei auf drei grundlegende Komponenten: Um Container auszuführen, brauchen Anwender lediglich die Docker-Engine sowie spezielle Docker-Images, die sich über das Docker-Hub beziehen oder selbst erstellen lassen
Motivation
- Vereinfachte Bereitstellung von Anwendungen
- Container, die alle nötigen Pakete enthalten leicht als Dateien transportieren und installieren lassen
- Geringerer Overhead durch geteilten Host-Kernel
- Schnelle Start- und Stopzeiten
- Hohe Dichte isolierter Instanzen pro Host
- Prozess- und Abhängigkeitsisolation (Namespaces, cgroups)
- Reproduzierbare Laufzeitumgebungen durch unveränderliche Images
- Portabilität über unterschiedliche Hosts und Plattformen
- Feingranulares Ressourcen- und Zugriffsmanagement
- Vereinfachtes Lebenszyklus-Management
- Container gewährleisten
Trennung und Verwaltung der auf einem Rechner genutzten Ressourcen
- Code
- Laufzeitmodul
- Systemwerkzeuge
- Systembibliotheken
- alles was auf einem Rechner installiert werden kann
Container
- Sandbox-Prozess
Ein Container ist ein Sandbox-Prozess, der auf einem Host-Computer ausgeführt wird und von allen anderen auf diesem Host-Computer ausgeführten Prozessen isoliert ist
- Diese Isolierung nutzt Kernel-Namespaces und cgroups, Funktionen, die es in Linux schon seit langem gibt
- Docker macht diese Funktionen zugänglich und einfach zu verwenden
- Ein ist Container eine lauffähige Instanz eines Images
- Container werden über die Docker-API oder die Befehlszeilenschnittstelle
- erstellt
- gestartet
- angehalten
- verschoben
- gelöscht
- Er kann auf lokalen oder virtuellen Maschinen ausgeführt oder in der Cloud bereitgestellt werden
- Er ist portabel (und kann auf jedem Betriebssystem ausgeführt werden)
- Er ist von anderen Containern isoliert und führt seine eigene Software, Binärdateien, Konfigurationen usw
- Erweiterte Form von chroot
- Das Dateisystem wird aus einem Image bereitgestellt
- Allerdings bietet der Container eine zusätzliche Isolation, die mit chroot nicht möglich ist
- Siehe auch
Bereitstellung
- Image oder Dockerfile
- Fertige Images
- Dockerfiles
- Anweisungen zum Erzeugen eines Images (Dockerfiles ) im Projekt verteilen
- Dockerfiles können gut in Projekt-Repositoies bereitgestellt werden
Fertige Images
DockerHub bietet fertige Images
- Ein solches gestartetes Image nennt sich dann Container und enthält beispielsweise Dateien, die in den Container gemountet oder kopiert werden
- Man kann auch eigene Images bauen, indem man eine entsprechende Konfiguration (Dockerfile) schreibt
- Jeder Befehl bei der Erstellung eines Images erzeugt einen neuen Layer, die sich dadurch mehrere Images teilen können
In der Konfiguration einer Gitlab-CI-Pipeline kann man mit image ein Docker-Image angeben, welches dann in der Pipeline genutzt wird
Docker Images
Ähnlich wie virtuelle Maschinen basieren Docker-Container auf Images
- Schreibgeschützte Vorlage
Dieses isolierte Dateisystem wird von einem Image bereitgestellt, und das Image muss alles enthalten, was zur Ausführung einer Anwendung erforderlich ist - alle Abhängigkeiten, Konfigurationen, Skripte, Binärdateien und so weiter.
- Portables Abbild eines Containers
Als wird ein Docker-Image in Form einer Textdatei beschrieben – man spricht von einem Dockerfile
- Soll ein Container auf einem System gestartet werden, wird zunächst ein Paket mit dem jeweiligen Image geladen – sofern dieses nicht lokal vorliegt
- Das geladene Image stellt das für die Laufzeit benötigte Dateisystem inklusive aller Parameter bereit
- Ein Container kann als laufender Prozess eines Images betrachtet werden
- Siehe auch
Docker-Engine
Mit Docker-Befehlen können Anwenderinnen und Anwender Software-Container direkt aus dem Terminal starten, stoppen und verwalten
- Die Ansprache des Daemon erfolgt über das Kommando dockerund Anweisungen wie build (erstelle), pull (lade herunter) oder run (starte)
- Client und Server können sich dabei auf dem gleichen System befinden
- Alternativ steht Anwendern die Möglichkeit offen, einen Docker-Daemon auf einem anderen System anzusprechen
- Je nachdem, welche Art von Verbindung aufgebaut werden soll, erfolgt die Kommunikation zwischen Client und Server über die REST-API, über UNIX-Sockets oder eine Netzwerkschnittstelle
Komponenten
Zusammenspiel der Docker-Komponenten

- Beispiel
- docker build
- docker pull
- docker run
- docker build
Das Kommando docker build weist den Docker-Daemon an, ein Image zu erstellen (gepunktete Linie)
- Dazu muss ein entsprechendes Dockerfile vorliegen
Soll das Image nicht selbst erstellt, sondern aus einem Repository im Docker-Hub geladen werden, kommt das Kommando docker pull zum Einsatz (gestrichelte Linie)
- Wird der Docker-Daemon via docker run angewiesen, einen Container zu starten, prüft das Hintergrundprogramm zunächst, ob das entsprechende Container-Image lokal vorliegt
- Ist dies der Fall, wird der Container ausgeführt (durchgezogene Linie)
- Kann der Daemon das Image nicht finden, leitet dieser automatisch ein Pulling aus dem Repository ein
Betriebssysteme
- Virtualisierung mit Linux
Docker auf die Virtualisierung mit Linux ausgerichtet
- Docker-Technologie benötigt einen Linux-Kernel
Container und Virtuelle Maschinen
- Varianten
- Hardware
- Betriebssystem
- Linux, FreeBSD, macOS, Windows, …
- Virtualisierung
Herkömmliche Virtualisierung
Im rechten Bild wird eine herkömmliche Virtualisierung mit virtuellen Maschinen (VM) dargestellt
- Dabei wird in der VM ein komplettes Betriebssystem (das "Gast-Betriebssystem") installiert und darin läuft dann die gewünschte Anwendung
- Die Virtualisierung (VirtualBox, VMware, ...) läuft dabei als Anwendung auf dem Host-Betriebssystem und stellt dem Gast-Betriebssystem in der VM einen Rechner mit CPU, RAM, zur Verfügung und übersetzt die Systemaufrufe in der VM in die entsprechenden Aufrufe im Host-Betriebssystem
- Dies benötigt in der Regel entsprechende Ressourcen: Durch das komplette Betriebssystem in der VM ist eine VM (die als Datei im Filesystem des Host-Betriebssystems liegt) oft mehrere 10GB groß
- Für die Übersetzung werden zusätzlich Hardwareressourcen benötigt, d. h. hier gehen CPU-Zyklen und RAM "verloren"
- Das Starten einer VM dauert entsprechend lange, da hier ein komplettes Betriebssystem hochgefahren werden muss
- Dafür sind die Prozesse in einer VM relativ stark vom Host-Betriebssystem abgekapselt, so dass man hier von einer "Sandbox" sprechen kann: Viren o.ä
- können nicht so leicht aus einer VM "ausbrechen" und auf das Host-Betriebssystem zugreifen (quasi nur über Lücken im Gast-Betriebssystem kombiniert mit Lücken in der Virtualisierungssoftware)
Virtualisierung auf Containerbasis
Im linken Bild ist eine schlanke Virtualisierung auf Containerbasis dargestellt
- Die Anwendungen laufen direkt als Prozesse im Host-Betriebssystem, ein Gast-Betriebssystem ist nicht notwendig
- Durch den geschickten Einsatz von
namespacesundcgroupsund anderen in Linux und FreeBSD verfügbaren Techniken werden die Prozesse abgeschottet, d. h. der im Container laufende Prozess "sieht" die anderen Prozesse des Hosts nicht - Die Erstellung und Steuerung der Container übernimmt hier beispielsweise Docker
- Die Container sind dabei auch wieder Dateien im Host-Filesystem
- Dadurch benötigen Container wesentlich weniger Platz als herkömmliche VMs, der Start einer Anwendung geht deutlich schneller und die Hardwareressourcen (CPU, RAM, ...) werden effizient genutzt
- Nachteilig ist, dass hier in der Regel ein Linux-Host benötigt wird (für Windows wird mittlerweile der Linux-Layer (WSL) genutzt; für macOS wurde bisher eine Linux-VM im Hintergrund hochgefahren, mittlerweile wird aber eine eigene schlanke Virtualisierung eingesetzt)
- Außerdem steht im Container üblicherweise kein graphisches Benutzerinterface zur Verfügung
- Da die Prozesse direkt im Host-Betriebssystem laufen, stellen Container keine Sicherheitsschicht ("Sandboxen") dar!
In allen Fällen muss die Hardwarearchitektur beachtet werden: Auf einer Intel-Maschine können normalerweise keine VMs/Container basierend auf ARM-Architektur ausgeführt werden und umgekehrt
Anhang
Siehe auch
- Kategorien
- Unterseiten
- Docker/Ausblick
- Docker/Befehl
- Docker/Befehle
- Docker/Compose
- Docker/Container
- Docker/Container und Virtuelle Maschinen
- Docker/Containerisieren
- Docker/Datenbank
- Docker/Dockerfile
- Docker/Engine
- Docker/Freigeben
- Docker/Funktionen
- Docker/Getting started
- Docker/Hosting
- Docker/Hub
- Docker/Image
- Docker/Image/Aktualisieren
- Docker/Installation
- Docker/Installation/Manuell
- Docker/Mounts
- Docker/Multi-Container
- Docker/Namespaces
- Docker/Sicherheit
- Docker/Userns-remap
- Docker/Vorteile
- Docker/Workshop
- Docker/pull
- Docker/tmp
Links
Weblinks
- https://docs.docker.com
- https://hub.docker.com/search
- https://de.wikipedia.org/wiki/Docker_(Software)
- https://www.hsbi.de/elearning/data/FH-Bielefeld/lm_data/lm_1359639/building/docker.html
- Offizielle Website
- Renaissance der Container-Virtualisierung mit Docker
- Einführung und Praxisbeispiele / Übersicht Docker und Container-Virtualisierung