English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
前面我们实现了通过网络端口来访问运行在 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 تلقائيًا بتسميته. بالإضافة إلى ذلك، يمكننا أيضًا استخدام --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، وسنقوم بتقديمها لاحقًا.
يمكننا إضافة ما يلي إلى ملف /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 للقفص.