Docker
Container debuggen
Suche…
Syntax
- Docker-Statistiken [OPTIONEN] [CONTAINER ...]
- Andockprotokolle [OPTIONEN] CONTAINER
- Dockeroberteil [OPTIONEN] CONTAINER [ps OPTIONEN]
Eingabe in einen laufenden Container
Verwenden Sie zum Ausführen von Vorgängen in einem Container den Befehl docker exec
. Manchmal wird dies als "Eintreten in den Container" bezeichnet, da alle Befehle innerhalb des Containers ausgeführt werden.
docker exec -it container_id bash
oder
docker exec -it container_id /bin/sh
Und jetzt haben Sie eine Shell in Ihrem laufenden Container. Listen Sie beispielsweise Dateien in einem Verzeichnis auf und verlassen Sie den Container:
docker exec container_id ls -la
Sie können das -u flag
, um den Container mit einem bestimmten Benutzer uid=1013
, z. B. uid=1013
, gid=1023
.
docker exec -it -u 1013:1023 container_id ls -la
Die uid und gid müssen nicht im Container vorhanden sein, der Befehl kann jedoch zu Fehlern führen. Wenn Sie einen Container starten und sofort hineingeben möchten, um etwas zu überprüfen, können Sie dies tun
docker run...; docker exec -it $(docker ps -lq) bash
Der Befehl docker ps -lq
gibt nur die ID des zuletzt -lq
Containers (l in -lq
) aus. (Dies setzt voraus, dass Sie bash als Interpreter in Ihrem Container haben. Sie haben möglicherweise sh oder zsh oder einen anderen.)
Überwachung der Ressourcennutzung
Die Überprüfung der Verwendung von Systemressourcen ist ein effizienter Weg, um fehlerhafte Anwendungen zu finden. Dieses Beispiel entspricht dem traditionellen Befehl top
für Container:
docker stats
Um die Statistiken bestimmter Container zu verfolgen, listen Sie sie in der Befehlszeile auf:
docker stats 7786807d8084 7786807d8085
Docker-Statistiken zeigen die folgenden Informationen an:
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
7786807d8084 0.65% 1.33 GB / 3.95 GB 33.67% 142.2 MB / 57.79 MB 46.32 MB / 0 B
Standardmäßig zeigt docker stats
die ID der Container an. Dies ist nicht sehr hilfreich. Wenn Sie die Namen der Container anzeigen möchten, tun Sie dies einfach
docker stats $(docker ps --format '{{.Names}}')
Prozesse in einem Container überwachen
Die Überprüfung der Verwendung von Systemressourcen ist eine effiziente Methode, um ein Problem in einer live laufenden Anwendung einzugrenzen. Dieses Beispiel entspricht dem traditionellen Befehl ps
für Container.
docker top 7786807d8084
Um die Ausgabe zu filtern, fügen Sie der Befehlszeile ps
Optionen hinzu:
docker top 7786807d8084 faux
Oder um die Liste der Prozesse als root abzurufen, was eine potenziell schädliche Praxis ist:
docker top 7786807d8084 -u root
Der docker top
Befehl des Dockers ist besonders nützlich, wenn minimalistische Container ohne Shell oder mit dem Befehl ps
.
An einen laufenden Container anhängen
"Anhängen an einen Container" ist das Starten einer Terminalsitzung innerhalb des Kontexts, in dem der Container (und alle darin enthaltenen Programme) ausgeführt wird. Dies wird hauptsächlich zu Debugging-Zwecken verwendet, kann aber auch erforderlich sein, wenn bestimmte Daten an Programme übergeben werden müssen, die im Container ausgeführt werden.
Der Befehl zum attach
wird dazu verwendet. Es hat diese Syntax:
docker attach <container>
<container>
kann entweder die Container-ID oder der Containername sein. Zum Beispiel:
docker attach c8a9cf1a1fa8
Oder:
docker attach graceful_hopper
Abhängig von Ihrem Benutzer und der Einrichtung des sudo
die obigen Befehle möglicherweise erneut sudo
.
Anmerkung: Mit "Anhängen" kann nur eine einzelne Shell-Sitzung zu einem Zeitpunkt an einen Container angehängt werden.
Achtung: Alle Tastatureingaben werden an den Container weitergeleitet. Wenn Sie Strg-c drücken , wird der Container gelöscht.
Um sich von einem angefügten Container zu lösen, drücken Sie nacheinander die Tasten Strg-p und dann Strg-q
Um mehrere Shellsitzungen an einen Container anzuhängen, oder einfach als Alternative, können Sie exec
. Verwenden der Container-ID:
docker exec -i -t c8a9cf1a1fa8 /bin/bash
Verwenden des Containernamens:
docker exec -i -t graceful_hopper /bin/bash
exec
führt ein Programm innerhalb eines Containers aus, in diesem Fall /bin/bash
(eine Shell (vermutlich eine des Containers)). -i
bezeichnet eine interaktive Sitzung, während -t
einen Pseudo-TTY zuweist.
Hinweis: Im Gegensatz zu attach wird durch Drücken von Strg-c der Befehl " exec " d nur bei interaktiver Ausführung beendet.
Protokolle drucken
Das Aufrufen der Protokolle ist die weniger aufdringliche Art, eine Live-Anwendung zu debuggen. In diesem Beispiel wird das Verhalten des traditionellen 7786807d8084
tail -f some-application.log
im Container 7786807d8084
.
docker logs --follow --tail 10 7786807d8084
Dieser Befehl zeigt im Wesentlichen die Standardausgabe des Containerprozesses (des Prozesses mit PID 1).
Wenn Ihre Protokolle keine Zeitmarke enthalten, können Sie das Flag --timestamps
hinzufügen.
Es ist auch möglich, die Protokolle eines angehaltenen Containers anzuzeigen
Starten Sie den fehlerhaften Container mit
docker run ... ; docker logs $(docker ps -lq)
Finden Sie die Container-ID oder den Namen mit
docker ps -a
und dann
docker logs container-id
oder
docker logs containername
Es ist möglich, die Protokolle eines angehaltenen Containers anzuzeigen
Docker-Containerprozess-Debugging
Docker ist nur eine ausgefallene Möglichkeit, einen Prozess auszuführen, keine virtuelle Maschine. Daher ist das Debuggen eines Prozesses "in einem Container" auch "auf dem Host" möglich, indem der laufende Containerprozess als Benutzer mit den entsprechenden Berechtigungen zum Überprüfen dieser Prozesse auf dem Host (z. B. root) untersucht wird. Es ist beispielsweise möglich, jeden "Containerprozess" auf dem Host ps
indem Sie ein einfaches ps
als root ps
:
sudo ps aux
Alle derzeit laufenden Docker-Container werden in der Ausgabe aufgeführt.
Dies kann während der Anwendungsentwicklung hilfreich sein, um einen in einem Container ausgeführten Prozess zu debuggen. Als Benutzer mit entsprechenden Berechtigungen können für den Containerprozess typische Debugging-Dienstprogramme verwendet werden, z. B. strace, ltrace, gdb usw.