Docker 2024 04: Unterschied zwischen den Versionen

Aus CCWiki
Zur Navigation springen Zur Suche springen
 
(47 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 3: Zeile 3:


'''Teilnehmer_innen sollen nach der Schulung in der Lage sein'''
'''Teilnehmer_innen sollen nach der Schulung in der Lage sein'''
* eigene Docker Images zu erstellen und diese mittels Docker Compose zu starten
* die Begriffe Virtualisierung und Containerisierung zu unterscheiden
* die bereitgestellten Ressourcen für Arbeitsspeicher und CPU Zeit zu modifizieren
* bestehende Docker Images ausführen
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridged vs. Host Network) zu unterscheiden und diese gezielt anwenden können
* eigene Docker Images zu erstellen und diese mittels {{BSL|docker run}} und {{BSL|docker compose}} zu starten
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können
* das Dateisystem und Volumes einbinden und verwalten
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen


'''Welche Bereiche werden explizit ausgeklammert:'''
'''Welche Bereiche werden explizit ausgeklammert:'''
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc], Linux als Hostsystem erforderlich)
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])
* Limitierung von Disk IO ([https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources siehe constraints], Linux als Hostsystem erforderlich)
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS], Linux als Hostsystem erforderlich)
 
[[Datei:Dockerschulung 2024 04.odp|mini|Einführungspräsentation]]


== Virtualisierung vs Containerisierung ==
== Virtualisierung vs Containerisierung ==
Zeile 17: Zeile 21:
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.


  ''Warum sollte man Anwendungen überhaupt mit hohem Isolationsgrad starten?''
=== Gründe für Virtualisierung und Containerisierung ===
  Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich so mit nicht auf das Gesamte System aus.
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien.
Folgende Gründe sprechen jedoch für die Verwendung dieser Technologien:
  '''Teilen von Hardware Ressourcen'''
Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.
Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.
 
'''Isolation'''
  Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.
 
'''Übertragbarkeit'''
Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.


=== Virtualisierung ===
=== Virtualisierung ===
Bei der Virtualisierung übernimmt der '''Hypervisor''' das erstellen, starten und das Zuteilen der Hardwareressource des Hosts, an die virtualisierten Gast Betriebssysteme. Hypervisoren können in verschiedene Typen eingeteilt werden:
Bei der Virtualisierung übernimmt der '''Hypervisor''' das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts an die virtualisierten Gast Betriebssysteme.
* Typ 1, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)
 
* Typ 2, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)
Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.<ref>https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor</ref>
 
Hypervisoren können in verschiedene Typen eingeteilt werden:
* '''Typ 1''', Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)
* '''Typ 2''', Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)
<ref>https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor</ref>
<ref>https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor</ref>


Zeile 29: Zeile 47:


=== Containerisierung ===
=== Containerisierung ===
<cite>Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann. Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.<ref>https://www.ibm.com/de-de/topics/containerization</ref></cite>
Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann. Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.<ref>https://www.ibm.com/de-de/topics/containerization</ref>


Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.
Zeile 36: Zeile 54:


[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]
=== Vor- und Nachteile ===
Folgend eine sehr vereinfachte Gegenüberstellung:
'''Virtualisierung'''
Positiv: Sehr hoher Isolationsgrad
Negativ: Höherer Ressourcenverbrauch
'''Containerisierung'''
Positiv: Geringer Ressourcenverbrauch
Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet


== Docker ==
== Docker ==


Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.
  Natürlich kann Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert (starke Vereinfachung).
  Docker kann auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.


=== Container Isolierung ===
=== Container Isolierung ===
Zeile 60: Zeile 89:
  <cite>cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.</cite><ref>https://en.wikipedia.org/wiki/Cgroups</ref>
  <cite>cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.</cite><ref>https://en.wikipedia.org/wiki/Cgroups</ref>


CPU-Begrenzung: Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.
* '''CPU-Begrenzung''' - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.


Speicherbegrenzung: Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.
* '''Speicherbegrenzung''' - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.


I/O-Begrenzung: Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.
* '''I/O-Begrenzung''' - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.


==== Weitere Mechanismen ====
==== Weitere Mechanismen ====
Zeile 78: Zeile 107:


==== Images ====
==== Images ====
Images bilden in sich abgeschlossenen Applikationen welche mit der "Docker-Engine" erstellt und gestartet (Container) werden können.
Images bilden in sich abgeschlossenen Applikationen welche mit der '''Docker Engine''' erstellt und gestartet ('''Container''') werden können.


==== Registry ====
==== Registry ====
Zeile 90: Zeile 119:
<ref>https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte</ref>
<ref>https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte</ref>


=== [[Docker_2024_04/Containers|Container]] ===
=== [[Docker_2024_04/Networking|Networking]] ===
=== [[Docker_2024_04/Image|Image]] ===


Images & Container
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===
 
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===
    Parametrisierung: Umgebungsvariablen
=== [[Docker_2024_04/Registry|Registry]] ===
 
<br>
    Storage: Mounts und Volumes
 
    Networking Überblick: Bridge vs Host Network
 
    Networking Konfiguration: Portforwarding
 
    Ressourcen Limitierung:
 
        CPU
 
        Network
 
        IO
 
    Mit Container verbinden
 
        Dateien von/zu Host Kopieren
 
        Interaktives Terminal verbinden
 
        ?Kommandos von Host in Container ausführen?
 
Docker-Compose
 
    Würde ich generell docker run vorziehen, da übersichtlicher
 
    Gemeinsames Fallbeispiel
 
Dockerfile
 
    Eigenes Dockerfile auf Grundlage eines bestehenden Base Images erstellen
 
    Dockerfile für eigene Anwendung erstellen
 
    docker-compose für Service Verbund erstellen (z.b.: App + Datenbank)
 
?Registry?

Aktuelle Version vom 18. April 2024, 13:42 Uhr

Schulung Docker 2024/04

In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.

Teilnehmer_innen sollen nach der Schulung in der Lage sein

  • die Begriffe Virtualisierung und Containerisierung zu unterscheiden
  • bestehende Docker Images ausführen
  • eigene Docker Images zu erstellen und diese mittels docker run und docker compose zu starten
  • die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren
  • die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können
  • das Dateisystem und Volumes einbinden und verwalten
  • eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen

Welche Bereiche werden explizit ausgeklammert:

  • Limitierung von Netzwerkresourcen (siehe tc)
  • Limitierung von Speicherplatz (siehe XFS)

Datei:Dockerschulung 2024 04.odp

Virtualisierung vs Containerisierung

Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.

Gründe für Virtualisierung und Containerisierung

Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien. Folgende Gründe sprechen jedoch für die Verwendung dieser Technologien:

Teilen von Hardware Ressourcen
Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.
Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.
Isolation
Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.
Übertragbarkeit
Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.

Virtualisierung

Bei der Virtualisierung übernimmt der Hypervisor das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts an die virtualisierten Gast Betriebssysteme.

Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.[1]

Hypervisoren können in verschiedene Typen eingeteilt werden:

  • Typ 1, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)
  • Typ 2, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)

[2]

https://bi-insider.com/posts/virtual-machines-vs-containers/

Containerisierung

Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann. Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.[3]

Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.

Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.

https://bi-insider.com/posts/virtual-machines-vs-containers/

Vor- und Nachteile

Folgend eine sehr vereinfachte Gegenüberstellung:

Virtualisierung
Positiv: Sehr hoher Isolationsgrad
Negativ: Höherer Ressourcenverbrauch
Containerisierung
Positiv: Geringer Ressourcenverbrauch
Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet

Docker

Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.

Docker kann auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.

Container Isolierung

Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:

Namespaces

Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.[4]
  • PID Namespace - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.
  • Network Namespace - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.
  • Mount Namespace - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.
  • IPC Namespace - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.

CGroups

cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.[5]
  • CPU-Begrenzung - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.
  • Speicherbegrenzung - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.
  • I/O-Begrenzung - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.

Weitere Mechanismen

  • SELinux
  • AppArmor
  • ...

Weitere Informationen finden sich hier

Aufbau von Docker

Docker besteht aus den folgend genannten Komponenten:

Images

Images bilden in sich abgeschlossenen Applikationen welche mit der Docker Engine erstellt und gestartet (Container) werden können.

Registry

Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist dockerhub. Es kann jedoch auch eine eigene Registry erstellt werden.

Engine

Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:

  1. Docker-Daemon - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)
  2. REST Api - Dient der Kommunikation mit dem Docker Daemon
  3. Command Line Interface - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen

[6]