English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

ربط قفص Docker

前面我们实现了通过网络端口来访问运行在 docker 容器内的服务。

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。

下面我们来实现通过端口连接到一个 docker 容器。

网络端口映射

我们创建了一个 python 应用的容器。

w3codebox@w3codebox:~$ docker run -d -P training/webapp python app.py
fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d

另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。

我们使用 -P 参数创建一个容器,使用 docker ps 可以看到容器端口 5000 绑定主机端口 32768。

w3codebox@w3codebox:~$ docker ps
CONTAINER ID    IMAGE               COMMAND            ...           PORTS                     NAMES
fce072cc88ce    training/webapp     "python app.py"    ...     0.0.0.0:32768->5000/tcp   grave_hopper

我们也可以使用 -p 标识来指定容器端口绑定到主机端口。

两种方式的区别是:

  • -P :是容器内部端口随机映射到主机的高端口。

  • -p : 是容器内部端口绑定到指定的主机端口。

w3codebox@w3codebox:~$ docker run -d -p 5000:5000 training/webapp python app.py
33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0
w3codebox@w3codebox:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...           PORTS                     NAMES
33e4523d30aa        training/webapp     "python app.py"   ...   0.0.0.0:5000->5000/tcp    berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...   0.0.0.0:32768->5000/tcp   grave_hopper

另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。

w3codebox@w3codebox:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c
w3codebox@w3codebox:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...     PORTS                                NAMES
95c6ceef88ca        training/webapp     "python app.py"   ...  5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp     "python app.py"   ...  0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce       training/webapp     "python app.py"   ...    0.0.0.0:32768->5000/tcp              grave_hopper

بهذا يمكننا الوصول إلى منفذ 5000 في الصندوق من خلال زيارة 127.0.0.1:5001.

في المثال أعلاه، جميعها تعتمد على绑定 منفذ TCP بشكل افتراضي، إذا كنت ترغب في绑定 منفذ UDP، يمكنك إضافة /udp

w3codebox@w3codebox:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a
w3codebox@w3codebox:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...   PORTS                                NAMES
6779686f06f6        training/webapp     "python app.py"   ...   5000/tcp, 127.0.0.1:5000->5000/udp   drunk_visvesvaraya
95c6ceef88ca        training/webapp     "python app.py"   ...    5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp     "python app.py"   ...     0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce       training/webapp     "python app.py"   ...    0.0.0.0:32768->5000/tcp              grave_hopper

docker port النص يمكننا بسرعة عرض حالة تخصيص الموانئ.

w3codebox@w3codebox:~$ docker port adorable_stonebraker 5000
127.0.0.1:5001

互联 صناديق Docker

التبديل على الموانئ ليس الطريقة الوحيدة لربط Docker بصندوق آخر.

يملك Docker نظام اتصال يسمح بربط العديد من الصناديق معًا، ومشاركة معلومات الاتصال.

يُنشأ اتصال Docker علاقة آباء وأبناء، حيث يمكن للصندوق الأب رؤية معلومات الصندوق الابن.

تسمية الصناديق

عندما نخلق صندوقًا، يقوم Docker تلقائيًا بتسميته. بالإضافة إلى ذلك، يمكننا أيضًا استخدام --name لفهم كيفية تسمية الصندوق، على سبيل المثال:

w3codebox@w3codebox:~$ docker run -d -P --name w3codebox training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441

يمكننا استخدام docker ps النص لعرض اسم الصندوق.

w3codebox@w3codebox:~$ docker ps -l
CONTAINER ID     IMAGE           COMMAND           ...    PORTS                     NAMES
43780a6eabaa     training/webapp   "python app.py"  ...     0.0.0.0:32769->5000/tcp   w3codebox

شبكة جديدة

إليك أولاً إنشاء شبكة Docker جديدة.

$ docker network create -d bridge test-net

شرح المعلمات:}

-dـ : يحدد نوع شبكة Docker، وهي bridge و overlay.

نوع الشبكة overlay يستخدم في نموذج Swarm، يمكنك تجاهله في هذا الفصل.

اتصال الصناديق

شغّل صنديقًا وإدراجه في شبكة test-net الجديدة:

$	ext{docker} 	ext{run} 	ext{-itd} 	ext{--name} 	ext{test1} 	ext{--network} 	ext{test-net} 	ext{ubuntu} /bin/bash

افتح نافذة جديدة، ثم قم بتشغيل صنديق آخر وإضافته إلى شبكة test-net:

$	ext{docker} 	ext{run} 	ext{-itd} 	ext{--name} 	ext{test2} 	ext{--network} 	ext{test-net} 	ext{ubuntu} /bin/bash

انقر على الصورة لرؤية الصورة الكبيرة:

سنستخدم ping لاثبات أن صنديق test1 و test2 قاما بإنشاء علاقة تواصل.

إذا لم يكن الأمر ping موجودًا في صنديق test1 و test2، يمكنك تنفيذ الأمر التالي في الصندوق لتركيب ping (استخدام سريع: يمكنك تثبيت الأمر في صنديق واحد، ثم إرسال الصندوق إلى صورة، وإعادة تشغيل الصناديق باستخدام هذه الصورة الجديدة).

apt-get 	ext{update}
apt 	ext{install} 	ext{iputils-ping}

في صنديق test1، اكتب الأمر التالي:

انقر على الصورة لرؤية الصورة الكبيرة:

بالمثل، سيتم اتصال صنديق test2 بنجاح إلى:

انقر على الصورة لرؤية الصورة الكبيرة:

بهذا، قام صنديق test1 و test2 بإنشاء علاقة تواصل.

إذا كنت بحاجة إلى توصيل عدة صناديق ببعضها البعض، نوصي باستخدام Docker Compose، وسنقوم بتقديمها لاحقًا.

تكوين DNS

يمكننا إضافة ما يلي إلى ملف /etc/docker/daemon.json على المستضيف لضبط DNS لجميع الصناديق:

{
  "dns": [

    "114.114.114.114",
    "8.8.8.8"
  ]
}

بعد تكوينه، سيتم تكوين DNS للصندوق تلقائيًا إلى 114.114.114.114 و 8.8.8.8.

بعد تكوينه، يجب إعادة تشغيل Docker لتطبيق التغييرات.

للتحقق من أن DNS للصندوق يعمل بشكل صحيح يمكنك استخدام الأمر التالي، وهو سيعرض معلومات DNS للصندوق:

$	ext{docker} 	ext{run} 	ext{-it} 	ext{--rm} 	ext{ubuntu} 	ext{cat} 	ext{etc/resolv.conf}

انقر على الصورة لرؤية الصورة الكبيرة:

تعيين إعدادات الصندوق يدويًا

إذا كنت تريد فقط تعيين DNS للصندوق المحدد، يمكنك استخدام الأمر التالي:

$	ext{docker} 	ext{run} 	ext{-it} 	ext{--rm} 	ext{-h} 	ext{host_ubuntu} 	ext{--dns=114.114.114.114} 	ext{--dns-search=test.com} 	ext{ubuntu}

شرح المعلمات:}

--rmـ: تنظيف نظام الملفات الداخلي للقفص تلقائيًا عند مغادرة القفص.

-h HOSTNAME أو --hostname=HOSTNAMEـ: تحديد اسم المضيف للقفص،سيتم كتابته في /etc/hostname و /etc/hosts داخل القفص.

--dns=IP_ADDRESSـ: إضافة خادم DNS إلى ملف /etc/resolv.conf للقفص،لجعل القفص يستخدم هذا الخادم لتحليل جميع الأسماء المضيفة التي ليست في ملف /etc/hosts.

--dns-search=DOMAINـ: تحديد مجال البحث للقفص،عند تحديد مجال البحث كـ .example.com،عند البحث عن اسم مضيف مثل host،ستقوم DNS ببحث ليس فقط عن host،بل أيضًا عن host.example.com.

انقر على الصورة لرؤية الصورة الكبيرة:

إذا لم يتم تحديد --dns و --dns-search،سيستخدم Docker بشكل افتراضي ملف /etc/resolv.conf على المضيف لضبط DNS للقفص.