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

So erhalten Sie die IP-Adresse des Docker-Containers

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

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


Docker
  1. So installieren Sie WordPress mit Docker

  2. Wie führe ich ein Programm in einem Docker-Container aus?

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

  4. So weisen Sie einem Docker-Container eine statische IP zu

  5. So greifen Sie vom Host auf den Netzwerk-Namespace des Docker-Containers zu

Was ist Docker? Wie funktioniert es?

So erhalten Sie die IP-Adresse eines Docker-Containers vom Host

So führen Sie PHPMyAdmin in einem Docker-Container aus

So führen Sie Grafana in einem Docker-Container aus

So richten Sie einen Apache Docker-Container ein

So führen Sie Docker-Container aus