Benutzer-Werkzeuge

Webseiten-Werkzeuge


docker

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
docker [2024/10/25 20:27]
root [Compose.yaml]
docker [2024/10/29 21:21] (aktuell)
root [Registries]
Zeile 10: Zeile 10:
  
 ^Befehl ^Beschreibung ^ ^Befehl ^Beschreibung ^
 +|docker|Der Grundaufruf von Docker. \\ Dieser Eintrag dient nur dem listen von Optionen die direkt nach docker kommmen, nach diesen kommen dann die eigentlichen Befehle und deren Optionen. \\ Bsp: <WRAP>
 +<code>
 +docker -H=somehost.de:2375 run -d nginx
 +</code>
 +Würde auf einem entfernten Host somehost:2375 docker run mit der Option -d und Image nginx ausführen
 +^Option ^Beschreibung ^
 +|-H<Host:Port>|Führt den Befehl auf einem anderen Host aus|
 +</WRAP>|
 |docker run -d <Image-Name>:<Tag> <Command>|Startet ein Image (falls nicht vorhanden wird es heruntergeladen) und ermöglicht initiale Konfiguration. \\ <WRAP>  |docker run -d <Image-Name>:<Tag> <Command>|Startet ein Image (falls nicht vorhanden wird es heruntergeladen) und ermöglicht initiale Konfiguration. \\ <WRAP> 
   * -d - detach. Per Default werden alle Ausgaben aus dem Container (stdout) auf der Konsole ausgegeben und ein schließen der Konsole hat die Beendigung des Containers zur Folge   * -d - detach. Per Default werden alle Ausgaben aus dem Container (stdout) auf der Konsole ausgegeben und ein schließen der Konsole hat die Beendigung des Containers zur Folge
Zeile 23: Zeile 31:
 |-i|Interaktiv. Eingaben im Terminal werden an Docker übertragen. Sinnvoll wenn man zum Beispiel eine Shell im Container gestartet hat. Es wird an stdin attached| |-i|Interaktiv. Eingaben im Terminal werden an Docker übertragen. Sinnvoll wenn man zum Beispiel eine Shell im Container gestartet hat. Es wird an stdin attached|
 |-p <Host-Port>:<Container-Port>|Port-Mapping -> Mappt einen Port des Host-Systems auf einen Port des Containers -> Port-Forwarding. \\ \\ -p 8080:80 \\ Mappt Port 8080 des Hostsystems auf Port 80 des Containers| |-p <Host-Port>:<Container-Port>|Port-Mapping -> Mappt einen Port des Host-Systems auf einen Port des Containers -> Port-Forwarding. \\ \\ -p 8080:80 \\ Mappt Port 8080 des Hostsystems auf Port 80 des Containers|
-|-v <local dir>:<Container dir>|Volume -> Mappt ein lokales Verzeichnis in ein Verzeichnis in einem Container. \\ Normalerweise sind Daten verloren, wenn der Container gelöscht wird (zum Beispiel eine Datenbank), dadurch das man ein Volume auf ein Verzeichnis im Container mounted werden die Daten die in dieses Verzeichnis geschrieben werden praktisch auf dem host gespeichert|+|-v <Source>:<Container dir>|Volume -> Mappt ein lokales Verzeichnis in ein Verzeichnis in einem Container. \\ Normalerweise sind Daten verloren, wenn der Container gelöscht wird (zum Beispiel eine Datenbank), dadurch das man ein Volume auf ein Verzeichnis im Container mounted werden die Daten die in dieses Verzeichnis geschrieben werden praktisch auf dem host gespeichert. \\ \\ <WRAP> 
 +  * Source: 
 +      * Verzeichnis auf dem Host -> dann wird dieses Verzeichnis auf das Ziel gemountet 
 +      * Name -> dann wird ein Volume (ein Verzeichnis mit dem gegebenen Namen unter /var/lib/docker/volumes/<Name> ggf. erstellt und dorthin gemountet 
 +      * weggelassen (inkl. dem ":" -> es wird ein Nummernverzeichnis unter /var/lib/docker/volumes erstellt und dorthin gemountet 
 +  * Container Dir:  
 +      * das Verzeichnis im Container wohin gemountet werden soll. 
 + 
 +**Hinweis:** Es sollte <code>--mount</code> verwendet werden, statt -v, da es präziser/ausführlichere Angaben ermöglicht 
 +</WRAP>|
 |-e Variable=Wert|Setzt eine Umgebungsvariable (Environmentvariable) im Container auf einen bestimmten Wert. \\ Nützlich wenn bestimmte Dinge in der darin laufenden Applikation dynamisch gesetzt werden sollen| |-e Variable=Wert|Setzt eine Umgebungsvariable (Environmentvariable) im Container auf einen bestimmten Wert. \\ Nützlich wenn bestimmte Dinge in der darin laufenden Applikation dynamisch gesetzt werden sollen|
 |--name <Name>|Gibt dem Container einen Namen. \\ Dieser kann alternativ zur ID benutzt werden in Befehlen| |--name <Name>|Gibt dem Container einen Namen. \\ Dieser kann alternativ zur ID benutzt werden in Befehlen|
 |--entrypoint <Befehl>|Überschreibt den im Image definierten Entrypoint. \\ Hinter dem Image angegebene (oder wenn nicht) in CMD im Image angegebene Parameter werden weiterhin an den Entrypoint angehängt| |--entrypoint <Befehl>|Überschreibt den im Image definierten Entrypoint. \\ Hinter dem Image angegebene (oder wenn nicht) in CMD im Image angegebene Parameter werden weiterhin an den Entrypoint angehängt|
 +|--cpus <Wert>|Anzahl CPUs die der Container nutzen kann. \\ Es sind auch Nachkommastellen, auch unterhalb von 0 möglich -> .5 -> eine CPU zur Hälfte auslasten|
 +|--memory <Wert>|Menge RAM die der Container maximal nutzen kann. \\ Es können Einheteiten wie 100m -> 100 Megabyte genutzt werden. \\ **Hinweis:** Dies definiert das Maximum das ein Container nutzen kann, aber sichert nicht zu das so viel Speicher ggf. auch angefordert werden kann -> sind mehrere Container/Prozesse auf dem Host am laufen, teilen diese sich den Speicher, ist der Speicher auf dem Host alle bekommt der Container keinen mehr.|
 +|--mount|Hängt ein Volume oder ein Verzeichnis in den Container ein - so wie -v. \\ <WRAP>
 +<sxh bash>
 +docker run --mount type=<type>,source=<source>,destination=<destination> -d whatever
 +</sxh>
 +
 +Die Optionen von --mount müssen hintereinander weg, ohne Leerzeichen angegeben werden.
 +
 +^Option ^Beschreibung ^
 +|<type>|<WRAP>
 +  * bind -> ein Verzeichnis des Hosts wird als Verzeichnis im Container eingehängt
 +  * volume -> ein Docker-Volume -> Verzeichnis unter /var/lib/docker/volumes wird in den Container eingehängt
 +  * tmpfs -> ein temporäres (nur im Speicher existentes) Dateisystem wird in den Container eingehängt. Dieses wird gelöscht sobald der Container gestoppt wird (ist für temporäre Dateien)
 +</WRAP> |
 +|source|Abhängig von type. \\ <WRAP>
 +  * volume -> Name den das volume haben soll. Optional, ansonsten wird ein numerischer Name vergeben
 +  * bind -> Pfad zum Verzeichnis auf dem Host was in den Container gemountet werden soll
 +</WRAP>|
 +|destination|Pfad im Container in den gemountet werden soll|
 +</WRAP>|
 +|--link <Container-Name>:<Zielname>|"Verlinkt" macht einen existierenden Container von dem neu erstellten aus über den angegebenen Namen erreichbar. \\ \\ Praktisch wird die /etc/hosts im neu erstellten Container geändert, so das er über <Zielname> den Container mit <Container-Name> erreichen kann. \\ Ein besserer Weg ist über docker compose, alle Maschinen eines Compose-Aufrufs befinden sich im gleichen Netzwerk und können sich über ihren Namen erreichen|
 +|--network <Netzwerkname>|Bindet den Container an ein bestimmtes Netzwerk. \\ \\ Per Default binden sich Container an die Docker-Default-Bridge (für gewöhnlich docker0). \\ \\ <WRAP>
 +^Netzwerkname ^Beschreibung^
 +|none|Kein Netzwerk|
 +|host|Das Hostnetzwerk. Alle Ports sind direkt "nach außen" geführt. Sprich ein Port 8080 im Container erscheint direkt auf dem Host-Netzwerk-Interface. Port-Mapping ist hier nicht möglich|
 +|<irgendeinName>|Ein spezifisches Netzwerk. Dieses muss zuvor mit docker network create erstellt worden sein|
 +</WRAP>|
 </WRAP>| </WRAP>|
 |docker start <Container-ID/Name>|Startet einen Container| |docker start <Container-ID/Name>|Startet einen Container|
Zeile 67: Zeile 112:
 |up|Sucht nach einer compose.yaml-Datei im aktuellen Verzeichnis und startet die darin enthaltenen Container und Netzwerke| |up|Sucht nach einer compose.yaml-Datei im aktuellen Verzeichnis und startet die darin enthaltenen Container und Netzwerke|
 </WRAP>| </WRAP>|
 +|docker volume|Verwaltung von volumes. \\ Volumes sind bleibender (persistent) Speicher die in den Container in ein Verzeichnis gemountet werden können (siehe docker run -v-Option). Container sind modifizierbar (Änderungen bleiben also erhalten), aber sobald der Container gelöscht wird sind die Änderungen weg -> was z.B. bei Datenbanken ggf. unerwünscht ist. \\ \\ <WRAP> 
 +^Unterbefehl ^Beschreibung ^ 
 +|create <Volume-Name>|Erstellt ein neues Volume| 
 +</WRAP>
 +|docker network|Verwaltet die Netzwerke \\ \\ <WRAP> 
 +^Unterbefehl ^Beschreibung ^ 
 +|create <Name>|Erstellt ein Netzwerk mit dem <Namen>\\ <WRAP> 
 +^Option ^Beschreibung ^ 
 +|--driver|Welcher Netzwerktreiber genutzt werden soll - optional. \\ Default: Bridge <WRAP> 
 +  * bridge - Default, stellt ein Subnetz zur Verfügung was über eine Bridge mit dem Host verbunden ist 
 +  * overlay - wird bei Docker Swarm genutzt 
 +</WRAP>
 +|--subnet|Welches Subnetz verwendet werden soll - otpional. \\ Wird es nicht angegeben vergibt Docker automatisch eins. \\ <code>--subnet 127.2.0.0/16</code>
 +</WRAP>
 +|inspect <Name>|Gibt die Informationen zum entsprechenden Netzwerk zurück. \\ \\ U.a. vergebene IPs, Default-Gateway, beteiligte Container| 
 +|connect <Netzwerkname> <Containername> |Verbindet einen existierenden Container mit einem zusätzlichen Netzwerk| 
 +|disconnect <Netzwerkname> <Containername>|Entfernt einen existierenden Container aus einem Netzwerk| 
 +</WRAP>|
 ====== Dockerfile ====== ====== Dockerfile ======
  
Zeile 168: Zeile 230:
 |build|<Name des Services>|String|Kann statt Image angegeben werden und baut das Image beim ausführen von docker compose up. \\ Verzeichnis in dem sich das zu bauende Dockerfile befindet| |build|<Name des Services>|String|Kann statt Image angegeben werden und baut das Image beim ausführen von docker compose up. \\ Verzeichnis in dem sich das zu bauende Dockerfile befindet|
 |depends_on|<Name des Service|List|Gibt an das der Container erst gestartet werden soll wenn ein oder mehrere andere Container gestartet wurden. \\ Die Liste gibt an auf welche Container gewartet werden soll. \\ \\ Zum Beispiel muss zuerst der DB Container vor dem Application-Container gestartet werden (weil die Anwendung sich zur Datenbank verbinden muss). Dann wird beim Application-Eintrag ein depends_on-Eintrag mit "db" angelegt.| |depends_on|<Name des Service|List|Gibt an das der Container erst gestartet werden soll wenn ein oder mehrere andere Container gestartet wurden. \\ Die Liste gibt an auf welche Container gewartet werden soll. \\ \\ Zum Beispiel muss zuerst der DB Container vor dem Application-Container gestartet werden (weil die Anwendung sich zur Datenbank verbinden muss). Dann wird beim Application-Eintrag ein depends_on-Eintrag mit "db" angelegt.|
 +|networks|root|Dictionary|Enthält die Namen der Netzwerke.|
 +|<Netzwerk-name>|networks|Dictionary|Netzwerk-Einträge. \\ \\ Kann ein leeres Dictionary sein <code><Netzwerkname>: </code> dann sind keine weiteren Eigenschaften für das Netzwerk definiert und Default-Eigenschaften werden genutzt|
 +|<Netzwerk-Name>|<Name des Service>|List|Liste von Netzwerken (definiert in network-key unterhalb von root) denen der Container angehört.\\ Innerhalb dieser ist der Container über seinen Namen ansprechbar/erreichbar (Namensauflösung)|
 +
 +
 +======= Funktionsweise =======
 +
 +Namespaces (Kernel-Feature) werden genutzt um Prozesse und Netzwerke zu trennen. \\
 +Der Host sieht dabei die Prozesse die im Container laufen als ganz normale Prozesse, mit normaler ID. \\ 
 +Der Container sieht eine eigene PID 1 und seine eigenen Prozesse mit ansteigenden PIDs - die von den PIDs abweichen die die gleichen Prozesse auf dem Hostsystem haben.
 +\\ \\ \\
 +Über cgroups (Kernel-Feature) kann die Nutzung von CPU und RAM eingeschränkt werden. \\ Effektiv wird die cgroup auf die Prozesse im Containers angewendet.
 +
 +
 +======= Layered Approach =======
 +
 +  * Ein Image besteht aus Layern (Schichten)
 +  * Jeder Befehl im Dockerfile bildet eine eigene Schicht
 +  * die nächste Schicht speichert jeweils nur die Veränderungen gegenüber der vorhergehenden Schicht
 +  * ein Container bildet eine beschreibbare (für die Zeit die der Container existiert) Schicht oberhalb aller Schichten des Containers
 +
 +
 +  * Schichten werden als solche gespeichert (gecached)
 +      * hat den Vorteil das man wenn man das Dockerfile modifiziert oder basierend auf existierenden Schichten ein neues baut, nur die neuen/modifizierten Schichten neu erzeugen muss - die bereits existierenden werden einfach genommen wie sie sind
 +
 +
 +====== Volumes ======
 +
 +Man kann Verzeichnisse, Volumes (letztendlich Verzeichnisse unter /var/lib/docker/volumes) und tmpfs (Volumes im Arbeitsspeicher die nur existieren solange der Container läuft) in den Container mounten. \\ 
 +Das ist sinnvoll wenn:
 +
 +  * Viel auf geschrieben/gelesen werden muss in dem Verzeichnis
 +      * Container haben zwar einen beschreibbaren Layer, aber auf Grund des Copy-on-Write-Approaches (Dateien die verändert werden müssen zuerst kopiert werden und dann modifiziert (theoretisch, hängt vom Storage-Driver ab) relativ langsam ist
 +  * Daten permanent gespeichert werden sollen, unabhängig von der Existenz des Containers
 +      * alles was im Container gespeichert wird geht mit dem löschen (nicht dem stoppen) des Containers verloren
 +
 + Ggf. kann man auch den Storage-Treiber für den Container ändern um mehr Schreibperformance innerhalb des Containers rauszuholen, besser ist aber Volumes/Mounts zu nutzen.
 +====== Dateien/Verzeichnisse ======
 +
 +^Datei/Verzeichnis^Bedeutung^
 +|/var/lib/docker|Alle Dateien die Docker dynamisch erzeugt|
 +|/var/lib/docker/image|Images|
 +|/var/lib/docker/containers|Jeder Container hat hier ein Verzeichnis. \\ \\ U.a. Config, Logs usw. liegen hier|
 +|/var/lib/docker/volumes|Volumes die per docker volume create erstellt werden befinden sich hier|
 +
 +
 +======= Registry ======
 +
 +
 +===== Image beziehen =====
 +
 +  * Standardmäßig wird von docker.io geladen
 +
 +Von einer anderen Registrie laden:
 +<sxh bash>
 +docker login
 +docker run <Registrie-Name>/<Verzeichnis>/<Image>:<Tag>
 +</sxh>
 +
 +  * docker login muss nur ausgeführt werden wenn ein Benutzer-Name und Passwort für den Zugang notwendig ist und auch nur einmal pro Sitzung
 +  * <Registrie-Name> -> Name der Registrie - something.de
 +  * <Verzeichnis> -> Verzeichnis, zum Beispiel wenn es nach Benutzern organisiert ist
 +  * <Image> -> Name des gewünschten Images
 +  * <Tag> -> Tag des Images
 +
 +
 +===== Image in private Registry pushen =====
 +
 +<sxh bash>
 +docker tag <Imagename> <Host:Port>/<Pfad>/<Imagename>:<Tag>
 +docker login
 +docker push <NewImagename>
 +</sxh>
 +
 +  * docker tag gibt einem Image einen (zusätzlichen) Namen. Der Name bei privaten Registries enthält den Namen der Registy
 +      * Host -> Host, z.B. myregistry.de
 +          * kann auch localhost sein wenn die Registry auf dem gleichen Host läuft
 +      * Port -> anzugeben wenn der Port nicht 5000 ist
 +      * Pfad -> optional ein Pfad, z.B. myusername
 +      * Imagename -> der Name des Images, z.B. meineApp
 +      * Tag -> Optional ein Tag, z.B. testing
 +      * docker tag baseimage myregistry.de:5000/myusername/meineApp:testing
 +  * docker login
 +      * nur notwendig wenn die Registry eine Authentifizierung benötigt
 +  * docker push lädt das neue Image hoch
 +      * <NewImageName> = myregistry.de:5000/myusername/meineApp:testing
 +          * kompletter Name, inkl. Registry
 +          * so muss das Image auch per docker pull oder docker run angesprochen werden
 +===== Private Restry aufsetzen =====
 +
 +  * Docker Registry ist als Image verfügbar -> Resistry
 +  * es lauscht standardmäßig an Port 5000
 +
 +
 +
 ====== Troubleshooting ====== ====== Troubleshooting ======
  
docker.1729880858.txt.gz · Zuletzt geändert: 2024/10/25 20:27 von root