Parameter des Docker Run-Befehls

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir uns ausschließlich auf den Befehl docker run und seine verschiedenen Parameter konzentrieren. Der Befehl docker run ist für Docker-Operationen von grundlegender Bedeutung, da er es uns ermöglicht, Container mit bestimmten Konfigurationen zu erstellen und zu starten.

Durch das Beherrschen der Parameter dieses Befehls erhalten Sie eine bessere Kontrolle über Ihre containerisierten Anwendungen und verbessern Ihre Fähigkeit, Docker-Container effektiv bereitzustellen und zu verwalten.

Wir werden eine Vielzahl von Parametern behandeln, darunter solche für die Benennung, den detached-Modus, die Portzuordnung, die Volumeeinbindung, Umgebungsvariablen, Ressourcenbeschränkungen und vieles mehr.

Einige der Parameter kennen Sie vielleicht bereits, während andere Ihnen neu sein könnten.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ContainerOperationsGroup -.-> docker/port("List Container Ports") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/run -.-> lab-389228{{"Parameter des Docker Run-Befehls"}} docker/ls -.-> lab-389228{{"Parameter des Docker Run-Befehls"}} docker/exec -.-> lab-389228{{"Parameter des Docker Run-Befehls"}} docker/inspect -.-> lab-389228{{"Parameter des Docker Run-Befehls"}} docker/port -.-> lab-389228{{"Parameter des Docker Run-Befehls"}} docker/volume -.-> lab-389228{{"Parameter des Docker Run-Befehls"}} docker/network -.-> lab-389228{{"Parameter des Docker Run-Befehls"}} end

Grundlagen von Docker Run und Container-Benennung

Beginnen wir mit den Grundlagen des Befehls docker run und untersuchen, wie wir unsere Container benennen können.

Zunächst starten wir einen einfachen Nginx-Container:

docker run nginx

Dieser Befehl startet einen Nginx-Container im Vordergrund. Sie werden im Terminal einen Strom von Protokollausgaben sehen. Dies liegt daran, dass der Container im Vordergrund läuft und Ihnen die Protokolle direkt anzeigt.

Um diesen Container zu stoppen, drücken Sie Strg+C. Möglicherweise bemerken Sie, dass es ein paar Sekunden dauert, bis der Container stoppt – dies ist normal, da Docker dem Container Zeit gibt, sich ordnungsgemäß herunterzufahren.

Nun starten wir den Container im detached-Modus und geben ihm einen Namen:

docker run -d --name my-nginx nginx

Lassen Sie uns diesen Befehl zerlegen:

  • docker run: Dies ist der grundlegende Befehl zum Starten eines Containers.
  • -d: Diese Option startet den Container im detached-Modus, d. h. er läuft im Hintergrund. Sie werden keine Ausgabe im Terminal sehen.
  • --name my-nginx: Dies weist dem Container den Namen "my-nginx" zu. Wenn Sie keinen Namen angeben, wird Docker einen zufälligen Namen zuweisen.
  • nginx: Dies ist der Name des Images, das wir zum Erstellen des Containers verwenden.

Nachdem Sie diesen Befehl ausgeführt haben, werden Sie eine lange Zeichenfolge sehen. Dies ist die Container-ID. Docker hat den Container im Hintergrund gestartet.

Wenn Sie eine Fehlermeldung erhalten, dass der Name bereits verwendet wird, bedeutet dies, dass Sie bereits einen Container mit diesem Namen haben. Sie können entweder einen anderen Namen wählen oder den vorhandenen Container entfernen (wie dies geht, lernen wir in späteren Labs).

Portzuordnung

Der Parameter -p in docker run ermöglicht es uns, Ports vom Container auf den Host zuzuordnen. Dies ist entscheidend, um von Ihrer Hostmaschine aus auf Dienste zuzugreifen, die innerhalb des Containers laufen.

Starten Sie einen Nginx-Container mit Portzuordnung:

docker run -d --name nginx-mapped -p 8080:80 nginx

Lassen Sie uns die neuen Teile dieses Befehls analysieren:

  • -p 8080:80: Dies ordnet Port 8080 auf Ihrem Host Port 80 im Container zu. Das Format ist immer host_port:container_port.

Nginx läuft standardmäßig auf Port 80 innerhalb des Containers. Indem wir ihn auf Port 8080 auf unserem Host zuordnen, können wir darauf zugreifen, indem wir in einem Webbrowser auf localhost:8080 gehen.

Jetzt überprüfen wir, ob die Nginx-Willkommensseite erreichbar ist. Wir verwenden den Befehl curl, der es uns ermöglicht, HTTP-Anfragen von der Befehlszeile aus zu stellen:

curl http://localhost:8080

Sie sollten den HTML-Inhalt der Nginx-Willkommensseite sehen. Wenn Sie curl nicht installiert haben, können Sie es mit folgendem Befehl installieren:

sudo apt-get update && sudo apt-get install -y curl

Wenn Sie immer noch nicht auf die Seite zugreifen können, sollten Sie folgende Dinge überprüfen:

  1. Stellen Sie sicher, dass der Container läuft: docker ps | grep nginx-mapped
  2. Überprüfen Sie, ob der Port tatsächlich zugeordnet ist: docker port nginx-mapped
  3. Wenn Sie einen Cloud-Server verwenden, stellen Sie sicher, dass die Firewall den Datenverkehr auf Port 8080 zulässt.

Volumeeinbindung

Der Parameter -v in docker run ermöglicht es uns, Volumes einzubinden und Daten zwischen dem Host und dem Container zu teilen. Dies ist äußerst nützlich, um Daten persistent zu speichern oder Konfigurationsdateien an den Container zu übergeben.

Beginnen wir damit, eine einfache Verzeichnisstruktur auf unserem Host zu erstellen:

mkdir -p ~/project/nginx-data
echo "<html><body><h1>Hello from mounted volume</h1></body></html>" > ~/project/nginx-data/index.html

Diese Befehle tun Folgendes:

  1. Erstellen Sie ein neues Verzeichnis nginx-data im project-Ordner in Ihrem Home-Verzeichnis.
  2. Erstellen Sie eine einfache HTML-Datei namens index.html in diesem neuen Verzeichnis.

Jetzt starten wir einen Nginx-Container und binden dieses Verzeichnis ein:

docker run -d --name nginx-volume -p 8081:80 -v ~/project/nginx-data:/usr/share/nginx/html nginx

Lassen Sie uns diesen Befehl zerlegen:

  • docker run: Dies ist der Befehl, um einen neuen Container zu starten.
  • -d: Dies startet den Container im detached-Modus (im Hintergrund).
  • --name nginx-volume: Dies weist dem Container den Namen "nginx-volume" zu.
  • -p 8081:80: Dies ordnet Port 8081 auf dem Host Port 80 im Container zu.
  • -v ~/project/nginx-data:/usr/share/nginx/html: Dies bindet das nginx-data-Verzeichnis von unserem Host an das Verzeichnis /usr/share/nginx/html im Container ein. Hier sucht Nginx nach Inhalten, die es servieren soll.
  • nginx: Dies ist der Name des Images, das wir zum Erstellen des Containers verwenden.

Jetzt überprüfen wir, ob die benutzerdefinierte Seite serviert wird:

curl http://localhost:8081

Sie sollten den Inhalt Ihrer benutzerdefinierten HTML-Datei sehen: "Hello from mounted volume!"

Wenn Sie Ihren benutzerdefinierten Inhalt nicht sehen, sollten Sie folgende Dinge überprüfen:

  1. Stellen Sie sicher, dass die Datei ~/project/nginx-data/index.html auf Ihrem Host-System existiert.
  2. Überprüfen Sie, ob der Container läuft: docker ps | grep nginx-volume
  3. Prüfen Sie die Nginx-Protokolle auf Fehler: docker logs nginx-volume

Diese Methode, ein Host-Verzeichnis an einen Container einzubinden, wird als Bind-Mount (Bindungseinbindung) bezeichnet. Es ist eine einfache Möglichkeit, Dateien zwischen dem Host und dem Container zu teilen. Hier sind einige wichtige Punkte zu beachten:

  1. Der Pfad des Host-Verzeichnisses muss ein absoluter Pfad sein.
  2. Wenn das Host-Verzeichnis nicht existiert, wird Docker es automatisch erstellen.
  3. Alle Änderungen an Dateien in diesem Verzeichnis (sowohl auf dem Host als auch im Container) sind sofort für den Host und den Container sichtbar.
  4. Achten Sie auf die Berechtigungen: Der Container läuft standardmäßig als root, was möglicherweise Dateien erstellt, die Ihr Host-Benutzer nicht ändern kann.

Durch die Verwendung dieser Methode vermeiden wir den Fehler "not a directory" (kein Verzeichnis), da wir ein Verzeichnis und nicht eine einzelne Datei einbinden. Dieser Ansatz gibt Ihnen mehr Flexibilität, um Dateien hinzuzufügen, zu entfernen oder zu ändern, ohne den Container neu erstellen zu müssen.

Umgebungsvariablen

Der Parameter -e in docker run ermöglicht es uns, Umgebungsvariablen im Container zu setzen. Dies ist nützlich, um die in einem Container laufende Anwendung zu konfigurieren, ohne ihren Code zu ändern.

Starten Sie einen Container mit Umgebungsvariablen:

docker run -d --name nginx-env -e NGINX_HOST=mywebsite.com -e NGINX_PORT=80 nginx

Lassen Sie uns die neuen Teile analysieren:

  • -e NGINX_HOST=mywebsite.com: Dies setzt eine Umgebungsvariable namens NGINX_HOST mit dem Wert mywebsite.com.
  • -e NGINX_PORT=80: Dies setzt eine weitere Umgebungsvariable NGINX_PORT mit dem Wert 80.

Umgebungsvariablen sind Schlüssel-Wert-Paare, auf die von Prozessen innerhalb des Containers zugegriffen werden kann. Viele Docker-Images sind so konzipiert, dass sie bestimmte Umgebungsvariablen zur Konfiguration verwenden.

Sie können die Umgebungsvariablen überprüfen:

docker exec nginx-env env | grep NGINX_

Dieser Befehl macht Folgendes:

  • docker exec nginx-env: Dies teilt Docker mit, einen Befehl im laufenden nginx-env-Container auszuführen.
  • env: Dieser Befehl gibt alle Umgebungsvariablen aus.
  • | grep NGINX_: Dies filtert die Ausgabe, sodass nur Zeilen angezeigt werden, die "NGINX_" enthalten.

Sie sollten Ihre beiden Umgebungsvariablen aufgeführt sehen.

Wenn Sie die Umgebungsvariablen nicht sehen, überprüfen Sie:

  1. Läuft der Container? Überprüfen Sie dies mit docker ps | grep nginx-env
  2. Haben Sie die Namen der Umgebungsvariablen in Ihrem docker run-Befehl korrekt geschrieben?

Ressourcenbeschränkungen

Docker ermöglicht es Ihnen, Ressourcenbeschränkungen für Container mithilfe verschiedener Parameter in docker run festzulegen. Dies ist entscheidend für die Verwaltung der Leistung und Stabilität Ihres Host-Systems, insbesondere wenn Sie mehrere Container ausführen.

Starten Sie einen Container mit Speicher- und CPU-Beschränkungen:

docker run -d --name nginx-limited --memory 256m --cpus 0.5 nginx

Lassen Sie uns die neuen Teile analysieren:

  • --memory 256m: Dies beschränkt den Container auf 256 Megabyte Arbeitsspeicher. Das 'm' steht für Megabyte. Sie könnten auch 'g' für Gigabyte verwenden.
  • --cpus 0.5: Dies beschränkt den Container darauf, maximal die Hälfte eines CPU-Kerns zu nutzen.

Diese Beschränkungen verhindern, dass der Container mehr Ressourcen als angegeben verwendet, was dazu beitragen kann, zu verhindern, dass ein einzelner Container die Ressourcen des Hosts monopolisiert.

Sie können überprüfen, ob diese Beschränkungen korrekt angewendet wurden:

docker inspect -f '{{.HostConfig.Memory}}' nginx-limited
docker inspect -f '{{.HostConfig.NanoCpus}}' nginx-limited

Der erste Befehl sollte 268435456 ausgeben (256 MB in Bytes), und der zweite sollte 500000000 ausgeben (0,5 CPU in Nano-Einheiten).

Wenn Sie andere Werte sehen, überprüfen Sie Ihren docker run-Befehl noch einmal, um sicherzustellen, dass Sie die Beschränkungen korrekt angegeben haben.

Hinweis: Wenn Sie die Ressourcenbeschränkungen zu niedrig setzen, kann dies dazu führen, dass der Container schlecht funktioniert oder sogar abstürzt. Wenn Sie Probleme mit Ihrem Container haben, versuchen Sie, diese Beschränkungen zu erhöhen.

Netzwerkeinstellungen

Der Parameter --network in docker run ermöglicht es Ihnen, einen Container an ein Netzwerk anzuschließen. Dies ist nützlich für die Kommunikation zwischen Containern und für die Isolierung von Containergruppen.

Zuerst erstellen Sie ein benutzerdefiniertes Bridge-Netzwerk (Brückennetzwerk):

docker network create my-custom-network

Dies erstellt ein neues Bridge-Netzwerk namens my-custom-network. Bridge-Netzwerke sind der am häufigsten verwendete Netzwerktyp in Docker.

Jetzt starten Sie einen Container, der an dieses Netzwerk angeschlossen ist:

docker run -d --name nginx-networked --network my-custom-network nginx

Die Option --network my-custom-network verbindet den Container mit dem Netzwerk, das wir gerade erstellt haben.

Container auf demselben Netzwerk können miteinander kommunizieren, indem sie die Containernamen als Hostnamen verwenden. Dies erleichtert es, Dienste miteinander zu verknüpfen.

Wenn Sie eine Fehlermeldung erhalten, dass das Netzwerk nicht existiert, stellen Sie sicher, dass Sie das Netzwerk korrekt mit dem Befehl docker network create erstellt haben.

Neustartrichtlinien

Der Parameter --restart in docker run ermöglicht es Ihnen, eine Neustartrichtlinie für den Container anzugeben. Dies ist nützlich, um sicherzustellen, dass Ihre Container auch dann weiterlaufen, wenn sie abstürzen oder wenn der Docker-Daemon neu gestartet wird.

Starten Sie einen Container mit einer Neustartrichtlinie:

docker run -d --name nginx-restart --restart unless-stopped nginx

Die Option --restart unless-stopped setzt die Neustartrichtlinie auf "unless-stopped" (außer gestoppt), was bedeutet, dass der Container automatisch neu gestartet wird, es sei denn, er wird explizit vom Benutzer gestoppt.

Andere Neustartrichtlinien umfassen:

  • no: Die Standardeinstellung. Der Container wird nicht automatisch neu gestartet.
  • on-failure: Der Container wird nur neu gestartet, wenn er mit einem Nicht-Null-Status beendet wird.
  • always: Der Container wird immer neu gestartet, unabhängig vom Beendigungsstatus.

Sie können die Neustartrichtlinie überprüfen:

docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' nginx-restart

Dies sollte unless-stopped ausgeben.

Wenn Sie die erwartete Ausgabe nicht sehen, überprüfen Sie Ihren docker run-Befehl noch einmal, um sicherzustellen, dass Sie die Neustartrichtlinie korrekt angegeben haben.

Arbeitsverzeichnis und Befehl

In diesem Schritt werden wir untersuchen, wie man ein Arbeitsverzeichnis innerhalb eines Containers festlegt und benutzerdefinierte Befehle ausführt, wenn ein Container startet.

Der Parameter -w in docker run legt das Arbeitsverzeichnis innerhalb des Containers fest, und Sie können einen Befehl angeben, der nach dem Imagenamen ausgeführt werden soll.

Lassen Sie uns diese Konzepte kombinieren:

docker run -d --name nginx-custom -w /app nginx sh -c "touch newfile.txt && nginx -g 'daemon off;'"

Lassen Sie uns diesen Befehl zerlegen:

  • -d: Führen Sie den Container im detached-Modus (im Hintergrund) aus.
  • --name nginx-custom: Benennen Sie den Container "nginx-custom".
  • -w /app: Legen Sie das Arbeitsverzeichnis innerhalb des Containers auf /app fest.
  • nginx: Der Name des zu verwendenden Images.
  • sh -c "...": Führen Sie einen Shell-Befehl aus.
    • touch newfile.txt: Erstellen Sie eine leere Datei namens newfile.txt.
    • &&: Führen Sie den nächsten Befehl aus, wenn der vorherige erfolgreich war.
    • nginx -g 'daemon off;': Starten Sie Nginx im Vordergrund, um den Container am Laufen zu halten.

Jetzt überprüfen wir, ob der Container läuft und die Datei erstellt wurde:

docker ps | grep nginx-custom
docker exec nginx-custom ls -l /app/newfile.txt

Der erste Befehl sollte anzeigen, dass der Container läuft, und der zweite Befehl sollte die Details der Datei newfile.txt im Verzeichnis /app des Containers auflisten.

Zusammenfassung

In diesem Lab haben wir uns eingehend mit dem Befehl docker run beschäftigt und seine verschiedenen Parameter und Optionen untersucht. Wir haben folgende Themen behandelt:

  1. Grundlagen des Containerstarts und Benennung
  2. Port-Mapping (Portzuordnung), um Container-Services vom Host aus zugänglich zu machen
  3. Volume-Mounting (Volume-Anbindung), um Daten zwischen Host und Container zu teilen
  4. Festlegen von Umgebungsvariablen für die Container-Konfiguration
  5. Anwenden von Ressourcenbeschränkungen, um die Ressourcenauslastung von Containern zu begrenzen
  6. Netzwerkeinstellungen für die Container-Kommunikation
  7. Neustartrichtlinien für die Zuverlässigkeit von Containern
  8. Festlegung des Arbeitsverzeichnisses und des Startbefehls für Container

Diese Parameter von docker run bieten leistungsstarke Werkzeuge zur Konfiguration und Verwaltung Ihrer Docker-Container. Indem Sie diese Optionen beherrschen, können Sie komplexere und maßgeschneiderte Container-Deployments erstellen. Sie können steuern, wie Container mit dem Host-System interagieren, welche Ressourcen sie verbrauchen können und wie sie sich in verschiedenen Szenarien verhalten.