Τρόπος λήψης μιας διεύθυνσης IP κοντέινερ Docker - Εξηγείται με παραδείγματα

Το Docker παρέχει τη δυνατότητα συσκευασίας και εκτέλεσης μιας εφαρμογής σε ένα χαλαρά απομονωμένο περιβάλλον που ονομάζεται κοντέινερ.

Ξέρω τι σκέφτεστε - έλα, όχι άλλη ανάρτηση που εξηγεί τι είναι το Docker, είναι παντού αυτές τις μέρες!

Αλλά μην ανησυχείτε, παραλείπουμε αυτήν τη βασική εισαγωγή. Το κοινό-στόχος για αυτό το άρθρο θα πρέπει να έχει ήδη μια βασική κατανόηση του τι είναι το Docker και τα Containers.

Αλλά αναρωτηθήκατε ποτέ πώς να αποκτήσετε μια διεύθυνση IP του Docker Container;

Το δίκτυο Docker εξήγησε

Αρχικά, ας καταλάβουμε πώς λειτουργεί το δίκτυο Docker. Για αυτό θα επικεντρωθούμε στο προεπιλεγμένο bridgeδίκτυο. Όταν χρησιμοποιείτε το Docker, εάν δεν καθορίσετε πρόγραμμα οδήγησης, αυτός είναι ο τύπος δικτύου που χρησιμοποιείτε.

Το bridgeδίκτυο λειτουργεί ως ιδιωτικό δίκτυο εσωτερικό του κεντρικού υπολογιστή, ώστε τα κοντέινερ σε αυτό να μπορούν να επικοινωνούν. Η εξωτερική πρόσβαση παρέχεται εκθέτοντας θύρες σε κοντέινερ.

Τα δίκτυα Bridge χρησιμοποιούνται όταν οι εφαρμογές σας εκτελούνται σε αυτόνομα κιβώτια που πρέπει να επικοινωνούν.

Στην παραπάνω εικόνα dbκαι webμπορεί να επικοινωνήσει ο ένας με τον άλλον σε ένα δίκτυο γεφυρών που έχει δημιουργηθεί από τον χρήστη mybridge.

Εάν δεν έχετε προσθέσει ποτέ δίκτυο στο Docker, θα πρέπει να δείτε κάτι παρόμοιο με αυτό:

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

Εμφανίζεται το προεπιλεγμένο bridgeδίκτυο, μαζί με hostκαι none. Θα αγνοήσουμε τα άλλα δύο και θα χρησιμοποιήσουμε το bridgeδίκτυο όταν φτάσουμε στα παραδείγματα.

Διεύθυνση IP κοντέινερ Docker

Από προεπιλογή, στο κοντέινερ εκχωρείται μια διεύθυνση IP για κάθε δίκτυο Docker στο οποίο συνδέεται. Και κάθε δίκτυο δημιουργείται με μια προεπιλεγμένη μάσκα υποδικτύου, χρησιμοποιώντας το ως pool αργότερα για να δώσει τις διευθύνσεις IP.

Συνήθως το Docker χρησιμοποιεί το προεπιλεγμένο 172.17. 0,0 / 16 υποδίκτυο για δικτύωση κοντέινερ.

Τώρα για να το κατανοήσουμε καλύτερα, θα εκτελέσουμε μια πραγματική περίπτωση χρήσης.

σχέδιο

Παράδειγμα Docker

Για να το δείξουμε αυτό, θα χρησιμοποιήσουμε ένα περιβάλλον Hive και Hadoop, που περιέχει 5 Docker Containers.

Δείτε το docker-compose.ymlαρχείο που πρόκειται να εκτελέσουμε:

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: 

Από το λιμενικό GitHub

Κανείς δεν θέλει να διαβάσει ένα τεράστιο αρχείο ρυθμίσεων, σωστά; Ακολουθεί μια εικόνα:

Πολύ καλύτερα! Τώρα ας ξεκινήσουμε αυτά τα κοντέινερ:

docker-compose up -d 

Μπορούμε να δούμε 5 κοντέινερ:

$ 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

Στη συνέχεια ας δούμε τα δίκτυα Docker:

$ 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

Περιμένετε ένα λεπτό ... υπάρχει ένα νέο δίκτυο που ονομάζεται docker-hive_default!

Από προεπιλογή, το docker compose δημιουργεί ένα μόνο δίκτυο για την εφαρμογή σας. Και στο δίκτυο της εφαρμογής σας δίνεται ένα όνομα με βάση το "όνομα έργου", που προέρχεται από το όνομα του καταλόγου στον οποίο ζει.

Έτσι, αφού ο κατάλογός μας ονομάζεται docker-hive, αυτό εξηγεί το νέο δίκτυο.

Στη συνέχεια μερικά παραδείγματα σχετικά με τον τρόπο λήψης της διεύθυνσης IP του Docker.

Πώς να λάβετε μια διεύθυνση IP κοντέινερ Docker - παραδείγματα

Και τώρα που έχω την προσοχή σας, θα αποκαλύψουμε το μυστήριο.

σχέδιο

1. Χρήση του Docker Inspect

Το Docker inspect είναι ένας πολύ καλός τρόπος για να ανακτήσετε πληροφορίες χαμηλού επιπέδου για αντικείμενα Docker. Μπορείτε να διαλέξετε οποιοδήποτε πεδίο από το JSON που επιστράφηκε με έναν αρκετά απλό τρόπο.

Θα το χρησιμοποιήσουμε λοιπόν για να λάβουμε τη διεύθυνση IP από το dockerhive_datanode;

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

Δεν είπατε ότι το Docker χρησιμοποιεί το προεπιλεγμένο 172.17. 0,0 / 16 υποδίκτυο για δικτύωση κοντέινερ; Γιατί βρίσκεται εκτός της διεύθυνσης IP: 172.18.0.5  ;

Για να απαντήσουμε ότι πρέπει να κοιτάξουμε τις ρυθμίσεις δικτύου μας:

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

Εκτελέσαμε αυτό το παράδειγμα σε ένα Compute Engine VM, και σε αυτήν τη δοκιμή, στο δίκτυο docker εκχωρήθηκε ένα διαφορετικό υποδίκτυο: 172.18.0.0/16 . Αυτό το εξηγεί!

Επιπλέον, μπορούμε επίσης να αναζητήσουμε όλες τις διευθύνσεις IP εντός του docker-hive_defaultδικτύου.

Επομένως, δεν χρειάζεται να αναζητούμε ξεχωριστά την IP κάθε κοντέινερ:

$ 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"
σχέδιο

Εάν δεν το παρατηρήσατε, χρησιμοποιήσαμε τη βοήθεια jq για την ανάλυση του Containersαντικειμένου του χάρτη.

2. Χρήση του Docker exec

Στο παρακάτω παράδειγμα θα συνεργαστούμε με το 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 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

Μπορούμε ακόμη και να βρούμε διευθύνσεις IP άλλων κοντέινερ που βρίσκονται μέσα σε ένα κοντέινερ στο ίδιο δίκτυο:

Κόμβος δεδομένων

# 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

Κυψέλη 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

Διακομιστής κυψέλης

# 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

Τύλιξε

Όλα τα παραδείγματα εκτελέστηκαν σε μια διανομή linux Compute Engine VM. Εάν τα εκτελέσετε σε περιβάλλον macOS ή Windows, οι εντολές δείγματος ενδέχεται να αλλάξουν λίγο.

Λάβετε επίσης υπόψη ότι αυτές οι διευθύνσεις IP στα παραδείγματα που δίνονται είναι εσωτερικές στο docker-hive_defaultδίκτυο δειγμάτων . Επομένως, εάν έχετε μια θήκη χρήσης για να συνδεθείτε με αυτά τα δοχεία εξωτερικά, θα πρέπει να χρησιμοποιήσετε την εξωτερική IP του κεντρικού υπολογιστή (υποθέτοντας ότι εκθέτετε τις θύρες των κοντέινερ σωστά).

Ή εάν χρησιμοποιείτε, για παράδειγμα, το kubernetes, για να διαχειριστείτε τα κοντέινερ του Docker, αφήστε το να χειριστεί τις διευθύνσεις IP για εσάς kubernetes-expose-external-ip-address;

* Εικόνες από το icon8.com από τον Murat Kalkavan.