Tiefer in Container eintauchen

DockerDockerBeginner
Jetzt üben

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

Einführung

Docker-Container sind die Bausteine der modernen Anwendungsbereitstellung. In diesem Lab werden wir fortgeschrittene Container-Verwaltungstechniken erkunden, die Ihr Verständnis der Docker-Funktionalitäten vertiefen werden. Wir werden das Ausführen von Containern in verschiedenen Modi, die Verwaltung ihres Lebenszyklus, die Inspektion von Container-Details, die Arbeit mit Logs, die Ausführung von Befehlen innerhalb von Containern, das Kopieren von Dateien, das Setzen von Umgebungsvariablen und die Begrenzung von Container-Ressourcen behandeln. Am Ende dieses Labs werden Sie ein umfassendes Verständnis davon haben, wie Sie effektiv mit Docker-Containern arbeiten können.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/VolumeOperationsGroup -.-> docker/cp("Copy Data Between Host and Container") subgraph Lab Skills docker/run -.-> lab-388951{{"Tiefer in Container eintauchen"}} docker/start -.-> lab-388951{{"Tiefer in Container eintauchen"}} docker/rm -.-> lab-388951{{"Tiefer in Container eintauchen"}} docker/exec -.-> lab-388951{{"Tiefer in Container eintauchen"}} docker/logs -.-> lab-388951{{"Tiefer in Container eintauchen"}} docker/inspect -.-> lab-388951{{"Tiefer in Container eintauchen"}} docker/cp -.-> lab-388951{{"Tiefer in Container eintauchen"}} end

Ausführen von Containern in verschiedenen Modi

Docker ermöglicht es Ihnen, Container in verschiedenen Modi auszuführen, um verschiedenen Anwendungsfällen gerecht zu werden. Wir werden zwei häufige Modi erkunden: den detached-Modus (Hintergrundmodus) und den interaktiven Modus.

Zunächst führen wir einen Container im detached-Modus aus:

docker run -d --name nginx-detached nginx

Dieser Befehl macht Folgendes:

  • -d: Führt den Container im detached-Modus (im Hintergrund) aus
  • --name nginx-detached: Weist dem Container den Namen "nginx-detached" zu
  • nginx: Gibt das zu verwendende Image an (es wird von Docker Hub heruntergeladen, wenn es lokal nicht verfügbar ist)

Sie sollten eine lange Zeichenfolge als Ausgabe sehen, die die Container-ID ist.

Sie können den Status des Containers überprüfen, indem Sie folgenden Befehl ausführen:

docker ps

Nun führen wir einen Container im interaktiven Modus aus:

docker run -it --name ubuntu-interactive ubuntu /bin/bash

Dieser Befehl macht Folgendes:

  • -it: Führt den Container im interaktiven Modus mit einer pseudo-TTY aus
  • --name ubuntu-interactive: Weist dem Container den Namen "ubuntu-interactive" zu
  • ubuntu: Gibt das zu verwendende Image an
  • /bin/bash: Der Befehl, der innerhalb des Containers ausgeführt werden soll (in diesem Fall eine bash-Shell)

Sie sollten nun innerhalb des Ubuntu-Containers sein. Sie können den Container verlassen, indem Sie exit eingeben.

Lassen Sie uns unsere laufenden Container auflisten:

docker ps

Sie sollten den nginx-detached-Container laufen sehen, aber nicht den ubuntu-interactive-Container (weil wir ihn verlassen haben).

Verwaltung des Container-Lebenszyklus

Das Verständnis, wie man Container starten, stoppen und neu starten kann, ist für die effektive Container-Verwaltung von entscheidender Bedeutung.

Beginnen wir damit, den nginx-detached-Container zu stoppen:

docker stop nginx-detached

Nun überprüfen wir den Status unserer Container:

docker ps -a

Sie sollten sehen, dass der nginx-detached-Container jetzt im Zustand "Exited" (Beendet) ist.

Lassen Sie uns ihn erneut starten:

docker start nginx-detached

Überprüfen Sie den Status erneut:

docker ps

Sie sollten sehen, dass der nginx-detached-Container jetzt im Zustand "Up" (Läuft) ist.

Wir können auch einen laufenden Container neu starten:

docker restart nginx-detached

Um den aktuellen Zustand unserer Container, einschließlich der gestoppten, anzuzeigen, verwenden Sie:

docker ps -a

Sie sollten sowohl den nginx-detached- als auch den ubuntu-interactive-Container mit ihrem aktuellen Status aufgeführt sehen.

Lassen Sie uns den gestoppten ubuntu-interactive-Container entfernen:

docker rm ubuntu-interactive

Und überprüfen Sie, ob er entfernt wurde:

docker ps -a

Sie sollten den ubuntu-interactive-Container nicht mehr in der Liste sehen.

Untersuchung von Container-Details

Docker bietet leistungsstarke Tools zur Untersuchung der Details Ihrer Container. Lassen Sie uns diese erkunden.

Um detaillierte Informationen über einen Container zu erhalten, verwenden Sie den inspect-Befehl:

docker inspect nginx-detached

Dieser Befehl gibt ein JSON-Array mit detaillierten Informationen über den Container aus. Dies kann überwältigend sein, also verwenden wir einen Filter, um spezifische Informationen zu erhalten.

Um die IP-Adresse des Containers zu erhalten:

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx-detached

Um den aktuellen Zustand des Containers anzuzeigen:

docker inspect -f '{{.State.Status}}' nginx-detached

Diese Befehle verwenden Go-Templates, um die Ausgabe zu filtern. Die -f-Option ermöglicht es uns, ein Format-Template anzugeben.

Lassen Sie uns auch die Portzuordnungen (Port mappings) überprüfen:

docker port nginx-detached

Portzuordnungen ermöglichen es Containern, mit dem Host-System oder externen Netzwerken zu kommunizieren. Sie ordnen einen Port auf dem Host-System einem Port innerhalb des Containers zu. Dies ist entscheidend für den Zugriff auf Dienste, die innerhalb von Containern laufen, von außerhalb der Docker-Umgebung.

Wenn keine Ports zugeordnet sind, erzeugt dieser Befehl keine Ausgabe. In unserem Fall haben wir keine Ports für den nginx-detached-Container explizit zugeordnet, also sehen Sie wahrscheinlich keine Ausgabe.

Um die Portzuordnung zu demonstrieren, erstellen wir einen neuen Nginx-Container mit einer Portzuordnung:

docker run -d --name nginx-with-port -p 8080:80 nginx

Dieser Befehl ordnet Port 8080 auf dem Host Port 80 im Container zu. Wenn wir nun die Portzuordnungen überprüfen:

docker port nginx-with-port

Sie sollten eine Ausgabe ähnlich wie die folgende sehen:

80/tcp -> 0.0.0.0:8080

Dies bedeutet, dass Datenverkehr an Port 8080 auf Ihrer Hostmaschine an Port 80 im Container weitergeleitet wird, wo Nginx lauscht.

Arbeiten mit Container-Logs

Der Zugang zu und das Verständnis von Container-Logs sind von entscheidender Bedeutung für die Fehlersuche und das Monitoring Ihrer Anwendungen.

Lassen Sie uns die Logs unseres Nginx-Containers anzeigen:

docker logs nginx-detached

Dies zeigt alle Logs seit dem Start des Containers. Um nur die neuesten Logs anzuzeigen, können Sie die Option --tail verwenden:

docker logs --tail 10 nginx-detached

Dies zeigt nur die letzten 10 Logzeilen.

Um die Logs in Echtzeit zu verfolgen (ähnlich wie tail -f), verwenden Sie die Option -f:

docker logs -f nginx-detached

Dies wird neue Log-Einträge weiterleiten, sobald sie generiert werden. Drücken Sie Ctrl+C, um den Log-Stream zu beenden.

Sie können auch Zeitstempel für Ihre Log-Einträge erhalten:

docker logs --timestamps nginx-detached

Dies kann besonders nützlich sein, um zeitkritische Probleme zu debuggen.

Ausführen von Befehlen in laufenden Containern

Docker ermöglicht es Ihnen, Befehle innerhalb eines laufenden Containers auszuführen, was für die Fehlersuche und Wartung unglaublich nützlich ist.

Beginnen wir damit, einen einfachen Befehl in unserem Nginx-Container auszuführen:

docker exec nginx-detached echo "Hello from inside the container"

Sie sollten "Hello from inside the container" in Ihrem Terminal sehen.

Nun erhalten wir eine interaktive Shell innerhalb des Containers:

docker exec -it nginx-detached /bin/bash

Sie befinden sich jetzt innerhalb des Containers. Lassen Sie uns ein wenig erkunden:

ls /etc/nginx
cat /etc/nginx/nginx.conf
exit

Diese Befehle listen den Inhalt des Nginx-Konfigurationsverzeichnisses auf und zeigen die Haupt-Nginx-Konfigurationsdatei an. Der exit-Befehl bringt Sie zurück in die Shell Ihres Host-Systems.

Kopieren von Dateien zwischen Host-System und Containern

Docker bietet die Möglichkeit, Dateien zwischen Ihrem Host-System und Containern zu kopieren. Dies ist nützlich für Aufgaben wie das Aktualisieren von Konfigurationsdateien oder das Abrufen von Logs.

Zunächst erstellen wir eine einfache HTML-Datei auf unserem Host-System:

echo "<html><body><h1>Hello from host</h1></body></html>" > hello.html

Nun kopieren wir diese Datei in unseren Nginx-Container:

docker cp hello.html nginx-detached:/usr/share/nginx/html/hello.html

Wir können überprüfen, ob die Datei kopiert wurde, indem wir einen Befehl im Container ausführen:

docker exec nginx-detached cat /usr/share/nginx/html/hello.html

Sie sollten den Inhalt der HTML-Datei sehen.

Nun kopieren wir eine Datei vom Container auf unseren Host:

docker cp nginx-detached:/etc/nginx/nginx.conf./nginx.conf

Dies kopiert die Nginx-Konfigurationsdatei aus dem Container in unser aktuelles Verzeichnis auf dem Host.

Sie können überprüfen, ob die Datei kopiert wurde:

ls -l nginx.conf

Sie sollten die Datei nginx.conf in der Liste sehen.

Setzen von Umgebungsvariablen in Containern

Umgebungsvariablen sind ein wichtiger Weg, um Anwendungen, die in Containern laufen, zu konfigurieren. Lassen Sie uns untersuchen, wie man sie setzt und verwendet.

Zunächst starten wir einen neuen Container mit einer Umgebungsvariablen:

docker run --name env-test -e MY_VAR="Hello, Environment" -d ubuntu sleep infinity

Dieser Befehl macht Folgendes:

  • --name env-test: Benennt den Container "env-test"
  • -e MY_VAR="Hello, Environment": Setzt eine Umgebungsvariable namens MY_VAR
  • -d: Führt den Container im detached-Modus aus
  • ubuntu: Verwendet das Ubuntu-Image
  • sleep infinity: Lässt den Container unendlich lange laufen

Nun überprüfen wir, ob unsere Umgebungsvariable gesetzt wurde:

docker exec env-test env | grep MY_VAR

Sie sollten MY_VAR=Hello, Environment! in der Ausgabe sehen.

Wir können auch Umgebungsvariablen mithilfe einer Datei setzen. Erstellen Sie eine Datei namens env_file mit folgendem Inhalt.

Sie können nano oder vim verwenden, um die Datei zu erstellen:

nano env_file
ANOTHER_VAR=From a file
YET_ANOTHER_VAR=Also from the file

Verlassen Sie den Editor und speichern Sie die Datei, indem Sie Ctrl+X, dann Y und Enter drücken.

Nun starten wir einen anderen Container unter Verwendung dieser Datei:

docker run --name env-file-test --env-file env_file -d ubuntu sleep infinity

Überprüfen Sie die Umgebungsvariablen in diesem neuen Container:

docker exec env-file-test env | grep -E "ANOTHER_VAR|YET_ANOTHER_VAR"

Sie sollten beide Variablen aus der Datei in der Ausgabe sehen.

Begrenzung von Container-Ressourcen

Docker ermöglicht es Ihnen, die Ressourcen (CPU und Arbeitsspeicher), die ein Container nutzen kann, zu begrenzen. Dies ist von entscheidender Bedeutung für die Verwaltung der Ressourcenzuweisung in Umgebungen mit mehreren Containern.

Lassen Sie uns einen Container mit Arbeitsspeicher- und CPU-Beschränkungen starten:

docker run --name limited-nginx -d --memory=512m --cpus=0.5 nginx

Dieser Befehl macht Folgendes:

  • --name limited-nginx: Benennt den Container "limited-nginx"
  • -d: Führt den Container im detached-Modus aus
  • --memory=512m: Beschränkt den Container auf 512 Megabyte Arbeitsspeicher
  • --cpus=0.5: Beschränkt den Container darauf, maximal die Hälfte eines CPU-Kerns zu nutzen
  • nginx: Verwendet das Nginx-Image

Wir können diese Beschränkungen mithilfe des inspect-Befehls überprüfen:

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

Der erste Befehl gibt 536870912 aus (512 MB in Bytes), und der zweite gibt 500000000 aus (0,5 CPU in Nano-Einheiten).

Um zu sehen, wie diese Beschränkungen den Container in Echtzeit beeinflussen, können wir den stats-Befehl verwenden:

docker stats limited-nginx

Dies zeigt einen Live-Stream der Ressourcenverwendungsstatistiken an. Drücken Sie Ctrl+C, um die Statistikansicht zu verlassen.

Zusammenfassung

In diesem Lab haben wir fortgeschrittene Techniken zur Containerverwaltung in Docker kennengelernt. Wir haben gelernt, wie man Container in verschiedenen Modi ausführt, ihren Lebenszyklus verwaltet, Containerdetails untersucht, mit Logs arbeitet, Befehle innerhalb von Containern ausführt, Dateien kopiert, Umgebungsvariablen setzt und Container-Ressourcen begrenzt. Diese Fähigkeiten bilden eine solide Grundlage für die Arbeit mit Docker-Containern in komplexeren Szenarien.

Denken Sie daran, dass eine effektive Containerverwaltung von entscheidender Bedeutung für die Entwicklung skalierbarer und wartbarer containerisierter Anwendungen ist. Wenn Sie Ihre Docker-Reise fortsetzen, werden Sie feststellen, dass diese Fähigkeiten für die Fehlersuche, Optimierung und Verwaltung Ihrer containerisierten Umgebungen unschätzbar sind.

Üben Sie diese Befehle weiterhin und erkunden Sie die Möglichkeiten von Docker. Je mehr Sie mit Containern arbeiten, desto vertrauter und kompetenter werden Sie. Viel Spaß beim Containerisieren!