Sie sind auf Seite 1von 12

1

Proseminar : Docker
Informatik TU Ilmenau
Leon Paul Kaiser
leon-paul.kaiser@tu-ilmemau.de
03.02.2023

I NHALTSVERZEICHNIS I. A BSTRAKT

I Abstrakt 1 In dieser Arbeit wird der Container Dienst Docker


erläutert und es wird untersucht, ob man Ressourcen
II Einleitung in Docker 1 Limits setzen und messen kann. Weitere Aspekte sind
II-A Warum wird Docker genutzt? . . . 1 der Umgang mit Daten und die Sicherheit, im Bezug auf
II-B Vorteile von Docker . . . . . . . . 2 den Datenverkehr und der Verwundbarkeit durch äußere
II-C Nachteile . . . . . . . . . . . . . . 2 Einflüsse, in Docker. Zu Beginn werden Docker’s Nut-
II-D Docker Alternativen . . . . . . . . 2 zungsgrund, Bestandteile und der Aufbau beschrieben.
Auch die wichtigsten Docker Befehle werden aufgelistet
III Grundlagen zu Docker 3 und erklärt. Nach den Grundlagen wird das Limitieren
III-A Bestandteile von Docker . . . . . 4 von RAM Speicher und der CPU beschrieben. Dies ist
III-A1 Docker-Image . . . . . 4 unter Docker nur beim Starten eines Containers möglich.
III-A2 Docker-Container . . . 4 Nach der Limitierung wird das persistente Speichern von
III-A3 Docker-Layer . . . . . 4 Daten via Volumens, Bind mounts sowie das kurzzei-
III-A4 Docker-Engine . . . . . 4 tige sichere Speichern mit tmpfs mounts oder named
III-A5 Dockerfile . . . . . . . 4 pipes. Nach der Erklärung werden zudem Use Cases
III-A6 Docker Daemon und aufgelistet bzw. beschrieben. Darauf folgend wird die
Client . . . . . . . . . . 4 Messmethode mit Docker stats und dem time Befehl
III-A7 Portainer . . . . . . . . 5 von Linux vorgestellt. Anschließend werden einfache
III-A8 Kubernetes . . . . . . . 5
Tests durchgeführt, welche die gesetzten Limits und das
III-A9 Mikroservices . . . . . 5
Messen testen. Zum Schluss wird noch einmal über
III-A10 Docker-Registry und
Docker und den gewünschten Anwendungsfall evaluiert
Docker-Hub . . . . . . 5
und ein Fazit geschlossen.
III-B Grundbefehle beim Arbeiten mit
Docker . . . . . . . . . . . . . . . 5
III-C Anwendungfälle für Docker . . . . 6 II. E INLEITUNG IN D OCKER
A. Warum wird Docker genutzt?
IV CPU und Speicher Limit 6
IV-A Ressourcen Nutzung . . . . . . . . 6 Docker wird genutzt, um Anwendungen zu kapseln
IV-B RAM Speicher Limit . . . . . . . 6 bzw. in Container umzuwandeln. Dafür läuft Docker auf
IV-C CPU Limit . . . . . . . . . . . . . 7 den großen 3 Betriebssystem : Windows, Macintosh und
Linux. Jedoch läuft die Docker-Engine nur auf Linux
V Docker Umgang mit Daten 7 nativ, da Docker auf den Linux-Kernel mit cgroups und
V-A Volumes . . . . . . . . . . . . . . 8 namespaces angewiesen ist. Für Windows und Macintosh
V-B bind mounts . . . . . . . . . . . . 8 wird Docker Desktop und eine Linux VM als Container
V-C tmpfs mounts und named pipes . . 8 Laufzeitumgebung genutzt. Dadurch ist die Ausführung
des Containers vom Betriebssystem unabhängig. Auf-
VI Verbrauch von Ressourcen 9 grund dieser Gegebenheit ist die Anwendung vom Be-
VII Überlauf-Test 9 triebssystem abgegrenzt und eignet sich hervorragend
für die Entwicklung im Team, da nur kleine Dateien
VIII Fazit 10 ausgetauscht werden müssen und diese selbst bei anderen
Betriebssystemen oder Konfigurationen funktionsfähig
Literatur 12 sind.
2

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

Abbildung 2. Docker Alternativen Übersicht [3] Abbildung 3. Benutzte Namespaces [4]

cgroups dienen zur hierarchischen Organisation von Li-


III. G RUNDLAGEN ZU D OCKER nux Prozessen. Den Prozessen wird ein limitierter Betrag
Docker ist eine Software-Container-Plattform in der an Systemressourcen zugewiesen. cgroups werden im
Entwicklung, Versand und Ausführung einer Anwen- Gegensatz zu Namespaces zur Limitierung von Zugriff
dung mit Hilfe einer Containertechnologie ermöglicht auf Systemressourcen genutzt, statt Prozesse von einan-
werden. Docker basiert auf Linux und nutzt den Linux- der zu isolieren. Dadurch wird sichergestellt, dass das
Kernel und die Funktionen cgroups und namespaces um Gesamtsytem mit mehreren Containern Arbeitsfähig ist.
Prozesse unabhängig auszuführen. Dockers Werkzeuge Mehr Informationen findet man unter [4] und [5]. Aber
bauen dabei auf Linux Containern auf. Wichtig hierbei Docker unterscheidet sich weiterhin grundlegend von
4

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

docker stop <containerName> das Einrichten einer dedizierten Testumgebung in


// stoppen eines Containers den meisten Fällen bzw. bei kleinen Tests, wie
Funktionstests, erspart.
docker start <containerName> Beispiele:
// erneutes starten des Containers Es nutzen Paypal, Adobe und General Electrics Docker
für Anfragen, Transaktionen, Server-Management und
docker rm <containerName> Kommunikation zwischen Servern. Die Beispiele zeigen
// entfernen des Containers die Möglichkeiten und Wichtigkeit von Container basier-
ten Programmen wie Docker. Die wichtigsten Container
docker rmi <imageName> Management Tools dabei sind :
// entfernt ein oder • Kubernetes
// mehr Images vom Host • Amazon EKS / ECS / Fargat

Die Docker Dokumentation dazu [8] • Google Kubernetes Service


• Azure Kubernetes Service

[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

sprechen können Sicherheitsgründe oder der Schutz der Nutzung (Menge


Performance bei Container, wenn Anwendungen große an Schreiben/
Mengen an nicht persistenten Zustandsdaten schreiben Lese) eines
müssen. Container an
Den Speicherbedarf der Disk kann man unter
VI. V ERBRAUCH VON R ESSOURCEN /var/lib/docker in den OverlayFS Ordnern weiter
Zum messen des CPU- und RAM-Verbrauchs kann auswerten. Um die Startzeit eines Containers zu messen,
man im Terminal den Befehl: kann man den Sekundenzähler beim Start mit

docker stats [OPTIONS] [container_name] docker compose


nutzen. Dieser gibt eine live Datenausgabe für laufende nutzen oder unter Linux mit dem Command
Container aus. Dabei kann angegeben werden, ob man time
nur bestimmte Container angezeigt bekommt. Weitere z.B:
Optionen sind das angeben, eines eigenen Formats, die time docker run mycontainer
Ausgabe ohne Datenstrom, das ausgeben aller Container
oder eine ungekürzte Ausgabe. Dafür muss man folgen-
des im obigem Code ergänzen: VII. Ü BERLAUF -T EST
--format : printet die Daten In diesem Abschnitt wird das Limit von CPU und
nach einem RAM getestet. Für den CPU Test werden eine bestimmte
angebenen Template Anzahl an CPU’s immer limitiert, um das System nicht
--no-stream : gibt nur das zu überlasten. Nur bei -period und -quota = N wurde
erste Resultat dies nicht gemacht, da es zu Komplikationen mit den
zurück Docker-Daemon kam. Für den Stresstest wurde das Tool
--all , -a : zeigt alle Container progium/stress: docker stress [14]genutzt, da es RAM
--no-trunc : gibt ungekürzte und CPU Last, nach Festlegung, erzeugen kann. Um die
Ausgabe an CPU-Anzahl festzulegen, wurde folgender Befehle mit
N als Anzahl der CPU’s gewählt:
Die Standard Ausgabe sieht folgendermaßen aus:
//CPU
docker stats simple_container
docker run --cpus=N -d
67b2525d8ad1
--rm progrium/stress -c 8 -t 20s
CONTAINER ID NAME Die Last, aufgenommen mit Docker-Stats für 1, 2 und
b95a83497c91 awesome_brattain 4 CPU’s sieht in den Snapshots:
789
CPU % NET I/O Bei einen N kleiner eins, nahmen die Container alle einen
0.28% 916B / 0B ungefähr gleichen Anteil an Leistung ein. Dies wurde
durch das Starten von vier Containern veranschaulicht.
MEM USAGE / LIMIT MEM % Siehe hier den Snapshots:
5.629MiB / 1.952GiB 0.28% 10
Danach wurde N größer als die Anzahl an vorhandenen
BLOCK I/O PIDS Kernen gestellt. Dabei kam es zur einer Fehlermeldung:
147kB / 0B 9 11
Mit den Befehlen:
Weitere Informationen findet man unter der offiziellen
Docker Dokumentation [13]. docker run -d --rm
Die relevantesten Informationen für diese Arbeit sind --cpu-shares 1000
hierbei: --cpus 1.5 progrium/stress -c 8 -t 40s
CPU % : CPU Nutzung wurde bei einen N von 1.5 und cpu-shares von 1000
MEM USAGE / LIMIT : gibt Snapshot getestet. Im folgendem wird die Veränderung der CPU-
der RAM Nutzung Last vor zwei Container, während zwei Containern und
und das RAM nach zwei Container gezeigt. Siehe dabei die Snapshots:
Limit an 12 13 14
BLOCK I/O : gibt Speicher Es scheint, dass shares keinen Einfluss gehabt hat, da
10

Abbildung 7. Stress mit 1 CPU Abbildung 9. Stress mit 4 CPU’s

Abbildung 8. Stress mit 2 CPU


Abbildung 10. Stress mit 0.3 CPU’s

beide Container, sowie die Einzelnen, 150% Last ver-


ursachen. Anschließend wurde ohne die CPU Anzahl
einzuschränken, folgende Befehle ausgeführt:
//cpu-quota Abbildung 11. Stress Error CPU
docker run -d --rm
--cpu-quota 25000
progrium/stress -c 8 -t 20s

//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

Nun fehlt nur noch der RAM-Last Test. Mit den


Command:
docker run -d --rm
-m 512m progrium/stress Abbildung 16. CPU-quota mit zwei Container
--vm 1 --vm-bytes 600M -t 20s
Es wurde wieder mit einen und zwei Container ge-
messen. In beiden Fällen wurde nicht mehr als die
angegebenen 512 MiB pro Container verbraucht.
Abbildung 17. CPU-period mit einen Container
19 20

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

überlädt. Diese Schwächen sind aber wie bei jeder An-


wendungssoftware vom Entwickler selbst zu behandeln.
Die Nutzung Docker für ein Funknetztsystem ist
möglich, aber es müsste ein Image geben, welches Con-
Abbildung 19. RAM Last mit einem Container
tainer nach den verfügbaren Funknetzen erstellt bzw. die-
se Containern zuordnet. Dafür wird wahrscheinlich auch
eine Datenbank und ein Verwaltungs-Container benötigt,
welche die Netzdaten und die Netz-Container verwalten.
Die Schwachstellen sind wie bei anderen Anwendung
Abbildung 20. RAM Last mit zwei Containern ähnlich bis gleich, was weder für noch gegen Docker
spricht. Ich sehe Docker als eine mögliche Lösung für
die Aufgabe, da es parallel schnell kleine Prozesse laufen
aber über das Linux Prozessmangagement nachträglich lassen kann sowie die Ressourcen limitierbar sind, um
Limits setzen/nehmen. Dieses Vorgehen entspricht aber das Hostsystem nicht zu überlasten.
nicht Anforderung, da diese Limitierung nicht über Do-
cker direkt laufen würde und Docker dafür dann auch
nicht Notwendig wäre. Man könnte Anwendungen auch
ohne Container laufen lassen und diese über Linux selbst
limitieren und durch Docker-Alternativen in parallelen
Container nutzen. Jedoch sehe ich Docker hierbei im
Vorteil, da es eine Gesamtelösung dafür bietet, welche
simpel zu nutzen ist. Das Unterscheiden zwischen An-
wendungsstart in einen Container und das Starten der
Anwendung auf dem System selbst, halte ich hingegen
für nicht sinnvoll, da beide Varianten den selben Kernel
und den selben CPU Scheduler benutzen. Dadurch sollte
kein signifikanter Unterschied zwischen diesen Varianten
entstehen. Das Unterscheiden zwischen leeren Container
und Container mit Anwendung ist überflüssig, da es
einen Container ohne Anwendung nicht geben kann bzw.
dieser nicht lauffähig ist. Man könnte unterscheiden, ob
nur der Docker Dienst an sich läuft und den Verbrauch,
den der Docker Container beim Erstellen, Verwalten und
Überwachen benötigt. So könnte man zwischen idle und
Betrieb unterscheiden und den jeweiligen Verbrauch an
Ressourcen mittels stats messen. IPC kann in Docker am
einfachsten über TCP/IP realisiert werden. Docker baut
für alle Container interne Netzwerke auf, unter docker
compose werden dabei alle Container eines Composefiles
automatisch vernetzt. Via den bind mounts kann zudem
ein Unix Socket gemountet werden, welchen sich dann 2
Container teilen.
Schwachstellen für Docker sind primär die Linux
Schwachstellen, da Docker auf Linuxbasis funktio-
niert und die Linux-Kernel Funktionen cgroups und
namespaces nutzt. Docker ist im Grunde eine An-
wendung wie jede andere auch, somit hat Docker
auch die selben Sicherheitslücken. Mögliche Sicher-
heitslücken wären z.B. Meltdown oder Spectre. Wei-
tere Angriffsmöglichkeiten sind die Verbreitung von
bösartigen Docker-Images über das Docker-Hub oder
DDos-Attacken für Funknetz-Empfänger, wie das Mo-
bilfunknetz von Zügen, bei denen man den Empfänger
mit unterschiedlichsten Netzfrequenzen/-daten den RAM
12

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/

Das könnte Ihnen auch gefallen