Parameter des Docker-Run-Befehls

DockerBeginner
Jetzt üben

Einführung

In diesem Lab beschäftigen Sie sich ausschließlich mit dem Befehl docker run und seinen verschiedenen Parametern. Der Befehl docker run ist eine grundlegende Funktion von Docker. Mit ihm können Sie Container mit bestimmten Konfigurationen erstellen und starten.

Wenn Sie die Parameter dieses Befehls beherrschen, können Sie Ihre containerisierten Anwendungen besser steuern und Docker-Container effektiver bereitstellen und verwalten.

Sie lernen zahlreiche Parameter kennen, darunter Optionen zum Benennen von Containern, zum Ausführen im Hintergrund, zur Portzuordnung, zur Volume-Einbindung, zum Setzen von Umgebungsvariablen und zum Begrenzen von Ressourcen.

Einige dieser Parameter kennen Sie vielleicht bereits, andere sind möglicherweise neu für Sie.

Grundlagen von Docker Run und Containernamen

In diesem Abschnitt lernen Sie die Grundlagen von docker run kennen und erfahren, wie Sie Containern einen Namen geben.

Starten Sie zunächst einen einfachen Nginx-Container:

docker run nginx

Dieser Befehl startet einen Nginx-Container im Vordergrund. Im Terminal wird ein fortlaufender Strom von Protokollmeldungen angezeigt. Der Container läuft im Vordergrund und gibt seine Protokolle direkt im Terminal aus.

Drücken Sie Strg+C, um den Container zu stoppen. Möglicherweise dauert es einige Sekunden, bis er beendet ist. Das ist normal: Docker gibt dem Container Zeit, ordnungsgemäß herunterzufahren.

Starten Sie den Container nun im Hintergrund und geben Sie ihm einen Namen:

docker run -d --name my-nginx nginx

Sehen wir uns die einzelnen Bestandteile des Befehls an:

  • docker run: Der grundlegende Befehl zum Starten eines Containers.
  • -d: Mit dieser Option läuft der Container im Hintergrund, also im Detached-Modus. Im Terminal wird keine Ausgabe angezeigt.
  • --name my-nginx: Weist dem Container den Namen „my-nginx“ zu. Wenn Sie keinen Namen angeben, weist Docker automatisch einen zufälligen Namen zu.
  • nginx: Der Name des Images, aus dem der Container erstellt wird.

Nach dem Ausführen dieses Befehls wird eine lange Zeichenfolge angezeigt. Das ist die Container-ID. Docker hat den Container im Hintergrund gestartet.

Wenn die Fehlermeldung erscheint, dass der Name bereits verwendet wird, gibt es schon einen Container mit diesem Namen. Sie können einen anderen Namen wählen oder den vorhandenen Container entfernen. Wie das geht, erfahren Sie in späteren Labs.

Portzuordnung

In diesem Abschnitt ordnen Sie mit dem Parameter -p von docker run einen Port im Container einem Port auf dem Host zu. So können Sie von Ihrem Hostsystem aus auf Dienste zugreifen, die im Container laufen.

Starten Sie einen Nginx-Container mit Portzuordnung:

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

Der neue Teil des Befehls lautet:

  • -p 8080:80: Ordnet Port 8080 auf dem Host Port 80 im Container zu. Das Format lautet immer host_port:container_port.

Nginx verwendet im Container standardmäßig Port 80. Wenn Sie diesen Port dem Host-Port 8080 zuordnen, können Sie Nginx in einem Webbrowser unter localhost:8080 aufrufen.

Prüfen Sie nun, ob die Nginx-Willkommensseite erreichbar ist. Mit dem Befehl curl können Sie HTTP-Anfragen über die Befehlszeile senden:

curl --retry 5 --retry-all-errors --retry-delay 1 http://localhost:8080

Die HTML-Inhalte der Nginx-Willkommensseite sollten angezeigt werden. Wenn curl noch nicht installiert ist, installieren Sie es mit diesem Befehl:

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

Falls Sie die Seite weiterhin nicht aufrufen können, überprüfen Sie Folgendes:

  • Prüfen Sie, ob der Container läuft: docker ps | grep nginx-mapped
  • Prüfen Sie, ob der Port tatsächlich zugeordnet ist: docker port nginx-mapped
  • Wenn Sie einen Cloud-Server verwenden, stellen Sie sicher, dass die Firewall Datenverkehr über Port 8080 zulässt.

Volumes einbinden

In diesem Abschnitt verwenden Sie den Parameter -v von docker run, um Volumes einzubinden und Daten zwischen Host und Container auszutauschen. Das ist hilfreich, um Daten dauerhaft zu speichern oder dem Container Konfigurationsdateien bereitzustellen.

Erstellen Sie zunächst eine einfache Verzeichnisstruktur auf dem Host:

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

Diese Befehle führen Folgendes aus:

  • Sie erstellen das neue Verzeichnis nginx-data im Ordner project Ihres Home-Verzeichnisses.
  • Sie erstellen die einfache HTML-Datei index.html in diesem neuen Verzeichnis.

Starten Sie nun einen Nginx-Container und binden Sie das Verzeichnis ein:

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

Sehen wir uns die einzelnen Bestandteile des Befehls an:

  • docker run: Startet einen neuen Container.
  • -d: Startet den Container im Detached-Modus, also im Hintergrund.
  • --name nginx-volume: Weist dem Container den Namen „nginx-volume“ zu.
  • -p 8081:80: Ordnet Port 8081 auf dem Host Port 80 im Container zu.
  • -v ~/project/nginx-data:/usr/share/nginx/html: Bindet das Verzeichnis nginx-data auf dem Host unter /usr/share/nginx/html im Container ein. In diesem Verzeichnis sucht Nginx nach den bereitzustellenden Inhalten.
  • nginx: Der Name des Images, aus dem der Container erstellt wird.

Prüfen Sie nun, ob die eigene Seite bereitgestellt wird:

curl --retry 5 --retry-all-errors --retry-delay 1 http://localhost:8081

Der Inhalt Ihrer eigenen HTML-Datei sollte angezeigt werden: „Hello from mounted volume!“

Falls Ihre eigenen Inhalte nicht angezeigt werden, überprüfen Sie Folgendes:

  • Stellen Sie sicher, dass die Datei ~/project/nginx-data/index.html auf dem Host vorhanden ist.
  • Prüfen Sie, ob der Container läuft: docker ps | grep nginx-volume
  • Prüfen Sie die Nginx-Protokolle auf Fehler: docker logs nginx-volume

Das Einbinden eines Host-Verzeichnisses in einen Container wird Bind Mount genannt. So lassen sich Dateien unkompliziert zwischen Host und Container austauschen. Beachten Sie dabei Folgendes:

  • Der Pfad des Host-Verzeichnisses muss absolut sein.
  • Wenn das Host-Verzeichnis nicht existiert, erstellt Docker es automatisch.
  • Änderungen an Dateien in diesem Verzeichnis sind sofort sowohl auf dem Host als auch im Container sichtbar.
  • Achten Sie auf die Berechtigungen: Der Container läuft standardmäßig als root. Dadurch können Dateien entstehen, die Sie als Host-Benutzer nicht ändern dürfen.

Mit dieser Methode vermeiden Sie den Fehler „not a directory“, da Sie ein Verzeichnis und keine einzelne Datei einbinden. So können Sie Dateien flexibler hinzufügen, entfernen oder ändern, ohne den Container neu erstellen zu müssen.

Umgebungsvariablen

In diesem Abschnitt verwenden Sie den Parameter -e von docker run, um Umgebungsvariablen im Container zu setzen. Damit können Sie die Anwendung 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

Die neuen Bestandteile des Befehls sind:

  • -e NGINX_HOST=mywebsite.com: Setzt die Umgebungsvariable NGINX_HOST auf den Wert mywebsite.com.
  • -e NGINX_PORT=80: Setzt die Umgebungsvariable NGINX_PORT auf den Wert 80.

Umgebungsvariablen bestehen aus Schlüssel-Wert-Paaren, auf die Prozesse im Container zugreifen können. Viele Docker-Images verwenden bestimmte Umgebungsvariablen zur Konfiguration.

Prüfen Sie, ob die Umgebungsvariablen gesetzt wurden:

docker exec nginx-env env | grep NGINX_

Dieser Befehl führt Folgendes aus:

  • docker exec nginx-env: Weist Docker an, einen Befehl im laufenden Container nginx-env auszuführen.
  • env: Gibt alle Umgebungsvariablen aus.
  • | grep NGINX_: Filtert die Ausgabe, sodass nur Zeilen mit NGINX_ angezeigt werden.

Die beiden Umgebungsvariablen sollten in der Ausgabe erscheinen.

Falls die Variablen nicht angezeigt werden, überprüfen Sie Folgendes:

  • Läuft der Container? Prüfen Sie dies mit docker ps | grep nginx-env.
  • Haben Sie die Namen der Umgebungsvariablen im Befehl docker run richtig geschrieben?

Ressourcen begrenzen

In diesem Abschnitt begrenzen Sie mit Parametern von docker run die Ressourcen eines Containers. Das ist wichtig, um die Leistung und Stabilität des Hostsystems zu steuern, besonders wenn mehrere Container laufen.

Starten Sie einen Container mit Speicher- und CPU-Begrenzungen:

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

Die neuen Bestandteile des Befehls sind:

  • --memory 256m: Begrenzt den Speicher des Containers auf 256 Megabyte. Das m steht für Megabyte. Sie können auch g für Gigabyte verwenden.
  • --cpus 0.5: Begrenzt die CPU-Nutzung des Containers auf höchstens einen halben CPU-Kern.

Mit diesen Begrenzungen verhindern Sie, dass der Container mehr Ressourcen als festgelegt verwendet. So kann vermieden werden, dass ein einzelner Container die Ressourcen des Hosts vollständig beansprucht.

Prüfen Sie, ob die Begrenzungen korrekt übernommen wurden:

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

Der erste Befehl sollte 268435456 ausgeben (256 MB in Byte), der zweite 500000000 (0,5 CPU in Nanoeinheiten).

Wenn andere Werte angezeigt werden, überprüfen Sie den Befehl docker run und stellen Sie sicher, dass Sie die Begrenzungen korrekt angegeben haben.

Hinweis: Sind die Ressourcenbegrenzungen zu niedrig, kann der Container langsam laufen oder sogar abstürzen. Wenn Probleme auftreten, erhöhen Sie die Begrenzungen.

Netzwerkeinstellungen

In diesem Abschnitt verwenden Sie den Parameter --network von docker run, um einen Container mit einem Netzwerk zu verbinden. Das ist hilfreich für die Kommunikation zwischen Containern und um Containergruppen voneinander zu isolieren.

Erstellen Sie zunächst ein benutzerdefiniertes Bridge-Netzwerk:

docker network create my-custom-network

Dieser Befehl erstellt ein neues Bridge-Netzwerk mit dem Namen my-custom-network. Bridge-Netzwerke sind der am häufigsten verwendete Netzwerktyp in Docker.

Starten Sie nun einen Container, der mit diesem Netzwerk verbunden ist:

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

Die Option --network my-custom-network verbindet den Container mit dem soeben erstellten Netzwerk.

Container im selben Netzwerk können über ihre Containernamen als Hostnamen miteinander kommunizieren. Dadurch lassen sich Dienste einfach miteinander verbinden.

Wenn die Fehlermeldung erscheint, dass das Netzwerk nicht existiert, prüfen Sie, ob Sie es mit dem Befehl docker network create korrekt erstellt haben.

Neustartrichtlinien

In diesem Abschnitt legen Sie mit dem Parameter --restart von docker run eine Neustartrichtlinie für den Container fest. So können Container weiterlaufen, wenn sie abstürzen oder 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 legt die Neustartrichtlinie unless-stopped fest. Der Container wird automatisch neu gestartet, sofern er nicht ausdrücklich von einem Benutzer gestoppt wurde.

Weitere Neustartrichtlinien sind:

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

Prüfen Sie die Neustartrichtlinie:

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

Die Ausgabe sollte unless-stopped lauten.

Wenn nicht die erwartete Ausgabe erscheint, überprüfen Sie den Befehl docker run und stellen Sie sicher, dass Sie die Neustartrichtlinie korrekt angegeben haben.

Arbeitsverzeichnis und Befehl

In diesem Abschnitt erfahren Sie, wie Sie ein Arbeitsverzeichnis im Container festlegen und beim Start des Containers eigene Befehle ausführen.

Mit dem Parameter -w von docker run legen Sie das Arbeitsverzeichnis im Container fest. Nach dem Imagenamen können Sie außerdem einen auszuführenden Befehl angeben.

Kombinieren Sie diese Möglichkeiten:

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

Der Befehl besteht aus folgenden Teilen:

  • -d: Startet den Container im Detached-Modus, also im Hintergrund.
  • --name nginx-custom: Gibt dem Container den Namen „nginx-custom“.
  • -w /app: Legt /app als Arbeitsverzeichnis im Container fest.
  • nginx: Der Name des verwendeten Images.
  • sh -c "...": Führt einen Shell-Befehl aus.
    • mkdir -p /app: Erstellt das Verzeichnis /app, falls es noch nicht existiert.
    • &&: Führt den nächsten Befehl nur aus, wenn der vorherige erfolgreich war.
    • touch newfile.txt: Erstellt eine leere Datei mit dem Namen newfile.txt.
    • &&: Führt den nächsten Befehl nur aus, wenn der vorherige erfolgreich war.
    • nginx -g 'daemon off;': Startet Nginx im Vordergrund, sodass der Container weiterläuft.

Prüfen Sie nun, 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. Der zweite Befehl sollte die Details der Datei newfile.txt im Verzeichnis /app des Containers auflisten.

Zusammenfassung

In diesem Lab haben Sie sich ausführlich mit dem Befehl docker run und seinen verschiedenen Parametern und Optionen beschäftigt. Sie haben Folgendes gelernt:

  1. Container starten und benennen
  2. Ports zuordnen, um vom Host aus auf Containerdienste zuzugreifen
  3. Volumes einbinden, um Daten zwischen Host und Container auszutauschen
  4. Umgebungsvariablen zur Konfiguration von Containern setzen
  5. Ressourcenbegrenzungen festlegen, um die Ressourcennutzung von Containern einzuschränken
  6. Netzwerkeinstellungen für die Kommunikation zwischen Containern konfigurieren
  7. Neustartrichtlinien festlegen, damit Container zuverlässig laufen
  8. Arbeitsverzeichnisse und Befehle für den Containerstart angeben

Die Parameter von docker run bieten leistungsfähige Möglichkeiten, Docker-Container zu konfigurieren und zu verwalten. Wenn Sie diese Optionen beherrschen, können Sie komplexere und gezielt angepasste Container bereitstellen. Sie bestimmen damit, wie Container mit dem Hostsystem interagieren, welche Ressourcen sie nutzen dürfen und wie sie sich in verschiedenen Situationen verhalten.