Auf Container mit Exec zugreifen

DockerBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie einen laufenden Docker-Container betreten. Das ist eine wichtige Debugging-Fähigkeit: Obwohl Container für eine kurzlebige Nutzung ausgelegt sind, müssen Sie häufig eine laufende Umgebung untersuchen, um zu verstehen, was gerade passiert.

Um Dateien zu untersuchen, laufende Prozesse zu prüfen oder Fehler innerhalb eines Containers zu analysieren, benötigen Sie häufig eine Kommando-Shell in der Umgebung dieses Containers. Mit dem Befehl docker exec können Sie einen zusätzlichen Befehl in einem bereits laufenden Container starten, ohne den Container neu zu erstellen oder neu zu starten.

Das Wort „zusätzlich“ ist dabei wichtig. docker exec ersetzt den Hauptprozess des Containers nicht. Der Befehl startet einen weiteren Prozess in denselben Container-Namespaces, während der ursprüngliche Dienst weiterläuft.

Sie bearbeiten die folgenden Schritte:

  • Einen Nginx-Container im Hintergrund starten.
  • Mit docker exec eine interaktive Bash-Shell im Container starten.
  • Befehle im Container ausführen, um das Betriebssystem zu identifizieren.
  • Den Container verlassen und zu Ihrem Host-Terminal zurückkehren.

Einen Container im Hintergrund starten

In diesem Schritt starten Sie mit dem Nginx-Image einen neuen Docker-Container. Sie führen ihn im Modus „detached“ aus, sodass er im Hintergrund läuft, und weisen ihm einen bestimmten Namen zu. Dadurch können Sie später einfacher auf ihn verweisen.

Führen Sie den folgenden Befehl in Ihrem Terminal aus:

docker run -d --name web1 nginx

Aufschlüsselung des Befehls:

  • docker run: Erstellt und startet einen Container.
  • -d: Führt den Container im detached-Modus (im Hintergrund) aus.
  • --name web1: Weist dem Container den Namen web1 zu.
  • nginx: Das zu verwendende Image.

Überprüfen Sie, ob der Container läuft:

docker ps

In der Liste der aktiven Container sollte web1 angezeigt werden.

Der Container muss laufen, weil docker exec den Kontext eines vorhandenen, aktiven Containers verwendet. Eine Shell lässt sich nicht in einem Container starten, der bereits beendet wurde.

Den Container betreten

Nachdem der Container gestartet wurde, verwenden Sie den Befehl docker exec, um darin eine Shell-Sitzung zu starten. Dadurch „melden Sie sich“ im Container an – ähnlich wie bei einer SSH-Verbindung zu einem entfernten Server.

Führen Sie den folgenden Befehl aus:

docker exec -it web1 bash

Aufschlüsselung des Befehls:

  • docker exec: Führt einen Befehl in einem vorhandenen Container aus.
  • -it: Diese Kombination ist für interaktive Sitzungen erforderlich.
    • -i (interactive): Hält den Eingabestream geöffnet.
    • -t (tty): Weist ein Pseudo-Terminal zu, sodass sich die Sitzung wie eine echte Eingabeaufforderung verhält.
  • web1: Der Name des Zielcontainers.
  • bash: Der Befehl, der im Container ausgeführt werden soll. In diesem Fall starten Sie die Bash-Shell.

docker exec bedeutet also im Wesentlichen: „Führe diesen Befehl im Container aus.“ Eine Shell ist nur ein häufiger Anwendungsfall. Sie könnten genauso gut ls, cat oder ein Debugging-Werkzeug ausführen.

Beobachten Sie die Änderung:

Nach der Ausführung dieses Befehls ändert sich Ihre Eingabeaufforderung. Sie sieht ungefähr wie root@<container-id>:/# aus.

Daran erkennen Sie, dass Sie Befehle jetzt innerhalb des Containers ausführen und von Ihrem Hostcomputer isoliert sind.

Diese Isolation umfasst normalerweise die Sicht auf das Dateisystem, den Prozess-Namespace und den Netzwerkkontext. Sie verwenden weiterhin denselben Kernel, sehen jetzt jedoch die abgegrenzte Umgebung des Containers anstelle der vollständigen Umgebung des Hosts.

Die Umgebung des Containers untersuchen

Sie befinden sich jetzt im Container. Das angezeigte Dateisystem gehört zum Container und nicht zu Ihrer LabEx-Umgebung. Sie können dies überprüfen, indem Sie die Informationen zum Betriebssystem anzeigen.

Führen Sie den folgenden Befehl in der Shell des Containers aus:

cat /etc/os-release

Sie sehen eine Ausgabe mit Informationen über die Linux-Distribution, die vom Nginx-Image verwendet wird (in der Regel Debian).

Beispielausgabe:

PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
...

Damit ist bestätigt, dass der Container über eine eigene, vom Host getrennte und isolierte Betriebssystemumgebung verfügt.

Genauer gesagt besitzt der Container ein eigenes Userspace-Dateisystem und eine eigene Prozessumgebung. Er verfügt nicht über einen eigenen Kernel, kann sich aus dem Inneren aber dennoch wie ein kleines, separates Linux-System anfühlen.

Beenden und zum Host zurückkehren

Wenn Sie das Debugging oder die Untersuchung des Containers abgeschlossen haben, müssen Sie die Shell-Sitzung beenden, um zu Ihrem Hostcomputer zurückzukehren.

Geben Sie den folgenden Befehl im Container ein:

exit

Drücken Sie anschließend die Eingabetaste. Ihre Eingabeaufforderung sollte wieder zur standardmäßigen LabEx-Benutzeraufforderung zurückkehren.

Was ist passiert?

Sie haben den Bash-Prozess im Container beendet. Der Container selbst (web1) läuft jedoch weiterhin im Hintergrund, weil der Hauptprozess (Nginx) noch aktiv ist.

Das ist die zentrale Erkenntnis zum Lebenszyklus bei docker exec: Das Beenden Ihrer interaktiven Shell stoppt den Container nicht, solange diese Shell nicht der Hauptprozess war, der die Lebensdauer des Containers bestimmt.

Sie können dies mit dem folgenden Befehl überprüfen:

docker ps

web1 wird weiterhin aufgelistet.

Zum Aufräumen können Sie den Container anhalten und entfernen:

docker rm -f web1

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie mit docker exec -it auf einen laufenden Container zugreifen. Sie haben Folgendes geübt:

  • Einen Container starten und im Hintergrund ausführen.
  • Den Container betreten und darin eine interaktive Bash-Shell verwenden.
  • Die Umgebung überprüfen, die im Container verfügbar ist.
  • Die Sitzung sicher beenden, während der Dienst weiterläuft.

Diese grundlegende Fähigkeit ist für die Arbeit mit Docker unverzichtbar. Sie ermöglicht es Ihnen, Anwendungen direkt zu untersuchen, Fehler zu analysieren und die Umgebungen von Containern zu überprüfen.