Hogyan szerezhetünk Docker Container IP-címet - példákkal elmagyarázva

A Docker lehetővé teszi az alkalmazások csomagolását és futtatását egy lazán elkülönített környezetben, úgynevezett tárolóban.

Tudom, mire gondolhat - gyerünk, ne egy másik bejegyzés, amely elmagyarázza, mi a Docker, manapság mindenhol ott van!

De ne aggódj, ezt az alapvető bevezetést kihagyjuk. A cikk célközönségének már alapvető ismeretekkel kell rendelkeznie arról, hogy mi is a Docker és a Containers.

De elgondolkodott már azon, hogyan lehet beszerezni egy Docker Container IP címet?

A Docker hálózat elmagyarázta

Először értsük meg, hogyan működik a Docker hálózat. Ehhez az alapértelmezett bridgehálózatra fogunk összpontosítani . A Docker használatakor, ha nem ad meg illesztőprogramot, akkor ezt a típusú hálózatot használja.

A bridgehálózat a hoszton belül belső magánhálózatként működik, így a rajta lévő tárolók kommunikálni tudnak. Külső hozzáférést biztosít a kikötők konténereknek való kitétele.

A hídhálózatokat akkor használják, ha az alkalmazásai önálló tárolókban futnak, amelyeknek kommunikálniuk kell.

A fenti képen, dbés webkommunikálni tudnak egymással a felhasználó által létrehozott hídhálózat nevű mybridge.

Ha még soha nem adott hozzá hálózatot a Docker programban, akkor ehhez hasonlót kell látnia:

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

Az alapértelmezett bridgehálózat fel van tüntetve a hostés a mellett none. A másik kettőt figyelmen kívül hagyjuk, és a bridgehálózatot használjuk, amikor a példákhoz jutunk.

Docker Container IP-cím

Alapértelmezés szerint a tárolóhoz IP-címet rendelnek minden egyes Docker-hálózathoz, amelyhez csatlakozik. És minden hálózatot egy alapértelmezett alhálózati maszkkal hoznak létre, amelyet később poolként használnak az IP-címek eladására.

A Docker általában az alapértelmezett 172.17-et használja . 0,0 / 16 alhálózat a konténerhálózatokhoz.

Most, hogy jobban megértsük, végrehajtunk egy valós felhasználási esetet.

rajz

Docker példa

Ennek szemléltetésére Hive és Hadoop környezetet fogunk használni, amely 5 Docker konténert tartalmaz.

Nézze meg a végrehajtandó docker-compose.ymlfájlt:

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: 

A dokkoló-kaptárból a GitHub

Senki sem akar HATALMAS konfigurációs fájlt olvasni , igaz? Tehát itt egy kép:

Sokkal jobb! Most indítsuk el ezeket a konténereket:

docker-compose up -d 

5 konténert láthatunk:

$ 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

Ezután ellenőrizzük Docker hálózatunkat:

$ 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

Várjon egy percet ... van egy új hálózat docker-hive_default!

Alapértelmezés szerint a Docker Compose egyetlen hálózatot hoz létre az alkalmazásához. Az alkalmazás hálózata pedig a „projekt neve” alapján kap egy nevet, amely annak a könyvtárnak a nevéből származik, amelyben él.

Tehát mivel a könyvtárunk neve van docker-hive, ez magyarázza az új hálózatot.

Ezután néhány példa a Docker IP-cím megszerzésére.

Docker Container IP-cím beszerzése - példák

És most, amikor felhívtam a figyelmét, leleplezzük a rejtélyt.

rajz

1. A Docker Inspect használata

A Docker inspect nagyszerű módja a Docker objektumok alacsony szintű információinak lekérésére. Bármely mezőt kiválaszthatja a visszaküldött JSON-ból meglehetősen egyszerű módon.

Tehát azt kell használni, hogy megkapjuk az IP-címet a dockerhive_datanode?

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

Nem azt mondta, hogy a Docker az alapértelmezett 172.17-et használja . 0,0 / 16 alhálózat a konténerhálózatokhoz? Miért van a visszaküldött IP-cím: 172.18.0.5 rajta  kívül?

Annak megválaszolásához, hogy meg kell néznünk a hálózati beállításokat:

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

Ezt a példát egy Compute Engine virtuális gépen hajtottuk végre, és ebben a tesztben a dokkoló hálózathoz egy másik alhálózatot rendeltünk : 172.18.0.0/16 . Ez megmagyarázza!

Ezenkívül megkereshetjük az összes IP-címet a docker-hive_defaulthálózaton belül is .

Tehát nem kell külön-külön megkeresni az egyes konténerek IP-címeit:

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

Ha nem vetted észre, a jq segítséget használtuk a térképobjektum elemzéséhez Containers.

2. A Docker exec használata

A következő példában a 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. A Docker konténer belsejében

$ 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

Megtalálhatunk más tárolók IP-címeit is, amelyek ugyanabban a hálózatban találhatók egy tárolóban:

Adatcsomópont

# 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 szerver

# 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

Tekerje be

Minden példát egy linux disztribúció Compute Engine VM-ben hajtottunk végre. Ha macOS vagy Windows környezetben hajtja végre őket, a minta parancsok kissé megváltozhatnak.

Ne feledje azt is, hogy a megadott példákban szereplő IP-címek a mintahálózaton belül vannak docker-hive_default. Tehát ha van olyan felhasználási esete, amellyel kívülről csatlakozhat ezekhez a tárolókhoz, akkor a gazdagép külső IP-jét kell használnia (feltételezve, hogy a tárolóportokat helyesen teszi ki).

Vagy ha például kubernetéket használ a Docker-tárolók kezeléséhez, hagyja, hogy az kezelje az Ön IP-címeit a kubernetes-expose-external-ip-cím?

* Illusztrációk az icons8.com oldalról, Murat Kalkavan.