כיצד להשיג כתובת IP של מיכל דוקר - מוסבר בדוגמאות

Docker מספק את האפשרות לארוז ולהריץ יישום בסביבה מבודדת באופן רופף המכונה מיכל.

אני יודע מה אתה חושב - יאללה, לא עוד פוסט שמסביר מה זה דוקר, זה נמצא בכל מקום בימינו!

אבל אל דאגה, אנחנו מדלגים על ההקדמה הבסיסית הזו. לקהל היעד של מאמר זה כבר צריכה להיות הבנה בסיסית של מה הם Docker ומכולות.

אך האם תהיתם פעם כיצד להשיג כתובת IP של Docker Container?

הסבירו רשת דוקר

ראשית, בואו נבין כיצד פועלת רשת דוקר. לשם כך אנו מתמקדים 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 של מיכל דוקר

כברירת מחדל, למיכל מוקצית כתובת IP לכל רשת Docker אליה הוא מתחבר. וכל רשת נוצרת עם מסיכת רשת המשמשת כברירת מחדל, ומשמשת אותה כמאגר מאוחר יותר כדי לתת את כתובות ה- IP.

בדרך כלל Docker משתמש בברירת המחדל 172.17. רשת משנה 0.0 / 16 לרשת מכולות.

עכשיו כדי להבין את זה טוב יותר, נבצע מקרה שימוש אמיתי.

צִיוּר

דוגמה לדוקר

כדי להמחיש זאת, נשתמש בסביבת Hive ו- Hadoop, המכילה 5 מיכלי Docker.

בדוק את 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 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!

כברירת מחדל דוקר compose מגדיר רשת אחת עבור האפליקציה שלך. ולרשת האפליקציה שלך ניתן שם המבוסס על "שם הפרוייקט", שמקורו בשם הספרייה בה היא מתגוררת.

אז מכיוון שהספריה שלנו נקראת docker-hive, זה מסביר את הרשת החדשה.

הבא כמה דוגמאות כיצד להשיג את כתובת ה- IP של Docker.

כיצד להשיג כתובת IP של מיכל דוקר - דוגמאות

ועכשיו כשיש לי את תשומת לבכם, אנו הולכים לחשוף את התעלומה.

צִיוּר

1. שימוש ב- Docker Inspect

בדיקת Docker היא דרך נהדרת לאחזר מידע ברמה נמוכה על אובייקטים של 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

ביצענו דוגמה זו ב- VM Compute Engine, ובבדיקה זו הוקצתה לרשת העגינה רשת משנה אחרת: 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 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

כוורת מסטסטור

# 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

לעטוף

כל הדוגמאות בוצעו ב- VM של הפצת לינוקס ב- Linux. אם אתה מבצע אותם בסביבות MacOS או Windows, פקודות הדוגמה עשויות להשתנות מעט.

זכור גם שכתובות ה- IP הללו בדוגמאות המובאות הן פנימיות docker-hive_defaultלרשת לדוגמה . אז אם יש לך מקרה שימוש להתחבר למכולות אלה באופן חיצוני, יהיה עליך להשתמש ב- IP החיצוני של המחשב המארח (בהנחה שאתה חושף את יציאות המכולות כהלכה).

או אם אתה משתמש ב- kubernetes, למשל, כדי לנהל את מכולות ה- Docker שלך, תן לו לטפל בכתובות ה- IP עבורך kubernetes-expose-external-ip-address?

* איורים מ- icons8.com מאת מוראט קלקבן.