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 bridge
há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 bridge
há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 web
kommuniká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 bridge
hálózat fel van tüntetve a host
és a mellett none
. A másik kettőt figyelmen kívül hagyjuk, és a bridge
há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.

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.yml
fá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.

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_default
há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"

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.