Kā iegūt Docker Container IP adresi - paskaidrots ar piemēriem

Docker nodrošina iespēju iepakot un palaist lietojumprogrammu brīvi izolētā vidē, ko sauc par konteineru.

Es zinu, ko jūs domājat - nāc, nevis cits ieraksts, kurā paskaidrots, kas ir Dokers, mūsdienās tas ir visur!

Bet neuztraucieties, mēs izlaižam šo pamata ievadu. Šī raksta mērķauditorijai jau vajadzētu būt pamata izpratnei par to, kas ir Docker un Containers.

Bet vai jūs kādreiz esat domājis, kā iegūt Docker Container IP adresi?

Docker tīkls paskaidroja

Pirmkārt, pieņemsim saprast, kā darbojas Docker tīkls. Šim nolūkam mēs koncentrēsimies uz noklusējuma bridgetīklu. Ja izmantojat Docker, ja nenorādāt draiveri, tas ir jūsu izmantotā tīkla tips.

bridgeTīkls darbojas kā privātais tīkls iekšējā uzņēmējas tik konteineri uz tā var sazināties. Ārējo piekļuvi piešķir, pakļaujot ostas konteineriem.

Tilta tīkli tiek izmantoti, ja jūsu lietojumprogrammas darbojas atsevišķos konteineros, kuriem ir jāsazinās.

Iepriekš redzamajā attēlā dbun webvar sazināties savā starpā ar lietotāja izveidotu tilta tīklu, ko sauc mybridge.

Ja jūs nekad neesat pievienojis tīklu Docker, jums vajadzētu redzēt kaut ko līdzīgu šim:

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

Tiek parādīts noklusējuma bridgetīkls kopā ar hostun none. Mēs ignorēsim pārējos divus un izmantosim bridgetīklu, kad nonāksim pie piemēriem.

Docker konteinera IP adrese

Pēc noklusējuma konteineram tiek piešķirta IP adrese katram Docker tīklam, ar kuru tas izveido savienojumu. Katrs tīkls tiek izveidots ar noklusējuma apakštīkla masku, vēlāk to izmantojot kā baseinu, lai atdotu IP adreses.

Parasti Docker izmanto noklusējuma 172.17. 0,0 / 16 apakštīkls konteineru tīklošanai.

Tagad, lai labāk to saprastu, mēs izpildīsim reālu lietošanas gadījumu.

zīmējums

Dokera piemērs

Lai to ilustrētu, mēs izmantosim Hive and Hadoop vidi, kurā būs 5 Docker konteineri.

Pārbaudiet docker-compose.ymlfailu, kuru mēs gatavojamies izpildīt:

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: 

No dokeru stropa GitHub

Neviens nevēlas lasīt MILZĪGU konfigurācijas failu, vai ne? Tātad, šeit ir attēls:

Daudz labāk! Tagad sāksim šos konteinerus:

docker-compose up -d 

Mēs varam redzēt 5 konteinerus:

$ 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

Tālāk pārbaudīsim mūsu Docker tīklus:

$ 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

Pagaidiet minūti ... ir jauns tīkls ar nosaukumu docker-hive_default!

Pēc noklusējuma Docker Compose jūsu lietotnei izveido vienu tīklu. Jūsu lietotnes tīklam tiek piešķirts nosaukums, pamatojoties uz “projekta nosaukumu”, kas radies no direktorija nosaukuma, kurā tā dzīvo.

Tā kā mūsu katalogs ir nosaukts docker-hive, tas izskaidro jauno tīklu.

Tālāk daži piemēri, kā iegūt Docker IP adresi.

Kā iegūt Docker Container IP adresi - piemēri

Un tagad, kad man ir jūsu uzmanība, mēs atklāsim noslēpumu.

zīmējums

1. Izmantojot Docker Inspect

Docker inspect ir lielisks veids, kā iegūt zema līmeņa informāciju par Docker objektiem. Visu lauku no atgrieztās JSON varat atlasīt diezgan vienkārši.

Tātad, vai mēs to izmantosim, lai iegūtu IP adresi no dockerhive_datanode?

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

Vai jūs neteicāt, ka Docker izmanto noklusējuma 172.17. 0.0 / 16 apakštīkls konteineru tīklošanai? Kāpēc atgrieztā IP adrese: 172.18.0.5  atrodas ārpus tās?

Lai atbildētu, ka mums jāaplūko mūsu tīkla iestatījumi:

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

Mēs izpildījām šo piemēru Compute Engine VM, un šajā pārbaudē dokeru tīklam tika piešķirts cits apakštīkls: 172.18.0.0/16 . Tas to izskaidro!

Turklāt mēs varam arī meklēt visas IP adreses docker-hive_defaulttīklā.

Tāpēc mums nav jāmeklē katra konteinera IP atsevišķi:

$ 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"
zīmējums

Ja nepamanījāt, mēs izmantojām jq palīdzību, lai parsētu Containerskartes objektu.

2. Docker exec izmantošana

Šajā piemērā mēs strādāsim ar 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. Docker konteinera iekšpusē

$ 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

Mēs pat varam atrast citu konteineru IP adreses, kas atrodas konteinerā tajā pašā tīklā:

Datu mezgls

# 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

Stropu 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

Stropu serveris

# 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

Satīt

Visi piemēri tika izpildīti Linux izplatīšanas Compute Engine VM. Ja tos izpildāt macOS vai Windows vidēs, komandu paraugi var nedaudz mainīties.

Paturiet prātā arī to, ka šīs IP adreses sniegtajos piemēros ir docker-hive_defaulttīkla iekšējās . Tātad, ja jums ir izmantošanas gadījums, lai ārēji izveidotu savienojumu ar šiem konteineriem, jums būs jāizmanto resursdatora ārējais IP (pieņemot, ka konteineru porti tiek pakļauti pareizi).

Vai arī, ja Docker konteineru pārvaldībai izmantojat, piemēram, kubernetes, ļaujiet tai apstrādāt jūsu IP adreses kubernetes-expose-external-ip-address?

* Murata Kalkavana ilustrācijas no icons8.com.