Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
|
docker [2024/10/25 22:30] 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: < | ||
| + | < | ||
| + | docker -H=somehost.de: | ||
| + | </ | ||
| + | Würde auf einem entfernten Host somehost: | ||
| + | ^Option ^Beschreibung ^ | ||
| + | |-H< | ||
| + | </ | ||
| |docker run -d < | |docker run -d < | ||
| * -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 < | |-p < | ||
| - | |-v <local dir>:< | + | |-v <Source>:< |
| + | * 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 / | ||
| + | * weggelassen (inkl. dem ":" | ||
| + | * Container Dir: | ||
| + | * das Verzeichnis im Container wohin gemountet werden soll. | ||
| + | |||
| + | **Hinweis: | ||
| + | </ | ||
| |-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 < | ||
| |--entrypoint < | |--entrypoint < | ||
| + | |--cpus < | ||
| + | |--memory < | ||
| + | |--mount|Hängt ein Volume oder ein Verzeichnis in den Container ein - so wie -v. \\ < | ||
| + | <sxh bash> | ||
| + | docker run --mount type=< | ||
| + | </ | ||
| + | |||
| + | Die Optionen von --mount müssen hintereinander weg, ohne Leerzeichen angegeben werden. | ||
| + | |||
| + | ^Option ^Beschreibung ^ | ||
| + | |< | ||
| + | * bind -> ein Verzeichnis des Hosts wird als Verzeichnis im Container eingehängt | ||
| + | * volume -> ein Docker-Volume -> Verzeichnis unter / | ||
| + | * 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) | ||
| + | </ | ||
| + | |source|Abhängig von type. \\ < | ||
| + | * 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 | ||
| + | </ | ||
| + | |destination|Pfad im Container in den gemountet werden soll| | ||
| + | </ | ||
| + | |--link < | ||
| + | |--network < | ||
| + | ^Netzwerkname ^Beschreibung^ | ||
| + | |none|Kein Netzwerk| | ||
| + | |host|Das Hostnetzwerk. Alle Ports sind direkt "nach außen" | ||
| + | |< | ||
| + | </ | ||
| </ | </ | ||
| |docker start < | |docker start < | ||
| 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| | ||
| </ | </ | ||
| + | |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. \\ \\ < | ||
| + | ^Unterbefehl ^Beschreibung ^ | ||
| + | |create < | ||
| + | </ | ||
| + | |docker network|Verwaltet die Netzwerke \\ \\ < | ||
| + | ^Unterbefehl ^Beschreibung ^ | ||
| + | |create < | ||
| + | ^Option ^Beschreibung ^ | ||
| + | |--driver|Welcher Netzwerktreiber genutzt werden soll - optional. \\ Default: Bridge < | ||
| + | * bridge - Default, stellt ein Subnetz zur Verfügung was über eine Bridge mit dem Host verbunden ist | ||
| + | * overlay - wird bei Docker Swarm genutzt | ||
| + | </ | ||
| + | |--subnet|Welches Subnetz verwendet werden soll - otpional. \\ Wird es nicht angegeben vergibt Docker automatisch eins. \\ < | ||
| + | </ | ||
| + | |inspect < | ||
| + | |connect < | ||
| + | |disconnect < | ||
| + | </ | ||
| ====== Dockerfile ====== | ====== Dockerfile ====== | ||
| Zeile 171: | Zeile 233: | ||
| |< | |< | ||
| |< | |< | ||
| + | |||
| + | |||
| + | ======= 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/ | ||
| + | |||
| + | |||
| + | ====== Volumes ====== | ||
| + | |||
| + | Man kann Verzeichnisse, | ||
| + | Das ist sinnvoll wenn: | ||
| + | |||
| + | * Viel auf geschrieben/ | ||
| + | * 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, | ||
| + | * 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, | ||
| + | ====== Dateien/ | ||
| + | |||
| + | ^Datei/ | ||
| + | |/ | ||
| + | |/ | ||
| + | |/ | ||
| + | |/ | ||
| + | |||
| + | |||
| + | ======= Registry ====== | ||
| + | |||
| + | |||
| + | ===== Image beziehen ===== | ||
| + | |||
| + | * Standardmäßig wird von docker.io geladen | ||
| + | |||
| + | Von einer anderen Registrie laden: | ||
| + | <sxh bash> | ||
| + | docker login | ||
| + | docker run < | ||
| + | </ | ||
| + | |||
| + | * 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 | ||
| + | * < | ||
| + | * < | ||
| + | * < | ||
| + | * <Tag> -> Tag des Images | ||
| + | |||
| + | |||
| + | ===== Image in private Registry pushen ===== | ||
| + | |||
| + | <sxh bash> | ||
| + | docker tag < | ||
| + | docker login | ||
| + | docker push < | ||
| + | </ | ||
| + | |||
| + | * 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: | ||
| + | * docker login | ||
| + | * nur notwendig wenn die Registry eine Authentifizierung benötigt | ||
| + | * docker push lädt das neue Image hoch | ||
| + | * < | ||
| + | * 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 | ||
| + | |||