Wie man den docker compose exec Befehl zur Interaktion mit Services nutzt

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 lernen Sie, wie Sie den Befehl docker compose exec effektiv nutzen können, um mit laufenden Services zu interagieren. Sie werden untersuchen, wie Sie Befehle innerhalb eines Service-Containers ausführen, Befehle im Detached-Modus ausführen, Befehle als anderer Benutzer ausführen und Befehle mit einem spezifischen Arbeitsverzeichnis ausführen. Diese praktische Erfahrung vermittelt Ihnen wesentliche Fähigkeiten für das Debugging und die Verwaltung Ihrer Docker-basierten Anwendungen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555079{{"Wie man den docker compose exec Befehl zur Interaktion mit Services nutzt"}} docker/exec -.-> lab-555079{{"Wie man den docker compose exec Befehl zur Interaktion mit Services nutzt"}} docker/pull -.-> lab-555079{{"Wie man den docker compose exec Befehl zur Interaktion mit Services nutzt"}} end

Befehl in einem laufenden Service-Container ausführen

In diesem Schritt lernen Sie, wie Sie einen Befehl innerhalb eines laufenden Docker-Containers ausführen können. Diese Technik ist äußerst nützlich für Debugging-Zwecke oder zur Interaktion mit einem in einem Container laufenden Service, ohne diesen anhalten und neu starten zu müssen.

Zuerst laden wir ein einfaches Nginx-Image für diese Demonstration herunter. Wir verwenden das nginx:alpine-Image, da es klein und schnell herunterzuladen ist.

docker pull nginx:alpine

Die Ausgabe zeigt an, dass das Image heruntergeladen und extrahiert wird.

Als nächstes starten wir dieses Nginx-Image im Detached-Modus, was bedeutet, dass der Container im Hintergrund läuft und Ihr Terminal nicht blockiert. Wir geben ihm auch einen Namen, um später einfacher darauf verweisen zu können.

docker run -d --name my-nginx nginx:alpine

Die Ausgabe ist die Container-ID des neu erstellten und laufenden Containers.

Nun, da der Container läuft, können wir mit dem Befehl docker exec einen Befehl darin ausführen. Die grundlegende Syntax lautet docker exec [options] container command [args...]. Versuchen wir, die Dateien im Root-Verzeichnis des Containers aufzulisten.

docker exec my-nginx ls /

Sie sollten eine Liste der Verzeichnisse und Dateien sehen, die im Root-Dateisystem des Nginx-Containers vorhanden sind, wie z.B. bin, etc, usr usw. Dies bestätigt, dass Sie erfolgreich einen Befehl im laufenden Container ausgeführt haben.

Lassen Sie uns einen weiteren Befehl ausprobieren. Wir können die im Container laufende Nginx-Version überprüfen.

docker exec my-nginx nginx -v

Die Ausgabe zeigt die im Container installierte Nginx-Version an, z.B. nginx version: nginx/1.24.0.

Dies demonstriert, wie Sie mit einem laufenden Container interagieren und beliebige Befehle in dessen Umgebung ausführen können.

Befehl im Detached-Modus ausführen

Im vorherigen Schritt haben wir einen Container mit dem -d-Flag im Detached-Modus gestartet. Dies ist eine gängige Praxis, wenn ein Container im Hintergrund laufen soll, ohne Ihr Terminal zu blockieren. In diesem Schritt werden wir das Ausführen von Befehlen im Detached-Modus näher untersuchen, insbesondere mit docker exec.

Während docker exec typischerweise für interaktive Sitzungen oder das Ausführen kurzer Befehle in einem laufenden Container verwendet wird, können Sie mit dem -d-Flag bei docker exec auch Befehle im Detached-Modus ausführen. Dies ist nützlich, um Hintergrundprozesse in einem bereits laufenden Container zu starten.

Verwenden wir den my-nginx-Container, den wir im vorherigen Schritt gestartet haben. Wir werden einen einfachen Befehl im Detached-Modus ausführen. Beispielsweise führen wir einen Befehl aus, der das aktuelle Datum und die Uhrzeit alle 5 Sekunden in eine Datei im Container schreibt.

docker exec -d my-nginx sh -c 'while true; do date >> /usr/share/nginx/html/date.txt; sleep 5; done'

In diesem Befehl:

  • docker exec -d my-nginx: Führt den folgenden Befehl im Detached-Modus innerhalb des my-nginx-Containers aus.
  • sh -c '...': Führt die nachfolgende Befehlszeichenkette mit der sh-Shell aus.
  • while true; do date >> /usr/share/nginx/html/date.txt; sleep 5; done: Dies ist der auszuführende Befehl. Es handelt sich um eine einfache Schleife, die kontinuierlich das aktuelle Datum und die Uhrzeit in die Datei /usr/share/nginx/html/date.txt schreibt und dann 5 Sekunden wartet, bevor sie sich wiederholt.

Nach Ausführung des Befehls wird die Container-ID in Ihrem Terminal ausgegeben, was darauf hinweist, dass der Befehl im Hintergrund innerhalb des Containers gestartet wurde.

Um zu überprüfen, ob der Befehl läuft und in die Datei schreibt, können wir einen weiteren Befehl ausführen, um den Inhalt der date.txt-Datei anzuzeigen. Da der Befehl im Hintergrund läuft, kann es einige Sekunden dauern, bis die Datei erstellt und gefüllt ist.

docker exec my-nginx cat /usr/share/nginx/html/date.txt

Sie sollten das Datum und die Uhrzeit in der Ausgabe sehen. Wenn Sie den cat-Befehl nach einigen Sekunden erneut ausführen, sollten neue Einträge in der Datei hinzugefügt worden sein. Dies bestätigt, dass der mit docker exec -d gestartete Hintergrundprozess wie erwartet läuft.

Befehl als anderer Benutzer ausführen

In diesem Schritt lernen Sie, wie Sie einen Befehl innerhalb eines laufenden Containers als bestimmter Benutzer ausführen können. Standardmäßig führt docker exec Befehle als root-Benutzer im Container aus, aber Sie können mit dem -u oder --user-Flag einen anderen Benutzer angeben. Dies ist wichtig für die Sicherheit und die Einhaltung des Prinzips der geringsten Rechte.

Wir verwenden weiterhin den my-nginx-Container. Zuerst sehen wir uns an, als welcher Benutzer der ls /-Befehl standardmäßig ausgeführt wird.

docker exec my-nginx whoami

Die Ausgabe wird wahrscheinlich root sein, da dies der Standardbenutzer für docker exec ist.

Nun versuchen wir, einen Befehl als anderer Benutzer auszuführen. Das Nginx-Image führt den Nginx-Prozess typischerweise als Nicht-Root-Benutzer aus, oft mit dem Namen nginx. Lassen Sie uns den whoami-Befehl als nginx-Benutzer ausführen.

docker exec -u nginx my-nginx whoami

Sie sollten die Ausgabe nginx sehen, was bestätigt, dass der Befehl als nginx-Benutzer ausgeführt wurde.

Sie können auch eine Benutzer-ID (UID) anstelle eines Benutzernamens angeben. Um die UID des nginx-Benutzers im Container zu finden, können wir die Datei /etc/passwd einsehen.

docker exec my-nginx cat /etc/passwd | grep nginx

Die Ausgabe zeigt den Eintrag für den nginx-Benutzer, einschließlich seiner UID und GID (Gruppen-ID). Beispielsweise könnte es so aussehen: nginx:x:101:101:nginx user,,,:/nonexistent:/bin/false. In diesem Beispiel ist die UID 101.

Nun führen wir den whoami-Befehl mit der UID aus. Ersetzen Sie 101 durch die tatsächliche UID aus dem vorherigen Schritt, falls diese abweicht.

docker exec -u 101 my-nginx whoami

Die Ausgabe sollte wieder nginx sein, was zeigt, dass Sie entweder den Benutzernamen oder die UID verwenden können, um den Benutzer für docker exec anzugeben.

Das Ausführen von Befehlen als Nicht-Root-Benutzer ist eine gute Sicherheitspraxis, insbesondere beim Umgang mit sensiblen Dateien oder bei Operationen, die keine Root-Rechte erfordern.

Befehl in einem bestimmten Arbeitsverzeichnis ausführen

In diesem letzten Schritt lernen Sie, wie Sie einen Befehl innerhalb eines laufenden Containers mit einem spezifischen Arbeitsverzeichnis ausführen. Standardmäßig führt docker exec Befehle im Arbeitsverzeichnis aus, das im Dockerfile des Container-Images definiert ist (oft /). Sie können dies jedoch mit dem -w oder --workdir-Flag ändern. Dies ist nützlich, wenn Sie Befehle relativ zu einem bestimmten Pfad im Dateisystem des Containers ausführen müssen.

Wir verwenden weiterhin den my-nginx-Container. Zuerst sehen wir uns das Standard-Arbeitsverzeichnis an, wenn wir einen Befehl ohne Angabe ausführen. Dafür können wir den pwd-Befehl (print working directory) verwenden.

docker exec my-nginx pwd

Die Ausgabe wird wahrscheinlich / sein, das Root-Verzeichnis.

Nun führen wir einen Befehl in einem anderen Arbeitsverzeichnis aus. Der Nginx-Container hat ein Verzeichnis /usr/share/nginx/html, von dem der Webserver Dateien bereitstellt. Ändern wir das Arbeitsverzeichnis zu diesem Pfad und listen dann die darin enthaltenen Dateien auf.

docker exec -w /usr/share/nginx/html my-nginx ls

In diesem Befehl:

  • docker exec -w /usr/share/nginx/html my-nginx: Führt den folgenden Befehl im my-nginx-Container aus und setzt das Arbeitsverzeichnis auf /usr/share/nginx/html.
  • ls: Der auszuführende Befehl, der die Dateien im aktuellen Arbeitsverzeichnis auflistet.

Sie sollten die Dateien im /usr/share/nginx/html-Verzeichnis sehen, wie z.B. index.html und date.txt (die wir in einem vorherigen Schritt erstellt haben).

Versuchen wir ein weiteres Beispiel. Wir können ein neues Verzeichnis innerhalb von /usr/share/nginx/html erstellen und dann unser Arbeitsverzeichnis in das neu erstellte Verzeichnis wechseln, bevor wir einen Befehl ausführen.

docker exec my-nginx mkdir /usr/share/nginx/html/new_dir
docker exec -w /usr/share/nginx/html/new_dir my-nginx pwd

Der erste Befehl erstellt ein Verzeichnis namens new_dir in /usr/share/nginx/html. Der zweite Befehl wechselt dann das Arbeitsverzeichnis zu /usr/share/nginx/html/new_dir und gibt das aktuelle Arbeitsverzeichnis aus.

Die Ausgabe des zweiten Befehls sollte /usr/share/nginx/html/new_dir sein, was bestätigt, dass das Arbeitsverzeichnis für die Ausführung des pwd-Befehls erfolgreich geändert wurde.

Die Verwendung des -w-Flags mit docker exec ermöglicht es Ihnen, Befehle im Kontext eines bestimmten Verzeichnisses innerhalb des Containers auszuführen, was sehr hilfreich ist, um effizienter mit dem Dateisystem des Containers zu interagieren.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie den docker exec-Befehl verwenden, um mit einem laufenden Docker-Container zu interagieren. Sie haben geübt, Befehle innerhalb eines Containers auszuführen, insbesondere Dateien aufzulisten und die Nginx-Version zu überprüfen, was die Fähigkeit demonstriert, Dienste zu debuggen und mit ihnen zu interagieren, ohne sie zu stoppen.

Sie haben außerdem kurz den Betrieb von Containern im Detached-Modus mit dem -d-Flag kennengelernt, ein grundlegendes Konzept für die Hintergrundausführung von Containern. Obwohl die nachfolgenden Schritte nicht vollständig detailliert waren, boten die ersten Schritte eine solide Grundlage für das Verständnis, wie Befehle in einer laufenden Container-Umgebung ausgeführt werden.