Beruflich Dokumente
Kultur Dokumente
Proseminar : Docker
Informatik TU Ilmenau
Leon Paul Kaiser
leon-paul.kaiser@tu-ilmemau.de
03.02.2023
I NHALTSVERZEICHNIS I. A BSTRAKT
B. Vorteile von Docker System, wie Laptops bis hin zu Server mit beliebigen
Betriebssystem.
Vorteile von Docker sind, wie bereits beschrieben, die
garantierte Ausführung und Funktionalität der Anwen-
dung in jeder Umgebung. Zudem revolutionierte Docker C. Nachteile
die Softwareentwicklung, da nun nicht mehr große VM 2018 und 2020 gab es 2 Skandale in denen Docker-
Dateien ausgetauscht werden müssen, welche lange zum Pakete, mit Hintertüren und Kryptominern, im Docker-
booten brauchen und viel Speicher in Anspruch nehmen. Hub veröffentlicht wurden. Diese generierten durch das
Dadurch spart Docker viel Zeit und Ressourcen ein. wiederholte herunterladen und nutzen der Images 58 000
In Abbildung 1 wird der Unterschied zwischen Docker Euro und 36 000 Dollar in der Kryptowährung Monero.
und einer VM mit den Themen der Umgebung und der Docker Hub unternahm erst, nachdem kritische Berichte
Ressourcennutzung verglichen. zum Thema veröffentlicht wurden, etwas gegen die kor-
rupten Pakete. Zudem eignet sich Docker nicht für gra-
fikintensive Anwendungen. Es besteht eine Möglichkeit,
diese ist jedoch umständlich. Bei einer kleineren Anzahl
Apps, die nicht häufig aktualisiert wird, bietet sich die
VM-Umgebung eher an. Diese ist simpler zu verwalten,
so überwiegen die Vorteile dieser Lösung.
Siehe auch[2]. Ein weiteres Problem ist das die Docker-
Engine nur das eigene Docker-Format unterstützt. Wei-
tere Probleme können zum einem die monolithische
Programmdatei (die alle Features enthält) oder die Tei-
lisolierung einzelner Prozesse sein. Docker lässt sich
nicht in Full-System-Container Betrieb nutzen. Somit
sind Container nicht vollständig unabhängig.[3]
D. Docker Alternativen
rkt oder auch Rocket ist der stärkste Konkurrent von
Docker. Anders als bei Docker wird beirkt mehr auf
der Sicherheitsebene geachtet. Dazu zählen Container-
Abbildung 1. Vergleich VM und Docker.[1]
Isolierung auf Basis von KVM, die Unterstützung
der SELinux-Kernel Erweiterung und eine Signatur-
Docker-Container sind flexibler, effektiver und viel- Validierung der Images, welche von den App Container
seitiger einsetzbar. Ein weiterer Vorteil, welcher für appc genutzt werden. Es bietet in der Laufzeitumgebung
diese Arbeit wichtig ist, besteht in der Fähigkeit Ap- ein Image-Discovery-Mechanismus, welches durch das
ps voneinander, auch vom grundlegenden System, zu Image-Format: App-Container-Image beschrieben ist.
isolieren. Dadurch ist es möglich den Containern Res- Zudem lassen sich Multi-Container-Apps in sogenannte
sourcen zuzuordnen. Es wird sichergestellt, dass Co- App-Conatiner-Pods gruppieren. rkt ist auch nicht auf
de und Daten getrennt sind. Zudem verbessert Docker die Linux-Kernel-Funktionen Cgroups und Namespaces
den Umgang mit Microservice-Modellen. Diese bestehen festgelegt. Mit CoreOS als Laufzeitumgebung lassen sich
aus mehreren organisierten separaten Komponenten (ein auf KVM (Kernel-based Virtual Maschines) und Intels
sogenanntes Stack). Beispiele für solche Modelle sind Clear-Container-Technologie als vollständig gekapselte
Datenbanken, Webserver oder In-Memory-Cache. Der virtuelle Maschinen starten. Ein großer Nachteil ist aber,
Vorteil von Docker-Containern sind die separaten, in dass rkt nicht den Betrieb in Full-System-Containern
sich geschlossenen Dienste. Diese platzsparenden und unterstützt.
gut austauschbaren Container ermöglichen eine einfache Weitere Alternativen sind LXC, welches ein Set aus
Erstellung und Pflege von Microservices. Somit sind Tools, Bibliotheken, Templates und weiteren Teilen, die
viele Komponenten vielseitig, durch Wiederverwendung sich zusammen zu einer Userspace-Schnittstelle für na-
nutzbar. tive Container-Funktionen des Linux Kernels darstellen
Kurzgesagt ist ein Docker-Container ein Paketformat, lassen. Vorteil hierbei ist das es für den Full-System-
dass den vollständigen Code und die Abhängigkeiten Container Betrieb optimiert ist. Nachteile sind, dass
der Anwendung einheitlich verpackt und diese zu- es nur für Linux Systeme implementiert ist und das
verlässig und schnell über Compute-Umgebungen hin- der Betrieb von App-Containern nicht zum Standard-
weg ausführt. So laufen Docker-Anwendungen auf jedem gehört. LXD ist das Folge-Projekt von LXC und fügt
3
einen Daemon-Prozess LXD hinzu. Dieser ist eine Art ist, dass Docker nicht dasselbe wie ein Linux Container
Container-Hypervisior. Ziele dieser Software ist es, An- ist. Zu Beginn war die Technik hinter Docker auf der
wendern auf Linux-Container-Technologie Basis eine bereits genannten LXC-Technologie aufgesetzt. Jedoch
Nutzererfahrung, ähnlich der Nutzung einer virtuellen hat sich Docker von dieser Abhängigkeit gelöst. Docker
Maschine zu geben. LXD hat fast die selben Vorteile wie bietet mehr als das simple ausführen von Containern.
der Vorgänger, hat aber auch die Nachteile, wie das der Mit Docker wird der Prozess von der Erstellung und des
Linux-Kernel Voraussetzung ist. [3] Aufbaus eines Container sowie der Versand von Images
Es gibt noch deutlich mehr Container Software, wie und die Versionierung vereinfacht. Im Vergleich zu der
Linux-VServer, OpenVZ, runC. Die meisten sind aber nur Linux Grundlage, verfügt Docker über die Fähigkeit der
auf Linux Systemen nutzbar und werden mit GO oder Aufschlüsselung von Anwendungen in kleinere einzelne
C programmiert. Die folgende Übersicht 2 zeigt noch Prozesse. Aber Docker vereint, wie LXC, zwei Ziele:
einmal die wichtigsten Eigenschaften und Merkmal auf. • Container teilen sich denselben Linux-Kernel, was
zu weniger Ressourcenverbrauch führt
• laufende Container voneinander isolieren und nur
limitierten Zugriff auf die Systemressourcen geben
Daraus ergibt sich, dass Docker bei der Nutzung au-
ßerhalb einer Linux-Distribution auf Hypervisor oder
VM zurückgreifen muss. Diese Zwei garantieren die Be-
reitstellung des Linux-Kernels. Die Kernel-Namespaces
partitionieren die Kernel-Ressourcen und garantieren da-
durch die Abgrenzung von Prozessen untereinander. Ein
Prozess kann somit nur Kernel-Ressourcen des selben
Namespaces sehen. Die genutzten Namespaces sind in
folgender Grafik 3 zu sehen: Control Groups kurz
NXC. Im nächsten Abschnitt werden Dockers Bestand- • add: kann Dateien in den Container laden oder
teile genauer erläutert. überschreiben(z.B. bei Config-Dateien)
• expose: Zuordnung eines Port’s zu einen Container
A. Bestandteile von Docker Das Dockerfile enthält alle Anweisungen für die
Die Bestandteile von Docker sind die folgenden: Erstellung eines Docker-Images, denn es enthält die
Betriebssystem-Anweisungen. auf denen die Container
1) Docker-Image: Das Docker-Image ist die Darstel- basieren sollen. Der Ablauf mit einem Dockerfiles wird
lung eines Snapshot’s eines Containers. Mit dem Befehl in 5 aufgezeigt.
build werden Images erstellt. Mit run wird daraus dann
ein Container erzeugt. Images sind in Schichten aus an-
deren Images konzipiert, um beim Hochladen von Images
für eine geringe Datenmenge im Netzwerk zu sorgen.
Images sind im Grunde eine Art Template. Diese können
ein Betriebssystem sein, welches eine NGINX,PHP oder
Node.js Installation beinhaltet. Da Images auch An-
wendungen selbst enthalten können, werden diese bei
Entwicklern, statt der Anwendung selbst, geteilt. Images
können auf jedem System mit Docker laufen, was die
Entwicklung vereinfacht. Sie sind eine Sammlung von
Software, die in Containern ausgeführt wird.
2) Docker-Container: Kurzgefasst ist der Container
die Instanz des Images bzw. ein Laufzeitobjekt. Con-
tainer ermöglichen die Lauffähigkeit auf verschiedenen
Umgebungen. Der Container enthält alles wichtige, was
zur Anwendungscodelaufzeit benötigt wird. Dazu zählen
Programmcode, RunTime-Engines, Systemtools, System-
bibliotheken, Einstellungen, etc.. Der Unterschied zum
Image ist somit, dass das Image der Bauplan ist und
der Container das Erbaute. Der Container hat nur read-
only-Rechte. Da er eine Instanz ist, kann er innerhalb der
Laufzeit verändert werden.
3) Docker-Layer: Das Docker-Layer ist Teil eines
Images. Es enthält einen Befehl oder eine Datei, die
den Image hinzugefügt wird. Das Docker-Layer enthält
somit die History für das jeweilige Image. Nur die Obere
Schicht hat dabei keinen Read-Only Status.
4) Docker-Engine: Die Docker-Engine ist eine Open-
Source-Hostsoftware, in der Container erstellt und aus-
geführt werden. Die Engine wird als Client-Server-
Anwendung bei vielen Windows-Server und Linux-
Betriebssystemen verwendet. Sie muss auf dem Host-
Rechner installiert sein, um Docker-Container nutzen zu Abbildung 4. Dockerfile Aufbau [6]
können.
5) Dockerfile: Für die Erstellung von Docker-Images 6) Docker Daemon und Client: Der Docker-
und Docker-Container ist ein Dockerfile notwendig. Die- Daemon ist ein immer laufender Hintergrundprozess,
ses kann durch den Befehl: welcher Docker Images, Container, Netzwerke
mdir project-name && Dockerfile und Speicher-Volumen verwaltet. Er sorgt für die
Ausführung/Instantiierung von Container/Images. Der
erstellt werden. Einen guten Überblick für die Erstellung Docker Client ermöglicht wiederum die Benutzer-
vom Dockerfile zum Docker-Container sieht man in Container-Interaktion. Er kann auf demselben Host
Abbildung 5. Weitere Befehle für Dockerfiles sind : wie der Daemon sein oder per Verbindung zu einen
• from: enthält das Image, was verwendet wird (dafür anderen Host und dessen Daemon genutzt werden. Den
muss das Image vorher gepullt worden sein) Client nutzt man über CLI (Command Line Interpreter)
• run: beinhaltet ein Linux Befehl für die Shell und die Konsole. Über diesen werden Docker Daemon
5
Befehle zum Erstellen, Ausführen und Anhalten von Service entwickelt werden. Jeder Service arbeitet somit
Anwendungen erteilt. Jedoch ist die Hauptaufgabe des unabhängig und wird nicht von anderen Services beein-
Client, Mittel zur Verfügung stellen, welche Images vom flusst. Weiterhin ermöglicht die Modularität ein Release
Registry’s pullen und auf dem Docker-Host ausführen. Cycle, indem nahtlos Änderungen am Code gemacht
Hierbei gibt es wieder die Befehle aus Abbildung 5. werden können, ohne Anwendungsausfälle. Auf Anfrage
kann zudem der Services skaliert werden. Kurzgefasst
sind Mikroservices sehr flexibel und umgehen die Nach-
teile, die sich mit monolithischen Anwendungen ergeben.
10) Docker-Registry und Docker-Hub: Wie Git für
die Standard Programmierung zur Versionierung benutzt
wird, kann es auch bei Docker genutzt werden. Jedoch
gibt es auch das Docker eigene Versionierungs- und
Verbreitungstool Docker-Hub. Es wird bei der Entwick-
lung von Docker-Images zudem das Docker-Registry
genutzt. Es ist ein Open-Source-Repository, welches
das Speichern und Verteilen von Docker-Images verein-
facht. Es verbessert die Sicherheit und Zugriffskontrolle
der gespeicherten Docker-Images. Die Docker Registry’s
können im Docker-Hub erstellt und gehosted werden.
Somit gibt es in den Registry’s verschiedene Versionen
eines Containers. Dabei ist das oben genannte Docker-
Abbildung 5. Ablauf bei einem Dockerfile [7] Hub selbst wieder ein Docker Registry, welches von
Docker verwaltet wird.
7) Portainer: Für eine einfache Nutzung von Docker-
Befehlen, kann man die GUI Portainer nutzen. Die
Verwaltung und das Management von Docker ist sowohl B. Grundbefehle beim Arbeiten mit Docker
für größere als auch kleinere Projekte mit Portainer Die wichtigsten Befehle für das Nutzen von Docker
möglich. In der GUI werden Hardwareinformationen sind dabei:
(Anzahl Prozessoren, Größe Arbeitsspeicher) sowie auch
Docker-spezifische Informationen (Anzahl Docker Con- docker version
tainer, - Images, - Volumens und - Networks) gut einseh- //gibt Docker Version an
bar veranschaulicht. Weiterhin lässt sich der Portainer
auch in einer Weboberfläche für größere Projekte bzw. docker info
Verteilte Projekte nutzen. Er eignet sich somit für eine // gibt systemweite Information
einfach Verwaltung und Steuerung der Standard Docker- // über Docker Installation aus
Funktionen.
8) Kubernetes: Kubernetes ist ein Open-Source- docker images
Orchestrierungsystem, mit dem sich Docker-Container // gibt aktuelles Image an
ausführen lassen. Sie unterstützen bei der komplexen
Ausführung von Docker-Container, die über verschie- docker ps -a
dene Server hinweg gegeben sind und skaliert wer- // auflisten aller Container
den müssen. Die Kubernetes-Engine koordiniert die // (ohne -a Auflistung von
Container-Lebenszyklen und verteilt die verwendeten // laufenden Containern)
Container über das Netzwerk-System. Dabei kann es
den Ressourcen-Anspruch verkleinern oder erweitern. docker run --rm <imageName>
Kubernetes überwachen den Zustand der Container kon- // lässt Image ausführen und
tinuierlich, dazu zählen unter anderem die Bereitstellung, // Container wird nach Abschluss
Löschung und Planung. // entfernt
9) Mikroservices: Mikroservices sind das Gegenstück
zum komplexen, monolithischen Architekturen. Sie bre- docker exec -it
chen eine Anwendung in kleine Teilanwendungen, die <containerName> <command>
unabhängiger von einander agieren und in APIs koordi- // lässt neuen Command
niert werden. Zudem hat jeder Service seine eigene Da- // auf laufend Container
tenbank, was Speicherprobleme beim Lesen bzw. Schrei- // ausführen
ben umgeht. Jede Funktion kann dabei als unabhängiger
6
[9]
C. Anwendungfälle für Docker
• Mikroservices: Mit den Docker-Containern lassen IV. CPU UND S PEICHER L IMIT
sich viele Mikroservices einfach erstellen und ma-
A. Ressourcen Nutzung
nagen. Jeder Service kann dabei in Form eines
eigenen Containers erstellt und genutzt werden. Im Normalfall haben Docker Container vollen Zugang
Mit Management-Tools wie Docker-Swarm oder zu RAM und CPU Ressourcen beim Hostsystem. Da-
Kubernetes und einem Mesh an Services wie Is- durch kann es aber während der Laufzeit zu einen Fla-
tio bzw. Tanzu gibt es eine Vielzahl an Benut- schenhals in der Performance kommen oder schlimmer
zungsmöglichkeiten. Weiteres auch in III zum Systemabsturz des Hostsystems. Somit ist es wichtig
• Multi-Umgebung-Entwicklung: Wie schon erläutert für die Ausfall Sicherheit und Performance eines Systems
lässt sich Docker auf unterschiedlichsten Konfigura- und dessen Docker Container zu sorgen. In Docker kann
tionen und Betriebssystemen nutzen. Dadurch läuft man die RAM und die CPU Nutzung durch ein festes
jedes Programm immer gleich, unabhängig von der oder flexibles Limit einschränken. Dabei kann man es
Plattform. Das vereinfacht die Entwicklung und das beim Starten der Container oder im Docker-Composefile
Testen sowie die Nutzung der fertigen Anwendung. vorab festgelegt werden. Eine weitere Möglichkeit wäre
Aus diesen Grund ist Docker bei der Entwicklung auch dies allgemein in Docker-Desktop einzustellen. Mit
in größeren Teams mit mehreren Plattform sinnvoll. den Command: docker stats kann man überprüfen, ob die
• Isolierte Anwendungsinfrastruktur: Da die Docker- Limits gültig sind.
Container unabhängig und getrennt voneinander
sind, ist ein Sicherheitsaspekt bereits vorausgesetzt. B. RAM Speicher Limit
Zudem können die Container eigene Datenbanken
Das RAM-Limit kann in Kombination eines run beim
haben, um weitere Speichersicherheit zu garantie-
Starten eines Containers individuell festgelegt werden.
ren.
Um einen Container X mit einen Limit von 512 Me-
• Portable Software: Docker-Images sind einfach
gabyte zu erstellen, fügt man den Parameter -m oder –
zu verbreiten. Das dafür zuständige Docker Hub
memory= hinzu.
ermöglicht es Images schnell und unkompliziert zu
versionieren und zu veröffentlichen. Weiterhin kann docker run -m 512m [docker_image]
aus der Sicherheitssicht der Zugriff nur bestimmten
Dabei kann man aber auch das Limit flexibel setzen.
Benutzern gewährt werden. Somit ist die Verbrei-
Das heißt das, dass Limit nur gilt, wenn nur wenig RAM
tung ähnlich, wie der mit Git Hub, nur das Docker-
Speicher im Hostsystem zur Verfügung steht. Dafür
Hub speziell für Docker- Images und die daraus
wird der Parameter –memory-reservation mit den bereits
folgenden Container ist.
genannten m zusammen genutzt. Man kann den obigen
• Tests: In Docker lassen sich einfach Testumgebun-
Code erweitern, sodass das Limit von 512 Megabyte erst
gen aufbauen, welche die selbe Umgebung wie das
gilt, wenn nur noch 256 Megabyte im RAM verfügbar
Produkt hat. Somit gibt es keine Konfigurations-
sind.
unterschiede zwischen Entwicklungs- und Ender-
gebnis. Weiterhin lassen sich dank Docker, auch docker run -m 512m
auf Host-Betriebssystemen andere Konfigurationen --memory-reservation=256m
testen, die sonst nicht möglich wären. Somit wird [docker_image]
7
Wenn man mehr RAM benötigt, kann man swap- Die Docker run Befehle sind unter [10] noch einmal
disk Mermory Limit nutzen. Hierbei wird nicht nur der aufgelistet und erläutert.
RAM Speicher genutzt, sondern auch der Disk-Memory Eine visuellere Möglichkeit ist Docker-Desktop. Unter
des Host-Systems. Dies kann aber die Performance ver- Einstellungen können per Regler die Anzahl der CPUs,
langsamen. Um den zusätzlichen Speicher hinzuzufügen, das Speicher-Limit für Disk und RAM sowie der swap-
muss man erst den vollständigen non-swap memory Memory eingestellt werden. Falls dies durch das Host
festlegen. Der swap memory beinhaltet den non-swap System selbst verwaltet wird, wird auf die jeweilige Datei
memory und muss daher größer als dieser sein. Um nun verwiesen. Im Falle von Windows 10 ist es die wsl.config
einen Container mit zusätzlichen 500 MB swap memory Datei, welche das Subsystem von Linux auf Windows
zu starten, muss der swap memory auf 1000 MB gesetzt konfiguriert.
werden. Der Code hierfür wäre:
docker run --m=500m V. D OCKER U MGANG MIT DATEN
--memory-swap=1000m Die Standard Einstellung in Docker für Datenspeiche-
[docker_image] rung lässt die Daten auf einer beschreibbaren Container
Wenn man unbegrenzten swap memory nutzen möchte, Schicht speichern. Dadurch geben sich folgende Eigen-
setzt man den Integer Wert auf -1. schaften:
• die Daten sind nicht persistent
docker run --m=500m • es ist schwierig die Daten für andere Prozesse zu
--memory-swap=-1 nutzen
[docker_image] • die beschreibbare Schicht ist eng mit dem Host-
system verbunden, dadurch ist es schwer diese zu
Wenn man memory swap vermeiden möchte, setzt man verschieben
den Integer Wert auf den memory Wert des RAM´s. Dies • für Schreiben auf der Container Schicht wird ein
ist, da der swap memory den RAM-memory beinhaltet. eigener Speichertreiber benötigt, dieser bietet ein
ein einheitliches Dateisystem, indem der Linux-
Kernel benutzt wird
C. CPU Limit • der Speichertreiber verringert die Performance in
Wie auch der RAM lässt sich die CPU durch ein Limit Vergleich zu Datei volumes, welche direkt vom
einschränken. Dabei ist es wieder möglich ein festes oder Hostdateisystem beschrieben werden
flexibles Limit zu setzen. Für das Limit kann man die Auf Grund der letzteren Punkte nutzt man in Docker
CPU mit der Anzahl an Kernen einschränken. zwei Optionen zur persistenten Datei Speicherung auf
dem Hostsystem. Diese sind zum einen volumes und
docker run --cpus=2 [docker_image] zum anderen bind mounts. Eine dritte Möglichkeiten
Mit –cpu-period oder –cpu-quota können zum einen Dateien auf dem Hostsystem zu speichern, wenn auch
die Länge der CPU-Zyklen in Mikrosekunden oder die nicht persistent, ist es die Datei in den RAM memory
Anzahl an Zyklen, die ein Container nutzen darf, gesetzt via tmpfs mounts (Linux) oder named pipes (Windows)
werden. Im folgenden Code wird der Container auf 50% zu speichern.
der CPU-Ressource beschränkt. In der Grafik 6 werden die Speicherarten noch einmal
grafisch veranschaulicht:
docker run volumes sind Teil vom Hostdateisystem und werden
--cpu-period=50000 von Docker verwaltet, dieser Teil sollte nur von Docker
// oder modifiziert werden.
--cpu-quota=25000 bind mounts können überall im Hostsystem gespeichert
[docker_image] werden, nicht Dockerprozesse oder andere Docker Con-
Hinzu kommt noch die Zuweisungspriorität des Con- tainer können diese Dateien jederzeit modifizieren.
tainers für die CPU-Zyklen. Der Standardwert hierbei ist tmpfs mounts und named pipes werden nur im RAM des
1024, man kann mit höheren Werten die Zuweisungsprio- Systems gespeichert und werden nie ins Hostdateisystem
rität bei begrenzten CPU-Zyklen erhöhen. Somit kann geschrieben.
man auch auf den CPUs den Anteil des Containers pro In den meisten Fällen werden volumes genutzt. Es gibt
CPU-Zyklus festlegen. auch Einsatzfälle, in denen die anderen Möglichkeiten
sinnvoller sind. Wenn man mehr dazu erfahren möchte
docker run --cpus=2 kann unter [11] die Docker Dokumentation dazu nachle-
--cpu-shares=2000 [docker_image] sen.
8
entfernen. [12]
Use Cases für volumes:
• Daten zwischen mehreren laufenden Container tei-
len (wenn nicht vorhanden wird es mit ersten Con-
tainer erstellt, muss aber explizit entfernt werden)
• wenn der Docker-Host keinen garantierte
Verzeichnis- oder Dateistruktur hat
• wenn man Container Daten auf einen Remote Host
oder Cloud Dienst speichern möchte
• wenn man Daten absichern oder wiederherstellen
oder Daten von einen Docker-Host zu einen anderen
verschieben möchte
Abbildung 6. Mounting types
• wenn man hoch performante I/O Anwendungen für
[10] Docker Desktop benötigt
• wenn die Anwendung eine volles natives Dateisys-
tem Verhalten für Docker Desktop benötigt
A. Volumes
Werden durch Docker erstellt und verwaltet. Sie B. bind mounts
können explizit mit den Command Haben eine begrenzte Funktionalität in Vergleich zu
docker volume create volume-name volumes. Bei einen bind mount wird eine Datei oder
ein Verzeichnis vom Hostsystem direkt in den Container
oder mit dem Start eines Containers bzw. eines Services gemountet. Dabei ist der vollständige Pfad des Hostsy-
erstellt werden. Volumes sind im Host-Verzeichnis hinter- tems angegeben. Dabei muss es nicht bereits auf dem
legt. Wenn man ein Volume in einen Container mounted, Host liegen, sondern kann auch auf Anforderung er-
wird das Verzeichnis in den Container gemounted. Der stellt werden. Bind mounts sind performant, jedoch vom
Unterschied zu ähnlichen mounts ist, dass diese Ver- jeweiligem Dateisystem der Hostmaschine und dessen
zeichnisse von Docker verwaltet werden und vom Rest Verzeichnisstruktur abhängig.
der Kernfunktionalitäten des Hostsystems isoliert sind. Use Cases für bind mounts:
Man kann ein Volume sogar mehren Containern gleich- • man nutzt bind mounts zum Teilen von Dateien vom
zeitig zuweisen oder einen separaten Daten-Container Hostsystem zum Container, so kann Docker DNS
erstellen und diesen als ein gemeinsames Datenvolume resolutions zu Containern anbieten (dies kann bei
nutzen. Damit können andere Container diesen spezi- default oder bei mounting /etc/resolv.conf von der
ellen Container als Speicher-Volume teilen. Die Ordner Hostmaschine in jeden Container geschehen)
können auch für individuelle Container, unterschiedliche • zum teilen von Source-Code oder build artifacts
Zugriffsrechte wie read-write oder read-only erteilen. zwischen einer Entwicklungsumgebung auf einem
Schreiben wird durch file-handles wie bei einem norma- Docker-Host und einen Container
len Datei/Schreibsystem im Host behandelt. Somit kann • wenn die Datei oder die Verzeichnisstruktur vom
es auch zu Problemen beim schreiben kommen. Es ist Docker-Host garantiert, dass sie mit den bind
deshalb am besten, wenn man in Ordnern mit Daten, mounts die der Container benötigt konsistent ist
die sich nicht verändern, den read-only-mode aktiviert.
Volumens können benannt oder anonym sein. Anonyme
C. tmpfs mounts und named pipes
Volumes werden in einen Container gemountet, mit ei-
nem zufälligen aber einzigartigen Namen, welcher die tmpfs mounts sind nicht persistent, weder auf dem Host
Einzigartigkeit für den Docker-Host garantiert, benannt. noch in Docker Containern. Sie können während der
Wenn kein Container das Volume nutzt ist es trotzdem für Lebenszeit eines Containers genutzt werden und nicht-
Docker verfügbar und wird nicht automatisch entfernt. persistente Daten bzw. sensitive Informationen speichern.
Man kann Volumens mit dem Befehlen named pipes können zur Kommunikation zwischen
Docker-Host und einen Container genutzt werden. Ty-
docker volume rm volume-name pischerweise können dadurch Drittanbieter Werkzeuge
// Entfernung bestimmter Volumens innerhalb eines Containers genutzt werden und um sich
docker volumen prune zur Docker Engine API zu verbinden.
// Entfernung aller nicht genutzten Use Cases für tmpfs: tmpfs nutzt man, wenn man
// Ordner mit Platz die Daten nicht persistent haben möchte, sei es auf der
// frei machen Host Maschine oder innerhalb des Containers. Dafür
9
//cpu-period
docker run -d --rm Abbildung 12. CPU-Last bevor 2 Container laufen
--cpu-period 1000000
progrium/stress -c 8 -t 20s
Mit cpu-quota hat jeder Container Maximal nur 25%
der ganzen CPU genutzt. So sieht man in folgenden
Snapshots einen und zwei Container laufen, welche aber Abbildung 13. CPU-Last während 2 Container laufen
nur maximal 25% an CPU Last verursachen:
15 15
Neben quota wurde auch period getestet. Dabei wurde
für einen Container aber fast die ganze CPU genutzt. Erst
bei einen zweiten Container wurde die Last aufgeteilt.
100% Last der Gesamt-CPU war nicht möglich, da Abbildung 14. CPU-Last nachdem 2 Container liefen
noch andere Prozesse im Hostsystem liefen und die
CPU-Anzahl nicht festlegbar, durch das Problem mit den
Docker-Daemon, war. Die folgenden Snapshots zeigen
die hohe Last und die Aufteilung bei zwei Containern.
17 18 Abbildung 15. CPU-quota mit einen Container
VIII. FAZIT
Die Limitierung von Speicher und CPU in Docker ist
nur beim Starten eines Containers möglich. Man könnte Abbildung 18. CPU-period mit zwei Container
11
A BBILDUNGSVERZEICHNIS
1 Vergleich VM und Docker.[1] . . . . . . . 2
2 Docker Alternativen Übersicht [3] . . . . . 3
3 Benutzte Namespaces [4] . . . . . . . . . . 3
4 Dockerfile Aufbau [6] . . . . . . . . . . . . 4
5 Ablauf bei einem Dockerfile [7] . . . . . . 5
6 Mounting types . . . . . . . . . . . . . . . 8
7 Stress mit 1 CPU . . . . . . . . . . . . . . 10
8 Stress mit 2 CPU . . . . . . . . . . . . . . 10
9 Stress mit 4 CPU’s . . . . . . . . . . . . . 10
10 Stress mit 0.3 CPU’s . . . . . . . . . . . . 10
11 Stress Error CPU . . . . . . . . . . . . . . 10
12 CPU-Last bevor 2 Container laufen . . . . 10
13 CPU-Last während 2 Container laufen . . . 10
14 CPU-Last nachdem 2 Container liefen . . . 10
15 CPU-quota mit einen Container . . . . . . . 10
16 CPU-quota mit zwei Container . . . . . . . 10
17 CPU-period mit einen Container . . . . . . 10
18 CPU-period mit zwei Container . . . . . . 10
19 RAM Last mit einem Container . . . . . . 11
20 RAM Last mit zwei Containern . . . . . . 11
L ITERATUR
[1] O. Router. was-ist-docker. [Online]. Available: https://www.
opc-router.de/was-ist-docker/
[2] N.A. Computerweeklysechsanwendungen für docker. [On-
line]. Available: https://www.computerweekly.com/de/ratgeber/
Sechs-Anwendungsfaelle-fuer-die-sich-Docker-eignet
[3] ——. Alternativen zu docker: Container-plattform im Überblick.
[Online]. Available: https://www.ionos.de/digitalguide/server/
knowhow/docker-alternativen-im-ueberblick/
[4] ——. Docker – die revolutionäre container-technologie.
[Online]. Available: https://www.ionos.de/digitalguide/server/
knowhow/was-ist-docker/
[5] ——. Was ist docker? [Online]. Available: https://www.redhat.
com/de/topics/containers/what-is-docker
[6] ——. Fachartikel docker. [Online]. Available: https://aracom.de/
docker/
[7] the native web GmbH. Docker: Erste schritte // deutsch. [Online].
Available: https://www.youtube.com/watch?v=e1BOFzxgQQY
[8] N.A. Docker dokumentation commandline. [Online]. Available:
https://docs.docker.com/engine/reference/commandline/info/
[9] ——, “Clickit docker use cases,” no. 11. [Online]. Available:
https://www.clickittech.com/devops/docker-use-cases/
[10] ——. Runtime options with memory, cpus, and gpus.
[Online]. Available: https://docs.docker.com/config/containers/
resource constraints/
[11] ——. Manage data in docker. [Online]. Available: https:
//docs.docker.com/storage/
[12] ——. Volumens. [Online]. Available: https://docs.docker.com/
storage/volumes/
[13] ——. docker stats. [Online]. Available: https://docs.docker.com/
engine/reference/commandline/stats/
[14] ——. progrium/stress. [Online]. Available: https://hub.docker.
com/r/progrium/stress/