So erhalten Sie eine Docker-Container-IP-Adresse - anhand von Beispielen erläutert

Docker bietet die Möglichkeit, eine Anwendung in einer lose isolierten Umgebung zu packen und auszuführen, die als Container bezeichnet wird.

Ich weiß, was Sie vielleicht denken - kommen Sie, kein weiterer Beitrag, der erklärt, was Docker ist, es ist heutzutage überall!

Aber keine Sorge, wir überspringen diese grundlegende Einführung. Die Zielgruppe für diesen Artikel sollte bereits ein grundlegendes Verständnis dafür haben, was Docker und Container sind.

Aber haben Sie sich jemals gefragt, wie Sie eine Docker Container IP-Adresse erhalten?

Docker-Netzwerk erklärt

Lassen Sie uns zunächst verstehen, wie das Docker-Netzwerk funktioniert. Dafür konzentrieren wir uns auf das Standardnetzwerk bridge. Wenn Sie Docker verwenden und keinen Treiber angeben, ist dies der von Ihnen verwendete Netzwerktyp.

Das bridgeNetzwerk arbeitet als privates Netzwerk innerhalb des Hosts, sodass Container darauf kommunizieren können. Externer Zugriff wird gewährt, indem Ports Containern ausgesetzt werden.

Brückennetzwerke werden verwendet, wenn Ihre Anwendungen in eigenständigen Containern ausgeführt werden, die kommunizieren müssen.

Im Bild oben dbund webkann über ein vom Benutzer erstelltes Brückennetzwerk miteinander kommunizieren mybridge.

Wenn Sie in Docker noch nie ein Netzwerk hinzugefügt haben, sollte Folgendes angezeigt werden:

$ docker network ls NETWORK ID NAME DRIVER SCOPE c3cd46f397ce bridge bridge local ad4e4c24568e host host local 1c69593fc6ac none null local

Das Standardnetzwerk bridgewird zusammen mit hostund aufgelistet none. Wir werden die beiden anderen ignorieren und das bridgeNetzwerk verwenden, wenn wir zu den Beispielen kommen.

IP-Adresse des Docker-Containers

Standardmäßig wird dem Container für jedes Docker-Netzwerk, mit dem er eine Verbindung herstellt, eine IP-Adresse zugewiesen. Und jedes Netzwerk wird mit einer Standard-Subnetzmaske erstellt, die später als Pool verwendet wird, um die IP-Adressen preiszugeben.

Normalerweise verwendet Docker die Standardeinstellung 172.17. 0.0 / 16 Subnetz für Containernetzwerke.

Um es jetzt besser zu verstehen, werden wir einen realen Anwendungsfall ausführen.

Zeichnung

Docker-Beispiel

Um dies zu veranschaulichen, verwenden wir eine Hive- und Hadoop-Umgebung mit 5 Docker-Containern.

Schauen Sie sich die docker-compose.ymlDatei an, die wir ausführen werden:

version: "3" services: namenode: image: bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8 volumes: - namenode:/hadoop/dfs/name environment: - CLUSTER_NAME=test env_file: - ./hadoop-hive.env ports: - "50070:50070" datanode: image: bde2020/hadoop-datanode:2.0.0-hadoop2.7.4-java8 volumes: - datanode:/hadoop/dfs/data env_file: - ./hadoop-hive.env environment: SERVICE_PRECONDITION: "namenode:50070" ports: - "50075:50075" hive-server: image: bde2020/hive:2.3.2-postgresql-metastore env_file: - ./hadoop-hive.env environment: HIVE_CORE_CONF_javax_jdo_option_ConnectionURL: "jdbc:postgresql://hive-metastore/metastore" SERVICE_PRECONDITION: "hive-metastore:9083" ports: - "10000:10000" hive-metastore: image: bde2020/hive:2.3.2-postgresql-metastore env_file: - ./hadoop-hive.env command: /opt/hive/bin/hive --service metastore environment: SERVICE_PRECONDITION: "namenode:50070 datanode:50075 hive-metastore-postgresql:5432" ports: - "9083:9083" hive-metastore-postgresql: image: bde2020/hive-metastore-postgresql:2.3.0 volumes: namenode: datanode: 

Vom Docker-Hive GitHub

Niemand möchte eine RIESIGE Konfigurationsdatei lesen , oder? Also hier ist ein Bild:

Viel besser! Lassen Sie uns nun diese Container starten:

docker-compose up -d 

Wir können 5 Container sehen:

$ docker ps --format \ "table {{.ID}}\t{{.Status}}\t{{.Names}}" CONTAINER ID STATUS NAMES 158741ba0339 Up 1 minutes dockerhive_hive-metastore-postgresql 607b00c25f29 Up 1 minutes dockerhive_namenode 2a2247e49046 Up 1 minutes dockerhive_hive-metastore 7f653d83f5d0 Up 1 minutes (healthy) dockerhive_hive-server 75000c343eb7 Up 1 minutes (healthy) dockerhive_datanode

Als nächstes überprüfen wir unsere Docker-Netzwerke:

$ docker network ls NETWORK ID NAME DRIVER SCOPE c3cd46f397ce bridge bridge local 9f6bc3c15568 docker-hive_default bridge local ad4e4c24568e host host local 1c69593fc6ac none null local

Moment mal ... es gibt ein neues Netzwerk namens docker-hive_default!

Standardmäßig richtet Docker Compose ein einzelnes Netzwerk für Ihre App ein. Das Netzwerk Ihrer App erhält einen Namen, der auf dem „Projektnamen“ basiert und aus dem Namen des Verzeichnisses stammt, in dem es sich befindet.

Da unser Verzeichnis benannt ist docker-hive, erklärt dies das neue Netzwerk.

Als nächstes einige Beispiele zum Abrufen der Docker-IP-Adresse.

So erhalten Sie eine Docker-Container-IP-Adresse - Beispiele

Und jetzt, wo ich Ihre Aufmerksamkeit habe, werden wir das Geheimnis enthüllen.

Zeichnung

1. Verwenden von Docker Inspect

Docker Inspect ist eine hervorragende Möglichkeit, Informationen zu Docker-Objekten auf niedriger Ebene abzurufen. Sie können jedes Feld auf relativ einfache Weise aus dem zurückgegebenen JSON auswählen.

Sollen wir es also verwenden, um die IP-Adresse von der zu erhalten dockerhive_datanode?

$ docker inspect -f \ '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \ 75000c343eb7 172.18.0.5

Haben Sie nicht gesagt, dass Docker die Standardeinstellung 172.17 verwendet ? 0.0 / 16 Subnetz für Containernetzwerke? Warum befindet sich die zurückgegebene IP-Adresse: 172.18.0.5  außerhalb?

Um darauf zu antworten, müssen wir uns unsere Netzwerkeinstellungen ansehen:

$ docker network inspect -f \ '{{range .IPAM.Config}}{{.Subnet}}{{end}}' 9f6bc3c15568 172.18.0.0/16

Wir haben dieses Beispiel in einer Compute Engine-VM ausgeführt, und in diesem Test wurde dem Docker-Netzwerk ein anderes Subnetz zugewiesen: 172.18.0.0/16 . Das erklärt es!

Darüber hinaus können wir auch alle IP-Adressen im docker-hive_defaultNetzwerk nachschlagen .

Wir müssen also nicht die IP jedes Containers einzeln nachschlagen:

$ docker network inspect -f \ '{{json .Containers}}' 9f6bc3c15568 | \ jq '.[] | .Name + ":" + .IPv4Address' "dockerhive_hive-metastore-postgresql:172.18.0.6/16" "dockerhive_hive-metastore:172.18.0.2/16" "dockerhive_namenode:172.18.0.3/16" "dockerhive_datanode:172.18.0.5/16" "dockerhive_hive-server:172.18.0.4/16"
Zeichnung

Wenn Sie es nicht bemerkt haben, haben wir die jq- Hilfe verwendet, um das ContainersKartenobjekt zu analysieren .

2. Verwenden von Docker exec

Im folgenden Beispiel werden wir mit dem arbeiten dockerhive_namenode.

$ docker exec dockerhive_namenode cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.18.0.3 607b00c25f29

3. Im Docker Container

$ docker exec -it dockerhive_namenode /bin/bash # running inside the dockerhive_namenode container ip -4 -o address 7: eth0 inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0

Wir können sogar die IP-Adressen anderer Container finden, die sich in einem Container im selben Netzwerk befinden:

Datenknoten

# running inside the dockerhive_namenode container ping dockerhive_datanode PING dockerhive_datanode (172.18.0.5): 56 data bytes 64 bytes from 172.18.0.5: icmp_seq=0 ttl=64 time=0.092 ms

Hive Mestastore

# running inside the dockerhive_namenode container ping dockerhive_hive-metastore PING dockerhive_hive-metastore_1 (172.18.0.2): 56 data bytes 64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.087 ms

Hive Server

# running inside the container ping dockerhive_hive-server PING dockerhive_hive-server (172.18.0.4): 56 data bytes 64 bytes from 172.18.0.4: icmp_seq=0 ttl=64 time=0.172 ms

Einpacken

Alle Beispiele wurden in einer Linux Distribution Compute Engine VM ausgeführt. Wenn Sie sie in MacOS- oder Windows-Umgebungen ausführen, können sich die Beispielbefehle etwas ändern.

Beachten Sie auch, dass diese IP-Adressen in den angegebenen Beispielen innerhalb des Beispielnetzwerks liegen docker-hive_default. Wenn Sie also einen Anwendungsfall haben, um eine externe Verbindung zu diesen Containern herzustellen, müssen Sie die externe IP des Host-Computers verwenden (vorausgesetzt, Sie legen die Container-Ports korrekt offen).

Oder wenn Sie beispielsweise Kubernetes zum Verwalten Ihrer Docker-Container verwenden, lassen Sie diese die IP-Adressen für Ihre Kubernetes-Expose-External-IP-Adresse verarbeiten.

* Illustrationen von icons8.com von Murat Kalkavan.