Wenn Sie nach einer detaillierten Ansicht aller Hauptkomponenten von Docker von Docker-Images, Containern usw. suchen, ist der Befehl docker inspect genau das Richtige für Sie.
In diesem Tutorial erfahren Sie, wie Sie ein Spürhund werden, um detaillierte Informationen zu vielen Docker-Komponenten zum Debuggen, zur Fehlerbehebung oder einfach nur aus Neugier zu entdecken.
Fangen wir an!
Voraussetzungen
Wenn Sie Schritt für Schritt folgen möchten, stellen Sie sicher, dass Sie Folgendes haben:
- Docker – Dieses Tutorial verwendet Docker v19.03.11 auf Ubuntu 18.04.5 LTS.
- Jedes heruntergeladene und verfügbare Docker-Image. Dieses Tutorial verwendet das neueste NGINX-Docker-Image, das auf Docker Hub verfügbar ist.
- Mindestens ein Container, der auf dem Docker-Host ausgeführt wird.
Inspizieren von Docker-Images mit Docker Inspect
Der Docker Inspect
kann Informationen zu vielen verschiedenen Docker-Komponenten bereitstellen, aber beginnen wir zunächst mit einer der beliebtesten Komponenten; Bilder. Wenn Sie ein Bild heruntergeladen haben, wie suchen Sie dann nach Informationen zu diesem Bild? Finden wir es heraus.
Angenommen, Sie haben mindestens ein Image auf Ihrem Docker-Host, verwenden Sie inspect
Befehl, um dieses Bild abzufragen. Der folgende Befehl geht davon aus, dass Sie ein Image namens nginx
haben auf Ihrem Host.
docker image inspect nginx
Nach der Ausführung gibt der obige Befehl eine Reihe von Informationen über JSON zu diesem bestimmten Bild zurück. Einige bemerkenswerte Attribute sind:
- Das Image-Tag.
- Die Zeit, zu der das Bild erstellt wurde.
- Der Hostname des zugehörigen Containers mit dem Docker-Image nginx.
- Die Netzwerkports, die der Container dem externen Netzwerk zur Verfügung stellt.
- Sie werden auch die Volumes bemerken, die an den Container angehängt sind, der zum Docker-Image nginx gehört.

Detaillierte Informationen zu Docker-Netzwerken erhalten
Die docker inspect
Befehl ist nicht nur darauf beschränkt, Informationen über Bilder und Container zu sammeln; es kann auch Netzwerke abfragen. Docker-Netzwerke ermöglichen es Containern, auf verschiedene Arten zu kommunizieren, z. B. über ein Bridge-Netzwerk (ein privates Netzwerk), ein Host-Netzwerk (ein öffentliches Netzwerk) oder ein Overlay-Netzwerk.
Die Kenntnis von Docker-Netzwerken ist wichtig, da Sie jederzeit je nach Bedarf der Anwendung zu einem anderen Docker-Netzwerk wechseln können, indem Sie die Verbindung trennen und dann wieder verbinden.
Angenommen, Sie befinden sich noch auf dem Terminal:
1. Führen Sie den folgenden Befehl aus. Das docker network ls
Der Befehl listet alle im Docker vorhandenen Netzwerke auf. Sie benötigen die Ausgabe dieses Befehls, um die ID des Netzwerks zu finden.
docker network ls

Übergeben Sie als Nächstes eine Netzwerk-ID an das docker inspect network
Befehl. Dieser Befehl gibt verschiedene Informationen über das jeweilige Netzwerk zurück, wie unten gezeigt.
docker inspect network 4748f122c987
1. Die Art des Netzwerks.
2. Die vom Netzwerk verwendete Subnetzadresse.
3 und 4. Zusammenfassende Informationen zu jedem Container, der dieses bestimmte Netzwerk verwendet.

Go-Templates von Docker und das format
verstehen Parameter
Bis jetzt haben Sie gelernt, wie Sie den Docker-Inspect-Befehl verwenden, ohne zusätzliche Optionsparameter zu verwenden. Aber wenn Sie das Ausgabeformat manipulieren müssen, ziehen Sie die Verwendung von --format
in Betracht Flagge. Das --format
-Parameter verwendet Go-Vorlagen, um die von docker inspect
zurückgegebenen Informationen zu filtern und anzuzeigen .
Zusammen mit dem Format-Flag werden verschiedene Funktionen verwendet, wie z. B. join, println, table usw. Lassen Sie uns einige davon besprechen!
Vielleicht möchten Sie beispielsweise einige Werte aus der Ausgabe eines bestimmten Containers zusammenführen. Wenn ja, join
Befehl funktioniert gut. Unten sehen Sie, dass join
Befehl verkettet Zeichenfolgen (nginx, -g, daemon off
) wobei jedes Element durch ein Trennzeichen getrennt ist (,
).
docker inspect --format '{{join .Args " , "}}' container_id

Vielleicht möchten Sie einen Wert kapitalisieren? Verwenden Sie den upper
Befehl.
docker inspect --format "{{upper .Name}}" container_id

Sie können viele verschiedene Beispiele für die Verwendung des format
finden Parameter.
Suchen des Basis-Image-Namens eines Docker-Containers
Im vorherigen Abschnitt haben Sie gesehen, wie Sie eine detaillierte Ansicht aller Ihrer Docker-Images erhalten, einschließlich der Container, die diese Images verwenden. Was aber, wenn Sie bereits eine Container-ID kennen und schnell das Image finden müssen, aus dem sie erstellt wurde? Sie können die Container-ID für docker inspect
bereitstellen .
Führen Sie den folgenden docker inspect
aus, um den Namen des Images zu finden, aus dem ein bestimmter Container erstellt wurde Befehl. Der folgende Befehl übergibt die Container-ID (8f34d039fa3a
in diesem Fall) zu docker inspect
und verwendet das format
Parameter, um nur das image
zurückzugeben Wert aus der Config
-Knoten in der JSON-Ausgabe.
# 8f34d039fa3a is the container represented with ContainerID.
docker inspect --format='{{.Config.Image}}' 8f34d039fa3a

Sie können sehen, was die gesamte Config
Knoten sieht wie unten aus und wo das Image
Name kommt von.

IP-Adresse, Mac-Adresse und Portbindungen eines Containers finden
Obwohl Sie jetzt wissen, wie Sie das Netzwerk finden, das ein Container verwendet, woher wissen Sie, welche IP-Adresse oder Mac-Adresse und welche Portbindungen in diesem Netzwerk ein Container verwendet? Du hast es erraten! docker inspect
.
Um die von einem Container verwendete IP-Adresse einzugrenzen, übergeben Sie die Container-ID an docker inspect
Befehl. Verwenden Sie wieder das format
-Parameter, um das unerwünschte JSON herauszufiltern, damit Sie genau das finden, wonach Sie suchen.
Sie sehen das format
Parameterargument unten sagt docker inspect
nur um den in NetworkSettings
eingebetteten Wert zurückzugeben →Networks
→ IPAddress
JSON-Attribut mit dem range
Attribut. Mit dem Range-Attribut können Sie über ein Array iterieren, indem Sie .
festlegen Wert für jedes Array-Element.
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my_container

Sie sehen die wichtigsten NetworkSettings
Knoten unten und wo die IPAddress
Wert ist verschachtelt.

Ähnlich, um die MAC-Adresse zu finden des Containers verwenden Sie docker inspect
Container-Befehl wie unten gezeigt.
Auch hier sehen Sie das format
Parameterargument unten verwendet den range
Attribut, aber finden Sie dieses Mal die Mac-Adresse des Containers, indem Sie NetworkSettings
überprüfen →Networks
→ Mac address
.
docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' 3dd206041249

Schließlich, um alle Portbindungen eines Containers zu überprüfen Führen Sie den folgenden docker inspect
aus Befehl. Sie sehen das format
Parameterargument unten verwendet den range
-Attribut, um die Portbindungen des Containers zu finden, indem Sie NetworkSettings
einchecken →HostPort
.
Jeder sollte über die Portbindungen Bescheid wissen, denn wenn ein Port bereits verwendet wird, sollte er nicht erneut verwendet werden; Andernfalls wird eine Fehlermeldung ausgegeben, die besagt, dass der Port bereits zugewiesen wurde.
docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' 8f34d039fa3a

Erhalten einer detaillierten Ansicht des Docker-Volumes mit Docker Inspect
Bis jetzt haben Sie gelernt, wie Sie detaillierte Informationen zu den Images, Containern und Netzwerken finden, aber Sie haben nichts über Speicher gelernt. Lass uns das ändern.
Um sicherzustellen, dass das Tutorial mindestens ein gemountetes Volume hat, das mit einem Container verbunden ist, erstellen wir zuerst einen Container und mounten ein Speichervolume.
Wenn Sie bereits ein Speichervolume in einem Container gemountet haben, können Sie diesen Teil überspringen.
Der folgende Befehl erstellt einen neuen Docker-Container namens my_container
, macht Port 80 für den Host verfügbar (-p 80:80
), stellt ein Volume basierend auf /var/container_dir des Hosts bereit Verzeichnis namens mounted_val (-v mounted_vol:/var/container_dir
) mit nginx
Bild.
docker run --name my_container -p 80:80 -v mounted_vol:/var/container_dir nginx
Nachdem Sie nun ein Volume in einem Container gemountet haben, geben Sie den Namen des Volumes an docker volume inspect
an . Beachten Sie unten, dass der Befehl eine JSON-Ausgabe zurückgibt, die nur Informationen über das bereitgestellte Speichervolume bereitstellt.
docker volume inspect mounted_vol

Schlussfolgerung
Sie sollten jetzt docker inspect
verwenden können Befehl in vielen verschiedenen Situationen, von der Abfrage von Informationen über Bilder, Container, Netzwerke und Speicher.
Wie möchten Sie docker inspect
verwenden? um Informationen über Ihre eigene Docker-Umgebung abzufragen?