Mussten Sie schon einmal sehen, was in einem Docker-Container vor sich geht? Container sollen idempotent sein:Wenn ein Problem auftritt, stellen Sie einen neuen Container erneut bereit. Oft ist das Leben nicht so einfach. Sie müssen Befehle im Container ausführen, um das Problem zu identifizieren. Hier befindet sich die docker exec
Befehl kann helfen.
In diesem Artikel erfahren Sie, wie Sie mit docker exec
Befehle auf einem laufenden Docker-Container ausführen Befehl.
Voraussetzungen
Um den Beispielen in diesem Artikel zu folgen, müssen Sie sich an Folgendes halten.
- Jede aktuelle Version von Docker Desktop funktioniert unter Windows, Linux oder macOS. Dieses Tutorial verwendet v3.1.0, das unter Windows 10 ausgeführt wird.
Starten eines NGINX-Containers
Docker exec
führt Befehle in Containern aus. Dazu benötigen Sie jedoch zunächst einen Container, in dem Sie diese Befehle ausführen können. Beginnen wir damit, ein Docker-Image herunterzuladen und einen Demo-Container zu erstellen.
- 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 mit dem Namen dockerfile (ohne Erweiterung), die den folgenden Code enthält. Das Dockerfile definiert die Schritte, die zum Erstellen eines Containers erforderlich sind.
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
3. Erstellen Sie als Nächstes im selben Verzeichnis eine Datei mit dem Namen 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 um die Docker-Engine wissen zu lassen, dass sie dort suchen soll. Achten Sie außerdem darauf, den Container mit my-ngnix
zu taggen mit dem t
Parameter, um in Zukunft eine einfachere Referenz zu gewährleisten.
docker build -t my-nginx .
5. Nachdem der Container nun erstellt wurde, starten Sie den Container mit dem Befehl Docker run.
# rm - Informs Docker to delete the container after it has stopped
# d - Return control of the command-line after the command has been executed
# p - Map the internal container port 80 to an external port 80 docker run --rm -d -p 80:80 my-nginx
6. Öffnen Sie schließlich Ihren Webbrowser und navigieren Sie zu http://localhost/
um folgendes zu sehen.
Befehle mit Docker Exec ausführen
Beim Ausführen von Befehlen in einem Docker-Container müssen Sie möglicherweise einen Befehl interaktiv ausführen. Befehle interaktiv auszuführen bedeutet, einen Befehl einzugeben, Feedback zu erhalten, einen anderen Befehl einzugeben usw. Interaktive Befehle übernehmen Ihre Sitzung und hindern Sie daran, irgendetwas anderes zu tun.
Was aber, wenn Sie die an den Container zu sendenden Befehle bereits im Voraus 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ückzugeben.
Auffinden des Containernamens und der ID
Nachdem Sie den Container erstellt haben, können Sie Befehle innerhalb des Containers ausführen. Suchen Sie vor dem Ausführen eines Befehls entweder den Namen oder die ID des NGINX-Containers. Entweder der Name oder die ID funktionieren in Docker-Befehlen. In Anbetracht dessen kann es schwieriger sein, sich an die ID zu erinnern als an den Namen!
Um Informationen zu laufenden Containern anzuzeigen, führen Sie Docker ps
aus Befehl, um die folgenden Informationen auszugeben.
docker ps
Kopieren Sie entweder die eindeutige ID, e17e4b6be01a
, oder der zufällig generierte Name mystifying_chandrasekhar
in Ihre Zwischenablage zur späteren Verwendung.
Ausführen eines nicht-interaktiven Befehls mit Docker Exec
Als Beispiel für die Ausführung eines nicht interaktiven Befehls kopieren Sie den folgenden Befehl und führen ihn aus, um eine Liste von Dateien in /var/log zurückzugeben Verzeichnis mit dem ls -l
Befehl. Übergeben Sie alles nach dem Containernamen, mystifying_chandrasekhar
, an die exec
von Docker Befehl.
docker exec mystifying_chandrasekhar ls -l /var/log
Konsolenausgabe mit Docker-Befehlen vermeiden
Durch die sofortige Rückgabe der Shell-Steuerung an den Benutzer vermeiden große Operationen, dass die Konsole gebunden wird. Verzichten Sie auf die Konsolenausgabe mit dem abgetrennten d
Möglichkeit. Der folgende Befehl erstellt die Datei /tmp/execWorks über den touch
Befehl 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 Punkt haben Sie gelernt, wie Sie nicht interaktive Befehle in einem Docker-Container mit docker exec
ausführen . Es kann jedoch vorkommen, dass Sie Probleme mit einem Container beheben müssen, z. B. wenn Sie interaktiv Befehle an den Container senden müssen. In diesem Fall müssen Sie Befehle interaktiv ausführen.
Befehle interaktiv mit docker exec
ausführen erfordert zwei Optionen, i
und t
. Das i
Die Option hält STDIN offen, sodass Befehle an den Container gesendet werden können, und der t
Option weist ein Pseudo-TTY (PTY), einen Kommunikationskanal, zu, um Befehle einzugeben.
Kopieren Sie den folgenden Befehl und fügen Sie ihn ein, um eine interaktive Eingabeaufforderung für den ausgeführten Docker-Container mit der Bourne-Shell (sh) zu öffnen, wie durch die Änderung der Eingabeaufforderung in / #
angegeben .
docker exec -it mystifying_chandrasekhar sh
Führen Sie nun in der Shell die folgenden Befehle aus, um das Auflisten von Dateien aus dem Container heraus zu demonstrieren. Führen Sie abschließend den exit
aus Befehl zum Verlassen der interaktiven Shell.
ls -l /var/log
exit
Um eine interaktive Eingabeaufforderung in einem bestimmten Verzeichnis zu öffnen, übergeben Sie den Pfad an
w
Option, die Docker mitteilt, die Shell in einem bestimmten Verzeichnis zu starten.
Umgebungsvariablen an einen laufenden Container übergeben
Viele Programme verwenden Umgebungsvariablen, um Konfigurationen beim Start festzulegen. Beispielsweise erfordern die meisten Java-Anwendungen den JAVA_HOME
Umgebungsvariable, die auf den Java-Pfad gesetzt werden soll.
Sie können Umgebungsvariablen mit e
an eine Sitzung übergeben Möglichkeit. Vielleicht müssen Sie beispielsweise eine Umgebungsvariable mit dem Namen MYVAR
füllen in einen laufenden Container. Verwenden Sie dazu den e
Option und geben Sie das Schlüssel/Wert-Paar MYVAR="<some value>"
an wie unten gezeigt.
docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
Umgebungsvariablen mit einer Datei übergeben
Wenn Sie viele Umgebungsvariablen oder eine gemeinsam genutzte Konfiguration haben, ist es möglicherweise einfacher, diese Variablen in einer Datei zu speichern. Übergeben Sie die Datei über einen relativen oder absoluten Pfad mit dem --env-file
an Docker Möglichkeit. Diese Technik wird häufig verwendet, um einem Container sichere Anmeldeinformationen bereitzustellen. Stellen Sie sicher, dass Sie Anmeldeinformationen niemals der Versionskontrolle übergeben!
Erstellen Sie eine Textdatei namens env-vars.txt
mit den zu übergebenden Umgebungsvariablen und ihren Werten. Diese Datei kann beliebig heißen und benötigt keine .txt
Dateierweiterung.
Übergeben Sie die Umgebungsvariablen mit der env-file
an Docker Möglichkeit. Überprüfen Sie mit echo
, ob die Variablen verfügbar sind Befehl, wie im folgenden Screenshot gezeigt.
# Pass the env-vars.txt file and open an interactive prompt
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Verify that the environmental variables are available in the Docker container
echo $MYVAR
echo $FOO
echo $SOMETHING
Interaktion mit einem laufenden Container als ein anderer Benutzer
In der Produktion werden Anwendungen oft als ein bestimmter Benutzer ausgeführt, um ihren Zugriff einzuschränken. Wenn Sie Anwendungen als ein bestimmter Benutzer in der Produktion ausführen, sollten Sie dies auch tun, während Sie Befehle testen.
In diesem Beispiel wird der Docker-Container als nginx
ausgeführt Benutzer. Übergeben Sie den Benutzer an w
Option, um Docker anzuweisen, den Container als nginx
zu starten Konto. Das whoami
Befehl, der innerhalb des Containers ausgeführt wird, bestätigt, dass der nginx
Benutzer wird tatsächlich verwendet.
docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
Nächste Schritte
Sie haben gelernt, wie Sie Befehle innerhalb eines laufenden Containers mit docker exec
ausführen Befehl. Verwenden der exec
Befehl zum Aufrufen und Abfragen laufender Container haben Sie ein leistungsstarkes neues Tool in Ihrem Arsenal, um Probleme mit Docker-Containern zu beheben.
Versuchen Sie nun, das Gelernte einen Schritt weiter zu führen und verwenden Sie die Git-Versionskontrolle, um eine statische Website in den Container zu ziehen, anstatt eine einzelne Datei zu kopieren. Wenn Git neu für Sie ist, dann ist der Artikel A Beginner’s Guide to Visual Studio Code and Git ein guter Ausgangspunkt.