Was ist Docker?
Grundlegendes
- Eine Freie Software zur Isolierung von Anwendungen mit Hilfe von Containervirtualisierung.
- Es 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 umfasst: Code, Laufzeitmodul, Systemwerkzeuge, Systembibliotheken – alles was auf einem Rechner installiert werden kann.
- Es können mehrere Prozesse isoliert und damit unabhängig voneinander ausgeführt werden.
- Dies ermöglicht eine einfaches Aktualisierung des Containers ohne andere Container zu gefährden.
- In der idealen Welt läuft in einem Docker Container nur ein Prozess.
- Wenn ein weitere Prozess benötigt wird, sollte dieser in ein anderen Container ausgelagert werden.
- Dies wird aber nicht immer eingehalten.
Grundlagen
- Es basiert auf Linux-Techniken wie Cgroups und Namespaces, um Container zu realisieren.
- Anfänglich wurde die LXC-Schnittstelle des Linux-Kernels verwendet
- Die Docker-Entwickler haben mittlerweile eine eigene Programmierschnittstelle namens libcontainer entwickelt
- Diese steht auch anderen Projekten zur Verfügung.
- Als Speicher-Backend verwendet Docker das Overlay-Dateisystem "aufs", ab Version 0.8 unterstützt die Software aber auch "btrfs".
- Prinzipiell ist Docker auf die Virtualisierung mit Linux ausgerichtet.
- Es kann allerdings auch mittels Hyper-V oder VirtualBox auf Windows und HyperKit oder VirtualBox auf macOS verwendet werden.
- Die Ressourcentrennung alleine mit den Docker zugrunde liegenden Techniken wie Namespaces und Cgroups gilt nicht als völlig sicher.
- Mir Red Hat Unterstützung wurde eine sicherheitsrelevante Kernel-Erweiterung für SELinux implementiert
- Diese sichert die Container auf der Ebene des Host-Systems zusätzlich ab.
Vorteile
- Skalibarkeit
- Isoliert
- Fertige Systeme
- Gute Updatefähigkeit
Begriffe
Image
- Ein Speicherabbild eines Containers.
- Das Image selbst besteht aus mehreren Layern, die schreibgeschützt sind und somit nicht verändert werden können.
- Ein Image ist portabel, kann in Repositories gespeichert und mit anderen Nutzern geteilt werden.
- Aus einem Image können immer mehrere Container gestartet werden.
Container
- Aktive Instanz eines Images bezeichnet.
- Er wird also gerade ausgeführt und ist beschäftigt.
- Sobald der Container kein Programm mehr ausführt, wird der Container automatisch beendet.
Layer
- Ein Layer ist Teil eines Images und enthält einen Befehl oder eine Datei, die dem Image hinzugefügt wurde.
- Anhand der Layer kann die ganze Historie des Images nachvollzogen werden.
Dockerfile
- Eine Textdatei, die mit verschiedenen Befehlen ein Image beschreibt.
- Diese werden bei der Ausführung abgearbeitet und für jeden Befehl wird ein einzelner Layer angelegt.
Repository
- Ein Repository ist ein Satz gleichnamiger Images mit verschiedenen Tags, zumeist Versionen.
Registry
- Eine Registry, wie zum Beispiel Docker Hub oder Artifactory, dient der Verwaltung von Repositories.
libcontainer
- Eine Schnittstelle zu den Grundfunktionen von Docker.
libswarm
- Eine Schnittstelle, um Docker-Container zu steuern.
libchan
- Ermöglicht eine einfache („light weighted“) Kommunikation zwischen Prozessteilen und Prozessen.
Zyklen
Handling
Portforwarding
- Der Docker Host nimmt die Anfragen auf den Ports entgegen.
- Er leitet sie zu dem entsprechenden Container.
- Solange man keinen Reverse Proxy einrichtet kann pro Host Port nur ein Container bedient werden.
Volumes
- Die Daten in einem Container sind nur solange vorhanden wie der Container existiert.
- Bei einem Update würden die Daten verloren gehen.
- Man lagert Daten die die wichtig sind auf das Dateisystem des Docker Host aus.
- So hat man immer die richtige Datensätze.
Vorgang bei der in Betriebnahme
- Suchen eines passenden Docker Image
- Dokumentation lesen
- Docker Image runter laden und mit entsprechenden Optionen als Container laufen lassen
Was ist zu beachten?
- Wenn der Container gelöscht oder geupdated wird, gehen die Daten verloren.
- Wichtiger dynamische Daten sollte man ausserhalb des Containers "legen".
- Daten werden auf das Hostssystem gelegt, bei Docker Swarm auf ein NFS Share
- Ports (Schnittstellen) müssen von aussen ereichbar sein.
- Möglichkeit 1: Portforwarding
- Möglichkeit 2: Traefik
Begriffe
- Host
Rechner auf dem die Docker Container laufen.
- Image
Ein auf einen Verwendungszweck zu geschnittene "Softwarepaket" welches man in der Regel von Docker Hub runter lädt.
- Container
Wenn man ein Image "startet" wirde es zu einem Container. Man kann ein Image auch 2 man "starten" dann werden 2 Container aus dem selben Image. Vergleichbar mit Variable und Instanz der Progammiersprachen.
- Volumen
Daten die man ausserhalb des Container legt und die bei einem Container Update erhalten bleiben sollen.
- Ports
Schnittstellen zu den Prozessen. Hier gibt es den Port im Container und den auf dem Host. Diese müssen miteinander irgendwie "verbunden" werden.