Kako dobiti IP adresu spremnika za Docker - objašnjeno na primjerima

Docker pruža mogućnost pakiranja i pokretanja aplikacije u labavo izoliranom okruženju zvanom spremnik.

Znam što možda mislite - hajde, ne još jedan post koji objašnjava što je Docker, ovih dana ima ga svugdje!

Ali ne brinite, preskačemo taj osnovni uvod. Ciljna publika za ovaj članak već bi trebala osnovno razumjeti što su Docker i kontejneri.

No jeste li se ikad pitali kako dobiti IP adresu Docker Container-a?

Objašnjena Docker mreža

Prvo, shvatimo kako funkcionira mreža Docker. Zbog toga ćemo se usredotočiti na zadanu bridgemrežu. Ako koristite Docker, ako ne navedete upravljački program, ovo je vrsta mreže koju koristite.

bridgeMreža radi kao privatne mreže internog domaćinu tako kontejneri na njega može komunicirati. Vanjski pristup omogućuje se izlaganjem luka spremnicima.

Mostovne mreže koriste se kada se vaše aplikacije izvode u samostalnim spremnicima koji trebaju komunikaciju.

Na gornjoj slici dbi webmogu međusobno komunicirati na korisničkoj mreži mosta nazvanoj mybridge.

Ako nikada niste dodali mrežu u Docker, trebali biste vidjeti nešto slično ovome:

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

Navedena je zadana bridgemreža, zajedno sa hosti none. Zanemarit ćemo ostale dvije i bridgemrežu ćemo koristiti kad dođemo do primjera.

IP adresa spremnika Docker

Prema zadanim postavkama spremniku se dodjeljuje IP adresa za svaku Docker mrežu s kojom se povezuje. I svaka mreža kreira se sa zadanom maskom podmreže, koja se kasnije koristi kao spremište za odavanje IP adresa.

Obično Docker koristi zadanih 172.17. 0,0 / 16 podmreža za umrežavanje spremnika.

Da bismo ga bolje razumjeli, izvršit ćemo stvarni slučaj upotrebe.

crtanje

Primjer Dockera

Da bismo to ilustrirali, upotrijebit ćemo okoliš Hive i Hadoop, koji sadrži 5 Docker spremnika.

Pogledajte docker-compose.ymldatoteku koju ćemo izvršiti:

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: 

Iz dock-košnice GitHub

Nitko ne želi pročitati VELIKU konfiguracijsku datoteku, zar ne? Pa evo slike:

Puno bolje! Ajmo sada pokrenuti te spremnike:

docker-compose up -d 

Možemo vidjeti 5 kontejnera:

$ 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

Sljedeće provjerimo naše Docker mreže:

$ 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

Čekajte malo ... zove se nova mreža docker-hive_default!

Prema zadanim postavkama docker compose postavlja jedinstvenu mrežu za vašu aplikaciju. A mreži vaše aplikacije dodijeljeno je ime na temelju "naziva projekta", nastalog iz naziva direktorija u kojem živi.

Dakle, budući da je naš direktorij imenovan docker-hive, ovo objašnjava novu mrežu.

Slijedi nekoliko primjera kako dobiti Docker IP adresu.

Kako dobiti IP adresu spremnika za Docker - primjeri

A sada, kad imam vašu pažnju, otkrit ćemo misterij.

crtanje

1. Koristeći Docker Inspect

Dockerov pregled izvrstan je način za pronalaženje podataka niske razine o Docker objektima. Možete vratiti bilo koje polje iz vraćenog JSON-a na prilično jednostavan način.

Pa hoćemo li je upotrijebiti za dobivanje IP adrese s adrese dockerhive_datanode?

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

Zar niste rekli da Docker koristi zadani 172.17. 0,0 / 16 podmreža za umrežavanje spremnika? Zašto je vraćena IP adresa: 172.18.0.5  izvan nje?

Da bismo odgovorili da moramo pogledati naše mrežne postavke:

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

Ovaj smo primjer izvršili u Compute Engine VM, a u ovom je testu docker mreži dodijeljena druga podmreža: 172.18.0.0/16 . To to objašnjava!

Nadalje, također možemo potražiti sve IP adrese unutar docker-hive_defaultmreže.

Stoga ne trebamo tražiti IP svakog spremnika pojedinačno:

$ 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"
crtanje

Ako niste primijetili, koristili smo jq pomoć za raščlanjivanje Containersobjekta karte.

2. Korištenje programa Docker exec

U sljedećem primjeru radit ćemo s 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. Unutar spremnika Docker

$ 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

Čak možemo pronaći i IP adrese drugih spremnika koji se nalaze unutar spremnika u istoj mreži:

Čvor podataka

# 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

Košnica 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

Poslužnik košnica

# 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

Zamotati

Svi su primjeri izvedeni u linux distribuciji Compute Engine VM. Ako ih izvršavate u macOS ili Windows okruženju, uzorci naredbi mogu se malo promijeniti.

Također imajte na umu da su one IP adrese u navedenim primjerima unutar docker-hive_defaultmreže uzoraka . Dakle, ako imate slučaj upotrebe za vanjsko povezivanje s tim spremnicima, morat ćete upotrijebiti vanjski IP glavnog računala (pod pretpostavkom da ispravno izlažete priključke spremnika).

Ili ako, na primjer, koristite kubernetes za upravljanje spremnicima Docker, dopustite mu da obrađuje IP adrese za vas kubernetes-expose-external-ip-address?

* Ilustracije s icons8.com Murata Kalkavana.