Docker Exec: Ihr Goto-Befehl zum Ausführen von Befehlen in Docker


Haben Sie jemals gebraucht, um zu sehen, was in einem Docker-Container passiert? Container sind dafür gedacht, idempotent zu sein: Wenn es ein Problem gibt, starten Sie einen neuen Container neu. Oft ist das Leben nicht so einfach. Sie müssen Befehle im Container ausführen, um das Problem zu identifizieren. Hier kann der docker exec-Befehl helfen.

Dieser Artikel wird Ihnen beibringen, wie Sie Befehle in einem laufenden Docker-Container mit dem Befehl docker exec ausführen können.

Voraussetzungen

Um den Beispielen in diesem Artikel folgen zu können, müssen Sie folgende Voraussetzungen erfüllen.

  • Eine aktuelle Version der Docker Desktop wird auf Windows, Linux oder macOS funktionieren. Dieses Tutorial verwendet v3.1.0 unter Windows 10.

Starten eines NGINX-Containers

Docker exec führt Befehle in Containern aus. Aber dafür benötigen Sie zuerst einen Container, in dem Sie diese Befehle ausführen können. Fangen wir an, indem wir ein Docker-Image herunterladen und einen Democ-Container erstellen.

  1. Erstellen Sie ein neues Verzeichnis, dieses Tutorial verwendet C:\gitrepos\test, um die für den Container verwendeten Dateien zu speichern.

2. Erstellen Sie eine Datei namens dockerfile (ohne Erweiterung), die den folgenden Code enthält. Das Dockerfile definiert die Schritte, die erforderlich sind, um einen Container zu erstellen.

FROM nginx:alpine
 COPY index.html /usr/share/nginx/html/index.html

3. Erstellen Sie als nächstes eine Datei im selben Verzeichnis namens index.html, die den folgenden Code enthält. Dies ist eine HTML-Datei, die beim Starten des Containers eine Hello World-Nachricht anzeigt.

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
    <title>Hello World - Nginx Docker</title> 
    <style> 
       h1{ font-weight:lighter; font-family: Arial, Helvetica, sans-serif; 
       } 
    </style> 
    </head> 
    <body> 
       <h1> 
          Hello World 
       </h1> 

    </body> 
    </html>

4. Erstellen Sie nun den Nginx Docker-Container. Da sich das Dockerfile im aktuellen Arbeitsverzeichnis befindet, geben Sie . an, damit der Docker-Engine weiß, dass sie dort suchen soll. Stellen Sie außerdem sicher, dass Sie den Container mit dem Tag my-nginx versehen, um eine einfachere Referenzierung in Zukunft zu ermöglichen, indem Sie den t-Parameter verwenden.

docker build -t my-nginx .
Creating a Docker container with the build command.

5. Jetzt, da der Container erstellt wurde, starten Sie den Container mit dem Docker run-Befehl.

# rm - Informiert Docker darüber, den Container zu löschen, nachdem er gestoppt wurde 
# d - Gibt die Kontrolle über die Befehlszeile nach Ausführung des Befehls zurück 
# p - Abbildung des internen Container-Ports 80 auf einen externen Port 80 docker run --rm -d -p 80:80 my-nginx
Start the container with the Docker run command.

6. Öffnen Sie abschließend Ihren Webbrowser und navigieren Sie zu http://localhost/, um Folgendes zu sehen.

Output of the running NGINX container.

Ausführen von Befehlen mit Docker Exec

Beim Ausführen von Befehlen in einem Docker-Container müssen Sie möglicherweise einen Befehl interaktiv ausführen. Interaktives Ausführen von Befehlen bedeutet, einen Befehl einzugeben, Feedback zu erhalten, einen weiteren Befehl einzugeben, usw. Interaktive Befehle übernehmen Ihre Sitzung und verhindern, dass Sie etwas anderes tun können.

Aber was ist, wenn Sie die Befehle, die Sie dem Container im Voraus senden möchten, bereits kennen und Befehle im Hintergrund ausführen möchten? In diesem Fall können Sie nicht-interaktive Befehle ausführen. Nicht-interaktive Befehle ermöglichen es Ihnen, einen Befehl an Docker zu senden und sofort die Kontrolle über die Konsole zurückzuerhalten.

Auffinden des Container-Namens und der ID

Jetzt, da Sie den Container erstellt haben, können Sie Befehle im Inneren des Containers ausführen. Bevor Sie einen Befehl ausführen, ermitteln Sie entweder den Namen oder die ID des NGINX-Containers. Entweder der Name oder die ID funktioniert in Docker-Befehlen. Dabei ist zu beachten, dass die ID möglicherweise schwieriger zu merken ist als der Name!

Um Informationen zu einem laufenden Container anzuzeigen, führen Sie den Docker ps-Befehl aus, um folgende Informationen auszugeben.

docker ps
Displaying running Docker containers.

Kopieren Sie entweder die eindeutige ID e17e4b6be01a oder den zufällig generierten Namen mystifying_chandrasekhar in Ihre Zwischenablage für spätere Verwendung.

Ausführen eines nicht-interaktiven Befehls mit Docker Exec

Als Beispiel für die Ausführung eines nicht-interaktiven Befehls kopieren und führen Sie den folgenden Befehl aus, um eine Liste der Dateien im Verzeichnis /var/log mit dem Befehl ls -l zurückzugeben. Geben Sie alles nach dem Containernamen mystifying_chandrasekhar an den Docker exec-Befehl weiter.

docker exec mystifying_chandrasekhar ls -l /var/log
Executing a directory listing within the NGINX container.

Vermeidung von Konsolenausgaben mit Docker-Befehlen

Indem die Shell-Steuerung sofort an den Benutzer zurückgegeben wird, vermeiden große Operationen, die Konsole zu blockieren. Verzichten Sie auf die Konsolenausgabe mit der abgekoppelten Option d. Der folgende Befehl erstellt die Datei /tmp/execWorks über den Befehl touch innerhalb des Containers und zeigt keine Ausgabe auf der Konsole an.

docker exec -d mystifying_chandrasekhar touch /tmp/execWorks

Ausführen interaktiver Befehle mit Docker Exec

Bis zu diesem Zeitpunkt haben Sie gelernt, wie Sie nicht-interaktive Befehle in einem Docker-Container mit docker exec ausführen. Aber möglicherweise stehen Sie vor der Situation, dass Sie einen Container debuggen müssen, zum Beispiel, wenn Sie interaktiv Befehle an den Container senden müssen. In diesem Fall müssen Sie Befehle interaktiv ausführen.

Das Ausführen von Befehlen interaktiv mit docker exec erfordert zwei Optionen, i und t. Die Option i hält STDIN offen, um Befehle an den Container zu senden, und die Option t allokiert ein Pseudo-TTY (PTY), einen Kommunikationskanal, um Befehle einzugeben.

Kopieren und fügen Sie den folgenden Befehl ein, um eine interaktive Befehlszeile zum ausgeführten Docker-Container mit der Bourne (sh)-Shell zu öffnen, wie durch die Änderung des Prompts auf / # angezeigt.

docker exec -it mystifying_chandrasekhar sh
Running an interactive Docker shell.

Sobald Sie sich in der Shell befinden, führen Sie nun die unten stehenden Befehle aus, um das Auflisten von Dateien innerhalb des Containers zu demonstrieren. Führen Sie schließlich den Befehl exit aus, um die interaktive Shell zu verlassen.

ls -l /var/log
exit
Open an interactive command prompt to the container.

Um einen interaktiven Prompt in einem bestimmten Verzeichnis zu öffnen, geben Sie den Pfad zur w-Option an, die Docker mitteilt, den Shell im angegebenen Verzeichnis zu starten.

Übergeben von Umgebungsvariablen an einen laufenden Container

Viele Programme verwenden Umgebungsvariablen, um Konfigurationen beim Start festzulegen. Zum Beispiel benötigen die meisten Java-Anwendungen die Umgebungsvariable JAVA_HOME, um den Java-Pfad festzulegen.

Sie können Umgebungsvariablen an eine Sitzung mit der Option e übergeben. Möglicherweise müssen Sie beispielsweise eine Umgebungsvariable namens MYVAR in einen laufenden Container einfügen. Verwenden Sie dazu die Option e und geben Sie das Schlüssel/Wert-Paar von MYVAR="<some value>" wie unten gezeigt an.

docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
Pass environment variables

Übergeben von Umgebungsvariablen mit einer Datei

Wenn Sie viele Umgebungsvariablen oder eine gemeinsame Konfiguration haben, ist es möglicherweise einfacher, diese Variablen in einer Datei zu speichern. Geben Sie die Datei über einen relativen oder absoluten Pfad an Docker mit der Option --env-file weiter. Diese Technik wird oft verwendet, um sichere Anmeldeinformationen an einen Container zu übergeben. Achten Sie darauf, Anmeldeinformationen niemals der Versionskontrolle zu übergeben!

Erstellen Sie eine Textdatei mit dem Namen env-vars.txt mit den zu übergebenden Umgebungsvariablen und deren Werten. Diese Datei kann beliebig benannt werden und benötigt keine Dateierweiterung .txt.

Text file with environmental variables defined.

Übergeben Sie die Umgebungsvariablen an Docker mit der Option env-file. Überprüfen Sie, ob die Variablen mit dem Befehl echo wie im untenstehenden Screenshot verfügbar sind.

# Die env-vars.txt-Datei übergeben und eine interaktive Aufforderung öffnen
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Überprüfen Sie, ob die Umgebungsvariablen im Docker-Container verfügbar sind
echo $MYVAR
echo $FOO
echo $SOMETHING
Passing a environmental variables file to Docker and verifying the environment variables exist in the container.

Interaktion mit einem laufenden Container als anderer Benutzer

In der Produktion laufen Anwendungen oft als spezifischer Benutzer, um ihren Zugriff einzuschränken. Wenn Sie Befehle im Produktionsmodus ausführen, sollten Sie dies auch beim Testen tun.

In diesem Beispiel wird der Docker-Container als Benutzer nginx ausgeführt. Geben Sie den Benutzer an die w-Option weiter, um Docker mitzuteilen, den Container als Konto nginx zu starten. Der Befehl whoami, der innerhalb des Containers ausgeführt wird, bestätigt, dass der Benutzer nginx tatsächlich verwendet wird.

docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
Running the container as the nginx user.

Nächste Schritte

Sie haben gelernt, wie Sie Befehle in einem laufenden Container mit dem docker exec-Befehl ausführen können. Durch die Nutzung des exec-Befehls, um in laufende Container einzutreten und sie zu untersuchen, haben Sie ein leistungsstarkes neues Werkzeug in Ihrem Arsenal, um Docker-Container zu debuggen.

Versuchen Sie nun, das Gelernte einen Schritt weiter zu bringen und nutzen Sie die Git-Versionierung, um eine statische Website in den Container zu ziehen, anstatt nur eine einzelne Datei zu kopieren. Falls Git für Sie neu ist, ist der Artikel Ein Leitfaden für Visual Studio Code und Git für Anfänger ein großartiger Ausgangspunkt.

Source:
https://adamtheautomator.com/docker-exec/