GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

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

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.

  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 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.


Docker
  1. Einige DOCKER-Befehle

  2. Schnellreferenz-Spickzettel für Docker-Befehle

  3. So führen Sie einen Befehl in einem laufenden Docker-Container aus

  4. Erstellen Ihres ersten Docker-Windows-Server-Containers

  5. So ändern Sie die Zeitzone für einen Docker-Container

So kopieren Sie Dateien mit Docker cp in Ihren Docker-Container

21 grundlegende Befehle, die jeder Docker-Benutzer kennen sollte

Docker-Befehle zum Verwalten des Containerlebenszyklus (Definitive Guide)

ctop – Top-ähnliche Schnittstelle zur Überwachung von Docker-Containern

40 wichtige Docker-Befehle für Softwareentwickler

Setzen Sie einen Timer auf Ihre laufenden Befehle mit dem Timeout-Befehl in Linux