كيفية الحصول على عنوان IP لحاوية Docker - موضح بأمثلة

يوفر Docker القدرة على حزم وتشغيل تطبيق في بيئة معزولة بشكل فضفاض تسمى الحاوية.

أعلم ما قد تفكر فيه - هيا ، ليس أي منشور آخر يشرح ماهية Docker ، إنه موجود في كل مكان هذه الأيام!

لكن لا تقلق ، فنحن نتخطى هذه المقدمة الأساسية. يجب أن يكون لدى الجمهور المستهدف لهذه المقالة بالفعل فهم أساسي لماهية Docker and Containers.

ولكن هل تساءلت يومًا عن كيفية الحصول على عنوان IP لـ Docker Container IP؟

وأوضح شبكة عامل ميناء

أولاً ، دعنا نفهم كيف تعمل شبكة Docker. لذلك سنركز على bridgeالشبكة الافتراضية . عندما تستخدم Docker ، إذا لم تحدد برنامج تشغيل ، فهذا هو نوع الشبكة التي تستخدمها.

على 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 تتصل بها. ويتم إنشاء كل شبكة بقناع شبكة فرعية افتراضي ، واستخدامها كمجموعة لاحقة للتخلي عن عناوين 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: 

من Docker-hive 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-hive، فإن هذا يفسر الشبكة الجديدة.

تالي بعض الأمثلة حول كيفية الحصول على Docker IP Address.

كيفية الحصول على عنوان IP لحاوية Docker - أمثلة

والآن بعد أن حظيت باهتمامكم ، سنكشف النقاب عن اللغز.

رسم

1. استخدام Docker Inspect

يعد فحص Docker طريقة رائعة لاسترداد معلومات منخفضة المستوى عن كائنات Docker. يمكنك انتقاء أي حقل من JSON المرتجع بطريقة مباشرة إلى حد ما.

فهل نستخدمه للحصول على عنوان IP من dockerhive_datanode؟

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

Didn't you say that Docker uses the default 172.17. 0.0/16 subnet for container networking? Why is the returned IP Address: 172.18.0.5  outside it?

To answer that we have to look at our network settings:

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

We executed this example in a Compute Engine VM, and in this test, the docker network was assigned a different subnet: 172.18.0.0/16. That explains it!

Furthermore, we can also lookup all IP Addresses inside the docker-hive_default network.

So we don't need to look up each Container's IP individually:

$ 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"
رسم

If you didn't notice, we used jq help to parse the Containers map object.

2. Using Docker exec

In the following example we will work with the 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. Inside the 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

خلية مستستور

# 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

يتم إحتوائه

تم تنفيذ جميع الأمثلة في توزيع لينكس Compute Engine VM. إذا قمت بتنفيذها في بيئات macOS أو Windows ، فقد تتغير أوامر العينة قليلاً.

ضع في اعتبارك أيضًا أن عناوين IP هذه في الأمثلة المقدمة داخلية في عينة docker-hive_defaultالشبكة. لذلك إذا كانت لديك حالة استخدام للاتصال بتلك الحاويات خارجيًا ، فستحتاج إلى استخدام عنوان IP الخارجي للجهاز المضيف (على افتراض أنك تعرض منافذ الحاويات بشكل صحيح).

أو إذا كنت تستخدم kubernetes ، على سبيل المثال ، لإدارة حاويات Docker الخاصة بك ، فدعها تتعامل مع عناوين IP نيابة عنك kubernetes-expose-external-ip-address؟

* الرسوم التوضيحية من موقع icons8.com من قبل مراد كالكافان.