Sie fragen sich, wie die IP-Adresse Ihres laufenden Docker-Containers lautet? Sie können den laufenden Container untersuchen, um diese Informationen zu erhalten.
sudo docker container inspect container_name_or_ID
Sie kennen den Namen oder die ID des Containers nicht? Verwenden Sie den Befehl sudo docker ps
.
Die inspect
Der Befehl gibt Ihnen viele Details über den Container, den Sie inspizieren. Gehen Sie zum Ende und sehen Sie sich die Networks
an Abschnitt, um die IP-Adresse des Containers abzurufen.
Sie können auch den Befehl grep verwenden, um nur die Zeilen zu erhalten, die mit der Zeichenfolge "IPAddress" übereinstimmen.
Seien Sie nicht beunruhigt, wenn Ihr Container mehr als eine IP-Adresse hat. Das ist nicht ungewöhnlich. Um das zu verstehen, müssen Sie verstehen, wie Container miteinander kommunizieren.
Ich werde Ihnen das im nächsten Abschnitt erklären, gefolgt von einigen anderen Methoden, um die IP-Adresse eines laufenden Docker-Containers zu erhalten.
Wie kommunizieren Docker-Container?
Docker ist ein Tool zum Verpacken und Bereitstellen von Software für die breite Masse mithilfe der Containerisierungstechnologie. Software kann eine Vielzahl von Zwecken haben, von möglicherweise einfacher Textverarbeitung bis hin zu einem vollständigen Webserver, der Ihre privaten Dateien hostet. Jede dieser Softwares wird in Microservices zerlegt und dann als Container verpackt. Je nach Zweck der Software muss ein Dienst möglicherweise mit einem anderen kommunizieren.
Denken Sie zum Beispiel an WordPress. Es gibt zwei Dienste, einer ist der Webserver, der das Frontend bedient, und ein anderer ist das Backend, die Datenbank. Das Frontend muss mit der Datenbank kommunizieren, sonst funktioniert es einfach nicht.
Diese Kommunikation wird erreicht, indem jedem dieser beiden Container mindestens zwei Netzwerkschnittstellen zugeordnet sind, wobei beide Schnittstellen mit demselben Netzwerk verbunden sind. Dieses Netzwerk wird als "Docker-Netzwerk" bezeichnet.
Docker-Netzwerk
Stellen Sie sich das Docker-Netzwerk als einen Pool verfügbarer IP-Adressen vor. Wenn zwei Container IP-Adressen aus demselben Pool übernehmen, können sie miteinander kommunizieren.
Es gibt hauptsächlich zwei Arten von Netzwerken, die standardmäßigen oder vordefinierten Netzwerke und die benutzerdefinierten Netzwerke.
Sie können die Liste der Netzwerke mit dem folgenden Befehl abrufen
docker network ls
Betrachten Sie meine Liste unten:
❯ docker network ls
NETWORK ID NAME DRIVER SCOPE
272ff2e44dc2 bridge bridge local
5e4a3f5e99dd host host local
cdaef1e49ddc none null local
Ignorieren Sie die letzten beiden und konzentrieren Sie sich auf das erste Netzwerk. Die bridge
network ist das Standardnetzwerk, mit dem jeder Container verbunden wird, wenn nichts explizit angegeben wird. Weitere Details zu diesem Netzwerk erhalten Sie, indem Sie die docker network inspect bridge
ausführen Befehl.
Ich werde die Ausgabe filtern, da ich für diese Demonstration nicht alle Daten benötige, die inspect
wird explodieren.
❯ docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Subnet
172.17.0.0/16
Wenn Sie jq nicht installiert haben, installieren Sie es bitte mit dem Paketmanager Ihrer Distribution.
Jedes dieser Docker-Netzwerke hat ein Subnetz, im Fall der bridge
Netzwerk, dieses Subnetz ist 172.17.0.0/16. Das bedeutet, dass es insgesamt 65.534 - 1 =65.533 verwendbare Hosts oder IP-Adressen gibt. Ich habe einen abgezogen, da 172.17.0.1 für das Gateway zugewiesen ist. Sie können das auch mit dem folgenden Befehl
docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Gateway
Überprüfen der IP-Adresse Ihres Docker-Containers
Es gibt mehrere Möglichkeiten, die mit Ihrem Container verknüpfte(n) IP-Adresse(n) zu überprüfen. Hier ist eine Liste mit allen, einschließlich Befehlsbeispielen.
Methode 1:Durch Inspektion des Behälters
Die inspect
Unterbefehle von Docker sind äußerst hilfreich. Ein Container kann mit dem docker container inspect [CONTAINER ID]|[CONTAINER NAME]
inspiziert werden Befehl.
Einen Container zu inspizieren bedeutet, so viele Informationen wie möglich über den Container zu erhalten, von Ports, Umgebungsvariablen bis hin zu Einhängepunkten, Cgroup-Daten usw. Die IP-Adresse kann daraus extrahiert werden.
Wenn Sie inspect
ausführen Befehl für einen Container erhalten Sie eine Reihe von Informationen im JSON-Format. Scrollen Sie nach unten, bis Sie den Schlüssel NetworkSettings
finden , suchen Sie dort nach dem Unterschlüssel IPAddress
. Das ist die IP-Adresse Ihres Containers.
Der auszuführende Befehl sieht wie folgt aus
docker container inspect [CONTAINER ID]|[CONTAINER NAME]
Hier ist meine Ausgabe (abgeschnitten)
> docker container inspect ubuntu-ip
.
.
.
"NetworkSettings": {
.
.
.
"IPAddress": "172.17.0.2",
.
.
.
Anstatt durch all das zu scrollen, können Sie die Ausgabe wie folgt filtern:
docker container inspect -f '{{ .NetworkSettings.IPAddress }}' CONTAINER_ID_OR_NAME
Hier ist eine gefilterte Ausgabe:
❯ docker container inspect -f '{{ .NetworkSettings.IPAddress }}' ubuntu-ip
172.17.0.2
Wenn Sie eine IP-Adresse erhalten möchten, die einem bestimmten Netzwerk zugeordnet ist, verwenden Sie einen Befehl wie den folgenden
docker container inspect -f '{{ .NetworkSettings.Networks.[NETWORK NAME].IPAddress }}' CONTAINER_ID_OR_NAME
Eine Beispielausgabe:
❯ docker container inspect -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}' ubuntu-ip
172.17.0.2
Methode 2:Verwenden der Shell des Containers
Dies ist die einfachste Methode, aber auch etwas, das ich nicht empfehle .
Bei dieser Methode hängen Sie Ihre stdin|stdout an die des Containers an und führen die ip
aus Befehl (oder ein anderer Befehl, der die den NICs zugeordneten IP-Adressen anzeigt).
Der Grund, warum ich dies nicht empfehle, ist, dass viele Bilder ziemlich leicht sind und die ip
nicht enthalten Befehl (oder etwas Ähnliches).
Nehmen Sie ubuntu:20.04
image als Beispiel, starten Sie einen Container wie den folgenden
docker run --rm --name ubuntu-ip -d ubuntu:20.04 sleep 1d
Um den Container am Laufen zu halten, habe ich den sleep 1d
verwendet Befehl.
Starten Sie nun einen Shell-Prozess innerhalb des Containers und hängen Sie Ihre stdin|stdout so an
docker exec -ti ubuntu-ip sh
Sobald Sie sich in diesem Container befinden, versuchen Sie, ip
auszuführen oder ifconfig
. Sie sehen etwa Folgendes:
❯ docker exec -ti ubuntu-ip sh
# ip
sh: 1: ip: not found
# ifconfig
sh: 2: ifconfig: not found
Damit diese Befehle funktionieren, müssen Sie die entsprechenden Pakete installieren. Um ip
zu erhalten installieren Sie iproute2
package und führen Sie den Befehl erneut als ip a
aus
# apt update -qq
6 packages can be upgraded. Run 'apt list --upgradable' to see them.
# apt install iproute2 -yqq
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
Jetzt können Sie die mit der Karte verknüpfte IP-Adresse [email protected]
sehen 172.17.0.2.
Beachten Sie das Netzwerk, zu dem dieser Container gehört. Da ich kein benutzerdefiniertes Netzwerk erstellt und mit diesem Container verbunden habe, wurde er mit dem Bridge-Netzwerk verbunden, weshalb das Netzwerk dieser IP 172.17.0.0 ist
Diese Methode funktioniert sicherlich, obwohl es mehr Arbeit und nicht sehr reproduzierbar ist, ist es intuitiv. Die nächsten Methoden sollten im Vergleich zu dieser viel besser sein.
Methode 3:Durch Inspektion des Netzwerks selbst
Immer wenn ein Container mit einem Netzwerk verbunden wird, ist dieser verbundene Container auch im Netzwerk sichtbar, zusammen mit der diesen Containern zugewiesenen IP-Adresse.
Da mein Container mit dem Bridge-Netzwerk verbunden ist, kann ich das Netzwerk mit dem folgenden Befehl inspizieren
docker network inspect [NETWORK NAME][NETWORK ID]
Hier verwende ich anstelle einer ID den Namen bridge
docker network inspect bridge
Anstatt nach unten zu den Containers
zu scrollen Abschnitt verwende ich jq
um die Ausgabe dieses Mal zu filtern.
❯ docker network inspect bridge | jq .[].Containers
{
"1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba": {
"Name": "ubuntu-ip",
"EndpointID": "44d6b85348d6274b4ee779f9d3617d184ccfd3bad228ee652141d9b4157c50ae",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"50a4f195d8eae6b6b714e8aa058c6058dbe91d0a272c8ca826d4442df1c63885": {
"Name": "ip",
"EndpointID": "d4e72a4df81ee7023386df9d96676d9c291e2902349eb453338b8e0145a610fd",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
}
Um dies zu demonstrieren, habe ich einen weiteren Container mit dem Namen ip
bereitgestellt . Sie können die Container und IP-Adressen im obigen JSON-Objekt sehen. Jetzt ist das Extrahieren der IP eines bestimmten Containers hier etwas schwieriger.
Wenn Sie die Container-ID kennen, können Sie jq
verwenden so
docker network inspect bridge | jq '.[].Containers."[CONTAINER ID]".IPv4Address'
Hier ist ein Beispiel
❯ docker network inspect bridge | jq '.[].Containers."1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba".IPv4Address' -r
172.17.0.2/16
Meistens können Sie sich die Container-ID nicht merken, wenn Sie also die IP nur aus dem Containernamen erhalten möchten, müssen Sie sich mit jq
auskennen (oder verwenden Sie einfach den folgenden Befehl).
docker network inspect -f '{{json .Containers}}' bridge | \
jq '..|if type == "object" and has("Name") then select(.Name=="[CONTAINER NAME]") | .IPv4Address else empty end' -r
Platzieren Sie den Containernamen in select
funktionieren und sehen, wie die Magie geschieht.
❯ docker network inspect -f '{{json .Containers}}' bridge | \
jq '..|if type == "object" and has("Name") then select(.Name=="ubuntu-ip") | .IPv4Address else empty end' -r
172.17.0.2/16
Welche Methode bevorzugen Sie? Methode 1 wahrscheinlich
Das waren alle Methoden, mit denen Sie die IP-Adresse(n) von Docker-Containern erhalten können. Die zweite Methode ist zwar intuitiv, aber nicht reproduzierbar. Meistens ist es die erste Methode, die verwendet wird, da sie die einfachste ist und die Arbeit erledigt.
Es kann jedoch vorkommen, dass Sie überprüfen möchten, welche Container mit einem bestimmten Netzwerk verbunden sind, und die IP-Adressen in diesem Netzwerk abrufen möchten. In diesem Fall ist es sinnvoll, das Netzwerk zu inspizieren und die IPs zu erhalten. Sie können alle Containernamen und ihnen zugewiesene IPs von einem Netzwerk wie diesem erhalten
❯ docker network inspect -f '{{json .Containers}}' bridge | \
jq '.. | if type=="object" and has("Name") then {(.Name): .IPv4Address} else empty end'
{
"ubuntu-ip": "172.17.0.2/16"
}
{
"ip": "172.17.0.3/16"
}
bridge
ändern zu einem anderen Netzwerk, und Sie erhalten alle Container und ihre IP-Adressen wie folgt.
Das war `s für heute. Ich hoffe, dieser Artikel war hilfreich für Sie. Wenn Sie Fragen haben, lassen Sie es mich in den Kommentaren unten wissen.