إنشاء صورة عامل الميناء. فهم عامل الميناء

08.09.2023

لقد تطرقنا للموضوع أكثر من مرة ونظرنا في العديد من الأنظمة لبناءها. سنقدم اليوم نظامًا رائعًا آخر، وهو حاويات Docker.

لنبدأ بوصف الوظيفة الأساسية التي ستكون مفيدة في مقالات أخرى في السلسلة، ونتذكر بإيجاز بنية Docker. يستخدم Docker بنية خادم العميل ويتكون من عميل - أداة عامل الإرساء التي تصل إلى الخادم باستخدام واجهة برمجة التطبيقات المريحة، وبرنامج خفي في نظام التشغيل Linux (انظر الشكل 1). على الرغم من أن Docker يعمل على أنظمة تشغيل غير Linux، إلا أنه لم تتم تغطيته في هذه المقالة.

المكونات الرئيسية لدوكر:
    • حاويات– بيئات المستخدم التي يتم فيها تنفيذ التطبيقات، معزولة باستخدام تقنيات نظام التشغيل. أسهل طريقة لتعريف حاوية Docker هي أن تكون تطبيقًا يتم تشغيله من صورة. بالمناسبة، هذا هو بالضبط ما يميز Docker أيديولوجيًا عن LXC، على سبيل المثال ( حاويات لينكس)، على الرغم من أنهم يستخدمون نفس تقنيات Linux kernel. يتبع مطورو مشروع Docker المبدأ: حاوية واحدة تساوي تطبيقًا واحدًا.
    • الصور- قوالب التطبيقات للقراءة فقط. يمكن إضافة طبقات جديدة أعلى الصور الموجودة والتي تمثل بشكل جماعي نظام الملفات، وتعديل الطبقة السابقة أو توسيعها. عادةً، يتم إنشاء صورة جديدة إما عن طريق حفظ حاوية قيد التشغيل بالفعل في صورة جديدة فوق الصورة الموجودة، أو باستخدام تعليمات خاصة للأداة المساعدة. يمكن استخدام فصل مستويات الحاويات المختلفة على مستوى نظام الملفات AUFS وbtrfs وvfs ومخطط الأجهزة. إذا كنت تخطط لاستخدام Docker بالتزامن مع SELinux، ثم هو مطلوب مخطط الجهاز.
    • السجلاتتحتوي على مستودعات ( مخزن) الصور، - تخزين الصور على الشبكة. يمكن أن تكون خاصة أو عامة. التسجيل الأكثر شهرة هو .

لعزل الحاويات في أنظمة تشغيل GNU/Linux، يتم استخدام تقنيات Linux kernel القياسية، مثل:
  • مساحات الأسماء ( مساحات أسماء لينكس).
  • مجموعات التحكم ( مجموعات C).
  • أدوات إدارة الامتيازات ( قدرات لينكس).
  • أنظمة أمنية إضافية وإلزامية، مثل AppArmor أو SELinux.

دعونا نلقي نظرة على التقنيات المدرجة بمزيد من التفاصيل.

آلية مجموعة التحكم (مجموعات C)يوفر أداة للتحكم الدقيق في تخصيص موارد النظام وتحديد أولوياتها وإدارتها. يتم تنفيذ مجموعات التحكم في Linux kernel. في التوزيعات الحديثة، تتم إدارة مجموعات المراقبة من خلال systemdومع ذلك، يبقى من الممكن التحكم باستخدام المكتبة libcgroupوالمرافق com.cgconfig. التسلسلات الهرمية الرئيسية لمجموعات cgroup (وتسمى أيضًا وحدات التحكم) مدرجة أدناه:

  • blkio- يضع حدودًا لعمليات الإدخال/الإخراج والوصول إلى الأجهزة المحظورة؛
  • وحدة المعالجة المركزية- باستخدام برنامج جدولة العمليات، يوزع وقت المعالج بين المهام؛
  • com.cpuacct– إنشاء تقارير تلقائية عن استخدام موارد وحدة المعالجة المركزية. يعمل جنبا إلى جنب مع وحدة تحكم وحدة المعالجة المركزية، موصوف بالاعلى؛
  • com.cpuset- يعين معالجات وعقد ذاكرة محددة للمهام؛
  • الأجهزة- ينظم وصول المهام إلى أجهزة معينة؛
  • الفريزر- إيقاف المهام مؤقتًا أو استئنافها؛
  • ذاكرة- يضع حدودًا وينشئ تقارير عن استخدام الذاكرة من خلال مهام مجموعة التحكم؛
  • net_cls- وضع علامات على حزم الشبكة بمعرف فئة ( أنيق). وهذا يسمح لوحدة التحكم في حركة المرور ( فريق ح) وجدار الحماية ( iptables) أخذ هذه العلامات في الاعتبار عند معالجة حركة المرور؛
  • perf_event- يسمح لك بمراقبة مجموعات التحكم باستخدام الأداة المساعدة الأداء.
  • com.hugtlb- يسمح لك باستخدام صفحات الذاكرة الافتراضية الكبيرة وتطبيق حدود عليها.

مساحات الأسماءوهم بدورهم لا يتحكمون في توزيع الموارد، بل في الوصول إلى هياكل بيانات النواة. في الواقع، هذا يعني عزل العمليات عن بعضها البعض والقدرة على الحصول على تسلسلات هرمية متوازية "متطابقة"، ولكن غير متقاطعة، للعمليات والمستخدمين وواجهات الشبكة. إذا رغبت في ذلك، يمكن أن يكون للخدمات المختلفة خدماتها الخاصة واجهات الاسترجاع.

أمثلة على مساحات الأسماء التي يستخدمها Docker:
  • معرف العملية (PID)، معرف العملية– عزل التسلسل الهرمي للعملية.
  • صافي، الشبكات- عزل واجهات الشبكة.
  • الكمبيوتر الشخصي، الاتصال بين العمليات– إدارة التفاعل بين العمليات.
  • إم إن تي، جبل- إدارة نقاط التثبيت.
  • UTS، نظام يونكس للمشاركة بالوقت- عزل معرفات النواة والإصدار.

آلية تسمى قدراتيسمح لك بتقسيم امتيازات المستخدم الجذر إلى مجموعات صغيرة من الامتيازات وتعيينها بشكل فردي. ظهرت هذه الوظيفة في نظام GNU/Linux بدءًا من الإصدار النواة 2.2.في البداية، يتم إطلاق الحاويات بمجموعة محدودة من الامتيازات.

باستخدام خيارات أمر docker، يمكنك تمكين أو تعطيل:
  • عمليات التركيب
  • الوصول إلى المقبس
  • إجراء بعض عمليات نظام الملفات، مثل تغيير سمات الملف أو ملكيته.

يمكنك معرفة المزيد حول الامتيازات باستخدام صفحة الدليل القدرات(7).

تثبيت عامل الميناء

دعونا نلقي نظرة على تثبيت Docker باستخدام CentOS كمثال. عند تشغيل CentOS، لديك خيار: استخدام أحدث إصدار من u com.pstreamأو الإصدار الذي تم تجميعه بواسطة مشروع CentOS مع إضافات Red Hat. وصف التغييرات متاح على الصفحة.

يعد هذا بشكل أساسي بمثابة خلفية من الإصلاحات من الإصدارات الأولية الجديدة والتغييرات المقترحة من قبل مطوري Red Hat، ولكن لم يتم اعتمادها بعد في الكود الرئيسي. كان الاختلاف الأكثر وضوحًا في وقت كتابة هذا التقرير هو أنه في الإصدارات الجديدة، تم تقسيم خدمة الإرساء إلى ثلاثة أجزاء: البرنامج الخفي عامل ميناء، حاوية ورونك. لا تعتقد شركة Red Hat حتى الآن أن هذا التغيير مستقر وتقوم بشحن الإصدار القابل للتنفيذ المتجانس 1.10.

إعدادات المستودع للتثبيت الإصدارات المنبع، بالإضافة إلى تعليمات التثبيت في التوزيعات وأنظمة التشغيل الأخرى، فهي موجودة في دليل التثبيت على الموقع الرسمي. على وجه التحديد، إعدادات مستودع CentOS 7:

# cat /etc/yum.repos.d/docker.repo name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7enable=1 gpgcheck=1 gpgkey=https://yum .dockerproject.org/gpg

# cat /etc/yum.repos.d/docker.repo

الاسم = المستودع

baseurl=https://yum.dockerproject.org/repo/main/centos/7

ممكن = 1

gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg

قم بتثبيت الحزم اللازمة وبدء الخدمة وتمكينها:

# yum install -y docker-engine # systemctl start docker.service # systemctl Enable docker.service

# yum install -y docker-engine

# بدء تشغيل systemctl docker.service

# تمكين systemctl docker.service

التحقق من حالة الخدمة:

# خدمة حالة systemctl docker.service

# خدمة حالة systemctl docker.service

يمكنك أيضًا عرض معلومات النظام حول Docker والبيئة:

# معلومات عامل الميناء

إذا قمت بتشغيل نفس الأمر إذا قمت بتثبيت Docker من مستودعات CentOS، فسترى اختلافات طفيفة بسبب استخدام إصدار أقدم من البرنامج. من الإخراج معلومات عامل الميناءيمكننا معرفة أنه يستخدم كمحرك لتخزين البيانات مخطط الجهازولتخزين - ملف في /var/lib/docker/:

# ls -lh /var/lib/docker/devicemapper/devicemapper/data -rw-------. 1 جذر الجذر 100G 27 ديسمبر الساعة 12:00 /var/lib/docker/devicemapper/devicemapper/data

# ls -lh /var/lib/docker/devicemapper/devicemapper/data

رو -- -- -- - . 1 جذر الجذر 100G 27 ديسمبر الساعة 12:00 /var/lib//devicemapper/devicemapper/data

يتم تخزين خيارات بدء تشغيل البرنامج الخفي، كما هو معتاد في CentOS /الخ/سيسكونفيغ/. في هذه الحالة، اسم الملف هو docker. الخط المقابل /etc/sysconfig/docker، مع وصف الخيارات:

الخيارات = "--selinux-enabled --log-driver=journald"

إذا كنت تريد تشغيل أمر عامل الإرساء كمستخدم غير جذر أو مستخدم ليس عضوًا في مجموعة عامل الإرساء، فسوف ترى خطأً مثل هذا:

$ عامل ميناء البحث في MySQL

$ البحث في MySQL

تحذير: فشل في الحصول على نقطة نهاية التسجيل الافتراضية من البرنامج الخفي (لا يمكن الاتصال ببرنامج Docker الخفي. هل يعمل برنامج Docker الخفي على هذا المضيف؟). باستخدام النظام الافتراضي: https://index. docker.io/v1/

لا يمكن الاتصال ببرنامج Docker الخفي. هل يعمل برنامج عامل الإرساء على هذا المضيف؟

لاحظ أن إضافة مستخدم إلى مجموعة عامل الإرساء بشكل فعال هو نفس إضافة هذا المستخدم إلى المجموعة الجذرية.

لدى مطوري RHEL/CentOS نهج مختلف قليلاً فيما يتعلق بأمان Docker daemon مقارنة بمطوري Docker الأساسيين. اقرأ المزيد عن نهج Red Hat في مقال بقلم دان والش، مطور توزيع RHEL.

إذا كنت تريد تثبيت السلوك "القياسي" لـ Docker من مستودعات CentOS (أي، كما هو موضح في الوثائق الرسمية)، فأنت بحاجة إلى إنشاء مجموعة عامل إرساء وإضافة إلى خيارات تشغيل البرنامج الخفي:

الخيارات = "--selinux-enabled --log-driver=journald ↵ --group=docker"

خيارات = "--selinux-enabled --log-driver=journald ↵ --group=docker"

ثم نعيد تشغيل الخدمة ونتأكد من أن ملف مأخذ التوصيل الخاص بعامل الإرساء ينتمي إلى مجموعة عامل الإرساء وليس إلى الجذر:

# ls -l /var/run/docker.sock

البحث عن الصور وعلامات Docker

دعونا نحاول العثور على حاوية على Docker Hub.

$ عامل ميناء البحث haproxy

$بحث هابروكسي


في هذا الإخراج، تلقينا قائمة بعدد من صور HA Proxy. العنصر الأعلى في القائمة هو HA Proxy من المستودع الرسمي. وتختلف هذه الصور في أن الاسم لا يحتوي على الرمز «/» ، مع فصل اسم مستودع المستخدم عن اسم الحاوية نفسها. يوضح المثال الرسمي صورتين haproxy من مستودعات المستخدم العامة eeacms ومليون12.

يمكنك إنشاء صور مثل الصورتين أدناه بنفسك من خلال التسجيل في Docker Hub. يتم دعم الجهات الرسمية من قبل فريق خاص برعاية شركة Docker, Inc. مميزات المستودع الرسمي:

  • هذه صور موصى بها للاستخدام، بناءً على أفضل الممارسات والإرشادات.
  • أنها توفر الصور الأساسية التي يمكن أن تكون بمثابة نقطة انطلاق لمزيد من الضبط الدقيق. على سبيل المثال، الصور الأساسية لـ Ubuntu أو CentOS أو المكتبات وبيئات التطوير.
  • يحتوي على أحدث إصدارات البرامج مع إصلاح الثغرات الأمنية.
  • هذه هي القناة الرسمية لتوزيع المنتجات. للبحث عن الصور الرسمية فقط، يمكنك استخدام الخيار – عامل التصفية “is-official=true”فرق بحث عامل الميناء.

عدد النجوم في إخراج الأمر بحث عامل الميناءيتوافق مع شعبية الصورة. وهذا مشابه للزر يحبعلى الشبكات الاجتماعية أو الإشارات المرجعية للمستخدمين الآخرين. الآلييعني أن الصورة يتم إنشاؤها تلقائيًا من برنامج نصي خاص باستخدام Docker Hub. عادةً، يجب عليك إعطاء الأفضلية للصور المجمعة تلقائيًا نظرًا لحقيقة أنه يمكن التحقق من محتوياتها من خلال التعرف على ملفات .

قم بتنزيل صورة وكيل HA الرسمية:

$ docker pull haproxy باستخدام العلامة الافتراضية: الأحدث

قد يبدو اسم الصورة الكامل كما يلي:

[اسم المستخدم]اسم الصورة[:العلامة]

يمكنك عرض قائمة الصور التي تم تنزيلها باستخدام الأمر صور عامل الميناء:

تشغيل الحاويات

لتشغيل حاوية، ليس من الضروري تنزيل الصورة أولاً. إذا كان متاحًا، فسيتم تنزيله تلقائيًا. دعنا نحاول تشغيل حاوية باستخدام Ubuntu. لن نحدد مستودعًا وسنقوم بتنزيل أحدث صورة رسمية تدعمها Canonical.

تشغيل عامل الإرساء $ -it ubuntu root@d7402d1f7c54:/#

تشغيل $ - أوبونتو

الجذر @d7402d1f7c54 : / #

الى جانب الفريق يجري، حددنا خيارين: -أنا- يجب أن تبدأ الحاوية في الوضع التفاعلي و - يجب تخصيص محطة زائفة. كما ترون من الإخراج، لدينا امتيازات الجذر في الحاوية، ويتم عرض معرف الحاوية كاسم المضيف. قد لا يكون هذا الأخير صحيحًا بالنسبة لجميع الحاويات ويعتمد على مطور الحاوية. دعونا نتحقق من أن هذه بيئة Ubuntu بالفعل:

root@d7402d1f7c54:/# cat /etc/*release | grep DISTRIB_DESCRIPTION DISTRIB_DESCRIPTION="أوبونتو 16.04.1 LTS"

الجذر @d7402d1f7c54 : / # القط / الخ / * الإصدار | grep DISTRIB_DESCRIPTION

DISTRIB_DESCRIPTION = "أوبونتو 16.04.1 LTS"

أمر uname ولا يمكن استخدامه لمثل هذه الأغراض، لأن الحاوية تعمل مع النواة المضيفة.

يتمثل أحد الخيارات في تحديد اسم حاوية فريد يمكن الرجوع إليه للراحة، بالإضافة إلى ذلك معرف الحاويةيتم تقديمه على النحو -اسم<имя>. إذا تم حذف الخيار، فسيتم إنشاء الاسم تلقائيًا.

لا تحمل أسماء الحاويات التي يتم إنشاؤها تلقائيًا أي حمل دلالي، ومع ذلك، كحقيقة مثيرة للاهتمام، يمكن الإشارة إلى أن الأسماء يتم إنشاؤها بشكل عشوائي من صفة واسم عالم مشهور أو مخترع أو متسلل. في رمز المولد الخاص بكل اسم، يمكنك العثور على وصف موجز لما يُعرف به الشكل المحدد.

يمكنك عرض قائمة الحاويات قيد التشغيل باستخدام الأمر. للقيام بذلك، افتح المحطة الثانية:

ومع ذلك، إذا أصدرنا الأمر، فلن نجد الحاوية التي تم إنشاؤها من صورة mysql. دعونا نستخدم الخيار ، والذي يعرض جميع الحاويات، وليس فقط الحاويات العاملة:

من الواضح أنه لم يتم تحديد المعلمات المطلوبة عند بدء تشغيل الحاوية. للحصول على وصف لمتغيرات البيئة المطلوبة لتشغيل الحاوية، يمكنك العثور على صورة MySQL الرسمية على Docker Hub. دعونا نحاول مرة أخرى باستخدام الخيار ، الذي يقوم بتعيين متغيرات البيئة في الحاوية:

تشغيل عامل الإرساء $ --name mysql-test ↵ -e MYSQL_ROOT_PASSWORD=docker -d mysql

المعلمة الأخيرة هي الأمر الذي نريد تنفيذه داخل الحاوية. في هذه الحالة هو مترجم الأوامر سحق. خيارات -هو - هيمشابهة في الغرض لتلك المستخدمة سابقًا في الأمر com.dockerrun.

في الواقع، بعد تشغيل هذا الأمر في الحاوية اختبار الخليةتتم إضافة عملية أخرى - سحق. يمكن رؤية ذلك بوضوح باستخدام الأمر pstree. تقصير الإخراج إلى الأمر تنفيذي عامل ميناء:

الحقيقة هي أن Docker هي حقًا أداة ضرورية للمطور والمسؤول عن أي مشروع كبير. ولكن حتى لو لم يكن الأمر كذلك، فلا تزال بحاجة إلى معرفة Docker: في المستقبل القريب جدًا، سيكون موجودًا في كل مكان، بدءًا من توزيع Linux لسطح المكتب وحتى مجموعة الخوادم على AWS. وأفضل ما في الأمر هو أن فهم Docker أمر سهل للغاية، إذا كنت بالطبع تفهم مبدأ عمله بشكل صحيح.

Apt-get في عالم البيئات الافتراضية

يعتمد Docker على مساحات الأسماء وتقنيات مجموعات التحكم (الأولى توفر العزل، والثانية توفر تجميع العمليات وتقييد الموارد)، لذلك من حيث المحاكاة الافتراضية، فهي لا تختلف كثيرًا عن LXC/OpenVZ التي اعتدنا عليها، ولا يوجد الكثير مما يمكننا تقديمه الحديث عن هنا. نفس السرعة الأصلية، ونفس طرق العزل المستندة إلى آليات Linux kernel. ومع ذلك، على مستوى أعلى، تبدأ قصة مختلفة تمامًا. إن أهم ما يميز Docker هو أنه يسمح لك بنشر بيئة افتراضية كاملة وتشغيل تطبيق فيها بنفس سهولة إعادة تشغيل خادم الويب على سبيل المثال.

دعنا نلخص تفاصيل توزيعات محددة ونتخيل أن لدينا CentOS خالصًا ونريد تشغيل أمر معين فيه في بيئة افتراضية تمامًا دون الوصول إلى النظام الرئيسي. هل سيتعين عليك تنزيل صور التوزيع ونشرها على النظام وإعداد بيئة افتراضية؟ لا على الإطلاق، كل ما عليك فعله هو تشغيل أمرين:

$ sudo yum install docker-io $ sudo docker run -t ubuntu:latest /usr/bin/top

وهذا كل شيء. لقد أطلقنا للتو الأداة المساعدة العليا داخل حاوية ذات بيئة تعتمد على أحدث إصدار متوفر حاليًا من Ubuntu، لإخراج المعلومات إلى الوحدة الطرفية الحالية. وكل هذا بأمر واحد بسيط (لا يحتسب التثبيت). ليس سيئا، أليس كذلك؟ بشكل عام، يمكننا أيضًا "الدخول" إلى هذه الحاوية والقيام بكل ما يتم إجراؤه عادةً باستخدام نظام مثبت حديثًا:

$ sudo docker run -t -i ubuntu:latest /bin/bash # apt-get update # apt-get install nginx #

كما ترون، كل شيء على ما يرام مع الشبكة، حتى نتمكن من تحديث النظام وتثبيت وتكوين أي برنامج. يبدو الأمر مثل السحر قليلاً، لكنه في الواقع بسيط جدًا. يعد Docker نوعًا من apt-get في عالم الحاويات، ولكن بدلاً من الحزم توجد صور لنظام الملفات، وبدلاً من مستودعات Debian/Ubuntu الرسمية، يوجد مخزن سحابي يسمى Docker Hub.

عندما قمنا بتنفيذ "تشغيل عامل الإرساء..." قام النظام بما يلي:

  1. اتصلت أداة عامل الإرساء ببرنامج dockerd الخفي على أجهزتنا المحلية، وألقت التحية منا وطلبت منا تشغيل أحدث إصدار من Ubuntu (يشار إلى ذلك بأحدث علامة في الأمر) في حاوية معزولة.
  2. قام برنامج dockerd بفحص دفتر الملاحظات الخاص به، وانتقل إلى الدليل /var/lib/docker واكتشف أنه لا توجد صورة لنظام الملفات من أحدث إصدار من Ubuntu على جهازنا، لذلك قرر الاتصال بـ Docker Hub لمعرفة ما إذا كانت هذه الصورة موجودة هناك.
  3. بعد التحدث مع Docker Hub، اقتنع بأن الصورة لا تزال موجودة وطلب إرسالها إلينا.
  4. بعد تلقي الصورة المطلوبة، قام dockerd بتثبيت نظام الملفات الخاص به، وقام بتجذيره وتشغيل الأمر المحدد في الوسيطة الأخيرة، مما أدى إلى الحد من "نطاقه" باستخدام مساحات الأسماء (في جوهره، قطع وصوله إلى FS الرئيسي، وعمليات النظام المضيف، وIPC، إلخ، وقفله في وضع الحماية)، ولكن تم نقل ملفات الجهاز الخاصة بالمحطة الحالية إليه (العلامة -t) حتى يتمكن الجزء العلوي من رسم واجهته الرسومية الزائفة.

أهم ما يميز هذا النموذج هو أن Docker Hub مفتوح للجميع ويمكن لأي شخص إعداد صورته الخاصة (المزيد حول ذلك لاحقًا) ونشرها للتثبيت على جهاز آخر و/أو بواسطة شخص آخر. في وقت كتابة هذا التقرير، تم نشر أكثر من 45 ألف صورة على Docker Hub لجميع المناسبات، بدءًا من صور التوزيعات "المجردة" إلى الصور ذات الخادم الذي تم تكوينه مسبقًا وتطبيقات سطح المكتب التي تعمل في بيئة Linux البسيطة.

ماذا لو أردنا تشغيل Firefox داخل بيئة افتراضية؟ لا يوجد شيء أسهل، افتح Docker Hub في المتصفح، وانقر فوق Browse & Search واكتب Firefox. ستظهر قائمة النتائج على الشاشة. دعونا نرى، يبدو أن kennethkl/firefox مناسب تمامًا. نضغط عليه ونرى معلومات حول كيفية تشغيل كل شيء. يخبرنا المؤلف بتشغيل الأمر التالي:

$ sudo docker run -d --name firefox -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix kennethkl/firefox

دعونا نحاول. نعم، في الواقع، بعد تنزيل قصير للصورة، نحصل على Firefox قياسي على الشاشة. باستخدام هذا المثال نفسه، بالمناسبة، يمكنك التعرف على أربعة خيارات مفيدة أخرى لأمر docker run:

  • -d - "يخفي" الحاوية، أي أنه ببساطة يفصل Docker عن STDOUT للبيئة الافتراضية ويسمح لها بالعمل في الخلفية؛
  • --name - اسم الحاوية التي ستستقبلها بدلاً من المعرف؛
  • -e - يسمح لك "بإعادة توجيه" متغير البيئة إلى الجهاز الظاهري؛
  • -v - يعيد توجيه الملف أو الدليل المحدد (التنسيق /file/on/host/system:/file/in/virtual أو ببساطة /file/on/host/system إذا كانت المسارات متطابقة).

في هذه الحالة، هناك حاجة إلى المتغير والملف حتى يتمكن Firefox من الوصول إلى شاشة الجهاز المحلي. هذا غير آمن تمامًا، نظرًا لأن أي عملية في الحاوية لن تكون قادرة على تشغيل أي برنامج على سطح المكتب فحسب، بل أيضًا، على سبيل المثال، اعتراض ضغطات المفاتيح أو حركات المؤشر. لكنها ستفعل على سبيل المثال.

هناك طريقة أسهل للبحث عن صور Docker باستخدام أمر docker search:

$ سودو عامل ميناء البحث nginx

معلومات

يمكن لأي مستخدم Docker تشغيل مركزه الخاص. يطلق عليه "السجل" وهو متاح على شكل صورة جاهزة. كل ما عليك فعله هو تشغيله فقط: تسجيل docker run -p 5555:5555.

يمكن الوصول إلى برنامج Docker الخفي ليس فقط باستخدام العميل، ولكن أيضًا باستخدام RESTful API، محليًا ومن جهاز بعيد. منافذ Docker القياسية هي tcp/2375 وtcp/2376.

ليس من الضروري إطلاق صورة Docker مباشرة بعد التنزيل؛ يمكنك أولاً تنزيلها على جهازك المحلي باستخدام أمر docker pull، وبعد ذلك فقط قم بتشغيل: docker pull ubuntu.

كعكة الطبقات

يتيح لك Docker جعل العمل مع البيئات الافتراضية مريحًا قدر الإمكان، مما يبسط عملية نشر البيئات وإعداد تفاعلها مع النظام المضيف (وهذا هو المثال الأخير فقط). ولكن هذا ليس تسليط الضوء الوحيد عليه.

إذا كنت قد لعبت بالفعل مع صورة Ubuntu من المثالين الأولين، فمن المحتمل أنك لاحظت أن كل بداية جديدة للحاوية تحدث "من الصفر"، ويتم فقدان جميع التغييرات التي تم إجراؤها في الجلسة السابقة. هذا ليس خطأ على الإطلاق، بل هو أحد الميزات الرئيسية لبنية Docker، مما يجعله حلاً أكثر إثارة للاهتمام وجاذبية.

الحقيقة هي أنه في الغالبية المطلقة من الحالات، فإن "صورة Docker" ليست صورة نظام ملفات متجانسة على الإطلاق، ولكنها نوع من كعكة الطبقات التي تتكون من عدة صور لنظام الملفات، والتي يتم على أساسها تشكيل الحاوية. في الوقت نفسه، لا تكون صور FS الفردية مسؤولة على الإطلاق عن أجزاء معينة من بنية الدليل (كما هو الحال، على سبيل المثال، في حالة تقسيم قرص Linux إلى أقسام /home، /var، /boot)، ولكنها تكون ذات طبقات فوق بعضها البعض باستخدام آلية AUFS kernel Linux (يوجد أيضًا دعم لنفس الوظيفة من خلال استخدام btrfs ومخطط الجهاز والتراكب).

لفهم كيفية عمل ذلك، دعنا نعود إلى نظام Ubuntu الخاص بنا. نقوم بتشغيل الحاوية وتثبيت nginx، كما هو موضح في المثال الثاني في بداية المقال، ولكن لا نكمله. بدلًا من ذلك، نقوم بتشغيل محطة طرفية أخرى وننظر إلى قائمة الحاويات قيد التشغيل:

$ سودو دوكر ملاحظة

سيُظهر هذا الأمر جميع الحاويات قيد التشغيل بالإضافة إلى المعرف والصورة المستخدمة والأمر الذي تم تشغيله ووقت التشغيل والمزيد. نحن مهتمون بالقيمة الموجودة في عمود معرف الحاوية. انسخه وقم بتشغيل الأمر التالي:

$ Sudo docker يلتزم بمعرف حاوية ubuntu-nginx

وبعد أن تنتهي من عملها يمكنك الخروج من الحاوية وبذلك تكتمل عملها. ثم نقوم ببساطة بتشغيل حاوية ubuntu-nginx ونرى أن nginx لم يختف في أي مكان وهو في مكانه:

$ sudo docker run -i -t ubuntu-nginx /bin/bash # أي nginx /usr/sbin/nginx

ماذا فعلنا؟ لقد أنشأنا طبقة أخرى، وهي صورة FS إضافية، وقمنا بإنشاء صورة Docker جديدة بناءً على صورة Ubuntu Docker الموجودة بالفعل، بما في ذلك صورة FS الخاصة بنا، والتي تحتوي على nginx. يبدو مربكا بعض الشيء، أليس كذلك؟ انها في الواقع بسيطة جدا.

لقد اكتشفنا بالفعل أن كل صورة من صور Docker تتكون من عدة صور FS. عندما نبدأ حاوية، يتم تركيب هذه الصور وتجميعها في بنية دليل واحدة باستخدام AUFS. على سبيل المثال، قد تحتوي الصورة الأولى على تثبيت Ubuntu أساسي فقط، بينما تضيف الصورة الثانية مجموعة من البرامج الشيطانية القياسية، وتضيف الصورة الثالثة أدوات مساعدة للإدارة، وما إلى ذلك. يقوم Docker بتثبيت جميع الطبقات في وضع القراءة فقط، ولكن حتى نتمكن من تغيير محتويات الصورة، يتم تثبيت طبقة فارغة أخرى في الأعلى في وضع القراءة/الكتابة.


افتراضيًا، بعد انتهاء الحاوية (والذي يحدث بعد انتهاء آخر عملية قيد التشغيل فيها)، يتم مسح الطبقة الأخيرة ويتم فقدان جميع التغييرات التي أجريناها. ومع ذلك، باستخدام أمر docker Commit، يمكننا "تنفيذ" التغييرات عن طريق إنشاء صورة Docker جديدة استنادًا إلى صور FS الموجودة بالإضافة إلى صورة FS مع تغييراتنا. بهذه الطريقة سيتم حفظ التغييرات التي أجريناها. إذا أردنا، يمكننا إطلاق حاوية ubuntu-nginx وإجراء تغييرات عليها وحفظها بنفس الطريقة في صورة Docker جديدة باستخدام الالتزام وإضافة طبقة أخرى. لعرض قائمة بجميع الصور الناتجة (والمستلمة من Docker Hub)، يمكنك استخدام أمر docker Images، ولعرض سجل تكوين الطبقات، استخدم أمر docker History:

$ تاريخ ميناء سودو ubuntu-nginx

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


عامل ميناء خارج لينكس

الطريقة الوحيدة لتشغيل Docker على OS X أو Windows هي تثبيته على جهاز افتراضي. ليس من الضروري القيام بذلك يدويًا، يمكنك استخدام حل جاهز، على سبيل المثال boot2docker. هذه مجموعة من البرامج النصية التي تتيح لك نشر جهاز افتراضي بسرعة مع Linux وDocker داخل VirtualBox وتشغيله مع الوصول التلقائي عبر SSH. يمكن العثور على تعليمات استخدامه والمثبت نفسه على موقع Docker الرسمي.

تكوين شبكة

لكي تتمكن الحاويات من التواصل مع بعضها البعض ومع العالم الخارجي، يقوم Docker تلقائيًا بإنشاء جسر شبكة افتراضية وتكوين قواعد التنكر (NAT) لواجهة الشبكة الخارجية. وهذا يعني أنه لن يكون من الممكن الوصول إلى الحاويات من الخارج. ومع ذلك، يمكننا تكوين إعادة توجيه المنفذ بحيث يتم إعادة توجيه الطلب إلى منافذ معينة على واجهة الشبكة الخارجية للجهاز تلقائيًا إلى المنافذ المحددة للحاوية. على سبيل المثال، في Mirantis، تعمل عقدة الوقود الرئيسية (هذه واجهة المستخدم الرسومية لنشر OpenStack وتكوينه) في Docker وتستخدم وظيفة إعادة توجيه المنفذ لفتح الوصول إلى حاوية ful/nginx (المنفذ 8000):

$ sudo docker run -d -p 8000:8000 Fuel/nginx_6.0:latest /usr/local/bin/start.sh

يمكننا إعادة توجيه المنفذ 8000 إلى أي منفذ حاوية آخر بمجرد تغيير الرقم الثاني في الخيار -p، ولكن في هذا التكوين لا معنى له.

إعادة توجيه الملفات وDockerfile

في بداية المقالة، تعرفنا بالفعل على العلامة -v، والتي تسمح لك بإعادة توجيه أي ملف أو دليل من النظام المضيف إلى الحاوية. هذه وظيفة مريحة للغاية، ويمكن استخدامها لتخزين أي بيانات مؤقتة ومشاركة الملفات بين عدة حاويات. في Mirantis، تُستخدم هذه الوظيفة لإعادة توجيه ملفات التكوين لخدمة الوقود/الذكاء (/etc/astute) داخل الحاوية:

$ sudo docker run -d -v /etc/astute Fuel/astute_6.0:latest /usr/local/bin/start.sh

يمكن القيام بنفس الشيء باستخدام الأمر VOLUME في ملف Dockerfile. يعد Dockerfile نفسه المعادل المحلي لـ Makefile، ولكن في حين أن الأخير مخصص لبناء التطبيقات من المصدر، فإن Dockerfile يسمح لك ببناء صور لـ Docker. والغرض منه هو تبسيط عملية إنشاء صور جديدة دون الحاجة إلى تشغيل حاوية وإجراء بعض العمليات فيها والالتزام بها. يمكنك فقط كتابة ملف Dockerfile وسوف يقوم Docker بكل شيء من أجلك. على سبيل المثال، خذ بعين الاعتبار ملف Dockerfile لبناء الوقود/الذكاء:

من عامل الوقود/السنتوس ماثيو موسيسون [البريد الإلكتروني محمي] RUN rm -rf /etc/yum.repos.d/*;\ echo -e "\nname=Nailgun Local Repo\nbaseurl=http://$(route -n | awk "/^0.0.0.0/ ( طباعة $2 )"):_PORT_/os/x86_64/\ngpgcheck=0" > /etc/yum.repos.d/nailgun.repo;\ yum clean all;\ yum --quiet install -y Ruby21-nailgun-mcagents sysstat ADD etc /etc ADD start.sh /usr/local/bin/start.sh RUN puppet Apply --detailed-exitcodes -d -v /etc/puppet/modules/nailgun/examples/astute-only.pp; [[$؟ == 0 || $؟ == 2 ]] RUN chmod +x /usr/local/bin/start.sh;\ echo -e "\nname=Nailgun Local Repo\nbaseurl=file:/var/www/nailgun/centos/x86_64\ngpgcheck=0 " > /etc/yum.repos.d/nailgun.repo; يم تنظيف كافة وحدات التخزين /etc/astute CMD /usr/local/bin/start.sh

ليس من الصعب فهم الغرض المقصود منه. يقوم بإنشاء صورة بناءً على الوقود/سنتوس، وتشغيل عدة أوامر لإعداد الصورة، وإضافة ملفات من الدليل الحالي إلى الصورة، وتطبيق بيان الدمية، وتغيير الأذونات على بعض الملفات، وإسقاط الدليل /etc/asture/ من المجلد النظام المضيف في الحاوية ويقوم بتشغيل الحاوية باستخدام الأمر /usr/local/bin/start.sh.

لإنشاء حاوية، ما عليك سوى وضع ملف Dockerfile وجميع الملفات التي ستتم إضافتها إليه في دليل ما وتشغيل الأمر التالي:

$ سودو دوكر بناء الوقود/astute_6.0:latest

في هذه الحالة، اخترنا الاسم Fuel/astute_6.0:latest، على الرغم من أنه يمكن أن يكون أي شيء.

الفروق الدقيقة في العمل مع Docker

تم بناء Docker حول فكرة أن كل حاوية يجب أن تحتوي على خدمة واحدة فقط قيد التشغيل. يمكنك تجميع Apache وMySQL وnginx وVarnish وكل ما قد تحتاجه لمشروع ما في حاويات مختلفة، ثم استخدام Docker لتجميعها معًا. يوفر هذا الأسلوب قدرًا أكبر من المرونة، لأنه يسمح لك بسهولة تغيير التكوينات واختبار التحديثات وترحيل الخدمات الفردية إلى أجهزة أخرى.

لنفس السبب، لا يتم استخدام Docker بشكل شائع لإطلاق بيئات Linux كاملة مع برامج init daemon وcron وsyslog daemons ومكونات التوزيع القياسية الأخرى. بدلاً من ذلك، نقوم ببساطة بإطلاق الخدمة التي نحتاجها، وتعمل في بيئة افتراضية بمفردها:

$ sudo docker run -d -p 80 ubuntu-nginx /usr/sbin/nginx

ولكن هناك مشكلة صغيرة هنا. ينهي Docker الحاوية فورًا بعد إنهاء العملية الجارية فيها (في هذه الحالة nginx)، وبما أن nginx يتم خفيه افتراضيًا، أي أنه يتفرع عن عملية جديدة وينهي العملية التي بدأناها يدويًا، وينهي Docker فورًا بعد ذلك و حاوية، تسمير عامل ميناء متشعب.

في حالة nginx، يمكنك التغلب على هذه المشكلة عن طريق إضافة البرنامج الخفي؛ السطر الأول في التكوين له. ستتطلب البرامج الشيطانية الأخرى إعداداتها الخاصة، ويمكن منع بعضها من التحول إلى شيطان مباشرة من سطر الأوامر. على سبيل المثال، يوفر sshd العلامة -D لهذا:

$ sudo docker run -d -p 22 ubuntu-ssh /usr/sbin/sshd -D

في أي وقت، يمكنك الاتصال بالحاوية باستخدام الأمر docker exec لعرض السجلات أو تغيير الإعدادات (فيما يلي، معرف الحاوية هو إما المعرف الذي يمكن رؤيته في مخرجات docker ps، أو الاسم المحدد عند بدء التشغيل في خيار --name ):

$ sudo docker exec -ti معرف الحاوية /bin/bash

ولكن هناك مشكلة صغيرة هنا أيضًا. كما نعلم، سيتم فقدان جميع المعلومات المتراكمة أثناء تشغيل البيئة الافتراضية إذا قمنا بإيقاف تشغيل البيئة الافتراضية، وستختفي معها السجلات والتغييرات التي تم إجراؤها على الإعدادات. لا يمكننا أيضًا إنشاء طبقات إلى ما لا نهاية (على الأقل لأنه لا يمكن أن يكون هناك أكثر من 127 طبقة)، ولكن يمكننا اتباع مسار مختلف قليلاً واستخدام نظام تجميع السجلات المدمج في Docker. بالطبع، لا يستطيع Docker جمع السجلات من التطبيقات الفردية، ولكن يمكنه تجميع مخرجات STDOUT، أي أي مخرجات وحدة التحكم. كل ما تبقى لنا هو تغيير تكوين nginx بحيث يتم سكب السجلات في /dev/stdout، ثم عرضها باستخدام أمر docker logs:

$ Sudo docker يسجل معرف الحاوية

الخيار الآخر والأكثر صحة هو نقل السجلات (والإعدادات إذا لزم الأمر) إلى النظام المضيف باستخدام الخيار -v الموصوف بالفعل:

$ sudo mkdir /root/logs $ sudo docker run -d -v /root/logs:/var/logs -p 80 ubuntu-nginx /usr/sbin/nginx

إذا لزم الأمر، يمكن إيقاف الحاوية بشكل صحيح عن طريق إنهاء الخدمة التي تعمل فيها باستخدام أمر docker stop:

$ sudo docker stop معرف الحاوية

وإذا لم ينجح التوقف بشكل صحيح لسبب ما، فيمكنك قتله باستخدام kill:

$ sudo docker يقتل معرف الحاوية

يؤدي هذا إلى شيء مهم ينساه العديد من المبتدئين: يقوم Docker بتخزين معلومات تعريفية حول الحاوية. في الواقع، هذا يعني أنه إذا قمت بتشغيل، على سبيل المثال، nginx، وتحديد اسمه، والأدلة التي تحتاج إلى إعادة توجيهها إلى الحاوية، والمنافذ، ومتغيرات البيئة، وما إلى ذلك باستخدام وسيطات أمر docker run، فسيتم حفظ كل هذه المعلومات عند إنهاء الحاوية وتشغيلها في المرة القادمة، لم يعد عليك تحديدها، ولكن فقط قم بتشغيل الأمر التالي (يمكنك استخدام الاسم بدلاً من المعرف):

$ sudo docker يبدأ معرف الحاوية

إذا لم تكن هناك حاجة لحفظ الحالة (على سبيل المثال، لاختبار بعض الوظائف أو التحقق منها)، فيمكنك استخدام علامة --rm، والتي ستجبر Docker على تدمير الحاوية بالكامل بعد اكتمالها (مع الاحتفاظ بالصورة):

$ sudo docker run --rm -i -t Busybox /bin/bash

يمكنك تدمير جميع الحاويات المحفوظة مسبقًا باستخدام الأمر التالي:

# دوكر rm $(docker ps -a -q)

يمكن لـ Docker إعادة تشغيل الحاويات بشكل مستقل في حالة تعطلها وحتى تشغيلها أثناء بدء تشغيل النظام. كل ما عليك فعله هو ببساطة استخدام خيار --restart:

$ sudo docker run --restart=always \ -d -v /root/logs:/var/logs -p 80 \ ubuntu-nginx /usr/sbin/nginx

في أي وقت، يمكن تصدير الصورة إلى ملف واحد ثم استيرادها على جهاز آخر. يتم توفير أوامر حفظ عامل الإرساء واستعادة عامل الإرساء لهذا الغرض. استخدامها بسيط جدًا، ويتم التصدير على النحو التالي:

$ sudo docker save -o ubuntu-nginx.img ubuntu-nginx

والاستيراد كالتالي:

$ sudo dockerload -i ubuntu-nginx.img

الاستنتاجات

يعتبر Docker أداة ممتازة. بالنسبة لشخص مبتدئ، قد يبدو الأمر وكأنه لعبة غير مناسبة لأي شيء آخر غير تشغيل البرنامج في وضع الحماية، ولكن بمساعدتها يمكنك حل مجموعة كبيرة من المشكلات التي سنتحدث عنها في المقالة التالية.

مزايا Docker مقارنة بـ LXC وOpenVZ وحلول المحاكاة الافتراضية الأخرى على مستوى نظام التشغيل

  1. يستخدم Docker تنسيق صور عالميًا ومحمولًا. وهذا يعني أنه يمكن نقل هذه الصور إلى جهاز آخر دون أي مشاكل ومشاركتها ليستخدمها مستخدمون آخرون.
  2. يمكن أن تكون الصورة بمثابة أساس لصور أخرى. في Docker، من الطبيعي استخدام طبقات متعددة لتشكيل الصورة النهائية. يمكنك البدء بصورة Ubuntu أساسية، ثم إضافة Apache 2.4 لإنشاء خدمة Ubuntu + Apache الصغيرة.
  3. عند الالتزام، يمكن إصدار الصورة، تمامًا كما يحدث في GIT.
  4. تتمتع Docker بمجتمع كبير ونظام بيئي شامل يتضمن عددًا كبيرًا من الأدوات لتوسيع نطاق الحاويات وتجميعها ومراقبتها ونشرها وإدارتها.

يوجد داخل Docker نظام Linux فقطوتجريبيًا FreeBSD. يعمل أصلاً تحت نظام Linux، وتجريبياً تحت نظام FreeBSD. تحت MacOSX، ويندوز - من خلال جهاز ظاهري.

عامل الميناء هو عزل مزدوج.عزل ما بداخل حاوية Docker عن نظام التشغيل وعزل نظام التشغيل عما بداخل حاوية Docker. العزل يعني عزل جميع الملفات والمنافذ والأولويات.

إنها تقريبًا آلة افتراضية. تقريبا، ولكن ليس تماما.

هناك شيء اسمه "جحيم التبعية". اي برنامج مثبت على الكمبيوتر يجلب معه الإدمان(ملفات التكوين، والملفات الثابتة التي تسمى عادةً الأصول، والأدوات المساعدة/الخدمات المساعدة، والمكتبات، وما إلى ذلك). عدد من هذه المكتبات/المرافق/الخدمات غير متوافقة مع بعضها البعض.وبالنظر إلى أن كل من هذه المكتبات/الأدوات المساعدة/الخدمات لها تبعياتها الخاصة، فإن الوضع أسوأ.

على سبيل المثال، نستخدم Yandex.Cocaine، الذي يتم تجميعه بشكل طبيعي فقط على Ubuntu 14.04 (وعلى ما يبدو، على Debian 7). ولكن ليس تحت CentOS 6، 7، Debian 8، FreeBSD 9، 10، Ubuntu 15، 16، وما إلى ذلك. فمن المستحيل تجميعه. نطلق على أنظمة التشغيل هذه في Docker.

من ناحية أخرى، وفي الوقت نفسه، تحتاج إلى تثبيت برامج أخرى أكثر حداثة. وفي نفس الوقت أكبر سنا. ونحن لا نتحدث حتى عن إصدارات مختلفة بشكل جدي من Linux. على سبيل المثال، يتطلب أحد البرامج الإصدار Ubuntu 14.10 على الأقل، بينما يتطلب برنامج آخر الإصدار Linux 14.04 على الأقل.

عامل الميناء هو برنامج واحد ضمن بيئة فردية مع إصدار فردي من نظام التشغيل.بسبب حاويات النفخة، إذا كنت تستخدم جذرًا واحدًا لكل شيء، فإن حجم حاوية Docker أكبر ببضعة كيلو بايت فقط من حجم الملف الثنائي،يعمل تحت عامل الميناء.

وبالتالي، لدينا ملف ثنائي يعمل كما لو كان في نظام التشغيل الخاص به.

يمكنك أن تقول - باه، ولكن هذا معروف منذ فترة طويلة آلة افتراضية. ولكن لا، هذا ليس صحيحا.هذه هي ما يسمى بالحاويات. لا توجد رائحة لأي جهاز افتراضي هناك. باستثناء نظامي التشغيل Windows وMacOSX،حيث لا يزال العمل بدون جهاز افتراضي ممكنًا تجريبيًا فقط، والقاعدة في أنظمة التشغيل هذه هي استخدام Docker داخل جهاز افتراضي كامل.

لكن أجهزة Docker الافتراضية تُستخدم فقط للتطوير. للتشغيل في الإنتاج، لا يتم استخدام الأجهزة الافتراضية مع Docker.

يستخدم Docker حاويات نظام التشغيل. LXC على Linux، Jails على FreeBSD. الحاوية هي منطقة من نظام التشغيل معزولة عن الجزء الرئيسي من نظام التشغيل. تحتوي الحاوية على شجرة الدليل الخاصة بها (بما في ذلك النظام /dev، /bin، /sbin، وما إلى ذلك)، ومنافذ الشبكة الخاصة بها، وما إلى ذلك.

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

صحيح أن استخدام المحاكاة الافتراضية غير المكتملة يحد من استخدام أنظمة التشغيل داخل الحاويات. عادة هذا هو إصدارات معدة خصيصًا من Linux أو FreeBSD. تلك المعدة خصيصًا. Windows - من حيث المبدأ، فمن المستحيل تشغيله في حاوية.

كانت الحاويات موجودة قبل Docker. عامل ميناء، بالمعنى الدقيق للكلمة، هو مجرد جدا مجموعة مريحة من الأدوات، تم تجميعها معًا لإدارة المحاكاة الافتراضية للحاوية. لكن مريح جدا.

لماذا يتم استخدام هذا؟

واجه الرجال من جميع أنواع Dropbox و Facebook وغيرهم من العمالقة، الذين أطلقوا مليون برنامج مختلف في خدماتهم، حقيقة أن من المستحيل ضمان إعدادات نظام التشغيل متطابقة في كل مكان.وهذا أمر بالغ الأهمية.

إلى النقطة التي يبدأ البرنامج المكتوب والمختبر بشكل مثالي على خادم حقيقي في التصرف بشكل غير متوقع.

لذلك، ولد أحد هؤلاء الأذكياء مفهومًا جديدًا - يعمل كل برنامج على الخوادم في بيئته الفردية، مع إعدادات نظام التشغيل الفردية.

علاوة على ذلك - في الأصل مطور برامج اختبار برنامج في حاوية Docker، مع إعدادات معينة. و في نفس حاوية Docker (أو بنفس الإعدادات)، ينتقل البرنامج إلى الخادم.

هذا يسمح لك بضمان هوية أكبر بكثير بين بيئة التطوير وبيئة التشغيل.

قبل ذلك، عانى الناس، وابتكروا أدوات تركيب ماكرة...

بعد بصقوا على محاولات تنظيم البيئة في نظام التشغيل- والآن المفهوم هو هذا - تثبيت البرامج على الخوادم بالإضافة إلى أنظمة التشغيل التي تم تكوينها بشكل فردي- أي داخل الحاويات. حاوية واحدة = إعداد واحد لنظام التشغيل = برنامج واحد بالداخل.

بعبارة أخرى:

  • يجب استخدام حاوية Docker لتصحيح الأخطاء.
  • يجب استخدام نفس حاوية Docker على الخادم.

هذا يسمح لك بعدم الاهتمام بالإعدادات "تحت الخادم"محليا على جهاز المطور. يتيح لك ذلك التطوير على جهاز المطور بشكل كامل برامج مختلفة في نفس الوقت، الأمر الذي يتطلب إعدادات نظام التشغيل غير متوافقة. يتيح لنا ذلك تقديم المزيد من الضمانات بأن البرنامج الموجود على الخادم سيتصرف بنفس الطريقة التي يعمل بها على جهاز المطور. يتيح لك ذلك التطوير ضمن نظامي التشغيل Windows/MacOSX من خلال اختبار "شفاف" ملائم لنظام التشغيل Linux.

ينطبق Docker على الإنشاء/التخصيص برنامج الخادم الوحيد لنظام التشغيل Linux(تجريبيًا ضمن FreeBSD). ليس للهواتف الذكية. وإذا تم استخدام أجهزة سطح المكتب، فسيتم استخدام البرامج فقط بدون واجهة المستخدم الرسومية.

طالما يسمح دوكر بذلك في ضربة واحدة، تبسيط عمل المطورين والمسؤولين وتحسين جودة النتيجة- الآن هناك طفرة في Docker. تم اختراع كم هائل من الأدوات لإدارة نشر التطبيقات التي تم إنشاؤها باستخدام Docker. إذا كان في السابق، لتشغيل 10000 برنامج على 1000 خادم، كنت بحاجة إلى 3 متخصصين مؤهلين تأهيلاً عاليًا على الأقل والذين كتبوا مجموعة من الأوصاف لكيفيةيمكن القيام بذلك على Puppet، وSalt، وChef، وAnsible، وحتى ذلك الحين لم تكن هناك ضمانات، فقد تم اختبار كل شيء لعدة أشهر. الآن مع Docker، يمكن لمطور واحد مؤهل إدارة ملايين البرامج على عشرات الآلاف من الخوادم. مع ضمان أكبر بكثير أن كل شيء سيبدأ بشكل طبيعي.

قد يكون هناك انطباع خاطئ بأن المطور يقوم بإعداد الحاويات في Docker ثم يسلمها إلى المسؤول.
المنهجية الصحيحة لا تزال مختلفة:

يساهم المطور بكل مخرجاته في نظام CI (عادةً عبر git)
لكل التزام جديد، يقوم CI بإنشاء صورة للاختبار باستخدام Docker.
إذا نجحت الاختبارات، فسيتم إرسال نفس صورة Docker للنشر في الإنتاج.
أو بشكل مختلف قليلاً في الأنظمة المترجمة، حيث لا تكون هناك حاجة إلى المصادر في الإنتاج: في Docker، يتم نشر بيئة التجميع، وللاختبار، يتم نشر صورة ثانية مع العناصر المترجمة بالفعل، والتي يتم إرسالها بالفعل إلى الإنتاج.

أي أنه مع التنظيم الصحيح للأمر، لا يستطيع/لا ينبغي للمطور التأثير على الشكل الذي ستكون عليه الصورة.
ولكن في بيئة الاختبار (يتم تشغيله على الخادم، ولا يمكن للمطور الوصول إليه في فرق كبيرة) وفي الإنتاج يتم استخدامه بدقة نفس الصورة.

الفكرة الرئيسية هي أن ما اختبرناه هو بالضبط ما أطلقناه على خادم الإنتاج. واحد لواحد، بما في ذلك نفس الملفات (ليس هو نفسه، ولكن نفس الشيء بالضبط).

Docker هي أداة شائعة توفر، من خلال استخدام الحاويات، كل ما تحتاجه لتشغيل التطبيقات. باستخدام حاويات Docker، يمكنك التأكد من أن تطبيقك سيعمل بنفس الطريقة على أي جهاز تقوم بتشغيله عليه.

في هذا البرنامج التعليمي، ستتعرف على العلاقة بين الحاويات وصور Docker، وكيفية تثبيت الحاويات وبدء تشغيلها وإيقافها وإزالتها.

مراجعة

صورة عامل الميناءيمكن اعتباره قالبًا يُستخدم لإنشاء الحاويات. تبدأ الصور عادةً بنظام ملفات جذر، والذي يتم بعد ذلك دمجه مع العديد من التغييرات ومعلمات التشغيل المقابلة لها. على عكس توزيعات Linux النموذجية، تحتوي صورة Docker عادةً فقط على الأجزاء المطلوبة لتشغيل التطبيق. الصور ليس لها حالات ولا تتغير. سيكون أكثر دقة أن نقول إنها نقطة البداية والأساس لحاويات Docker.

تنبض الصور بالحياة بمجرد إصدار أمر docker run - فهو يقوم على الفور بإنشاء حاوية عن طريق إضافة طبقة قراءة وكتابة جديدة أعلى الصورة. يُعرف هذا المزيج من طبقات القراءة فقط (مع إضافة طبقة للقراءة والكتابة في الأعلى) أيضًا باسم UnionFS، وهو نظام ملفات يقوم بتتالي التركيبات الموحدة لأنظمة الملفات. عند إجراء تغيير على ملف موجود في حاوية قيد التشغيل، يتم نسخ الملف من طبقة القراءة فقط إلى طبقة القراءة والكتابة، حيث يتم تطبيق التغييرات. والآن تم إخفاء الملف الأصلي بواسطة نسخة القراءة والكتابة، ولكن لم يتم حذفه. توجد مثل هذه التغييرات في مستويات الكتابة والقراءة فقط ضمن حاوية فردية معينة. عند حذف حاوية، يتم أيضًا فقدان كافة التغييرات (ما لم يتم حفظها).

العمل مع الحاويات

في كل مرة تستخدم فيها أمر docker run، يتم إنشاء حاوية جديدة من الصورة التي تحددها. سيتم مناقشة المزيد من الأمثلة المحددة أدناه.

الخطوة 1: إنشاء حاويتين

يقوم أمر docker run أدناه بإنشاء حاوية جديدة تستخدم صورة Ubuntu كقاعدة لها. سيوفر المفتاح -t الجهاز، وسيوفر -i القدرة على التفاعل معه. للدخول إلى الحاوية، يمكنك استخدام الأمر bash القياسي. أي أنه يمكنك إدخال:

تشغيل عامل الإرساء $ -ti أوبونتو

$ docker run -i -t ubuntu:14.04 /bin/bash

(في الحالة الثانية، ستقوم بتشغيل الأمر /bin/bash داخل الحاوية وستكون داخل الحاوية تلقائيًا)

سيؤكد سطر الأوامر أنك داخل الحاوية كمستخدم متميز. بعد علامة @ سترى معرف الحاوية التي تتواجد فيها:

الجذر @ 11cc47339ee1:/#

الآن، باستخدام الأمر echo، قم بإجراء تغييرات على الدليل /tmp، ثم تحقق من كتابة التغييرات باستخدام الأمر cat:

صدى "Example1"> /tmp/Example1.txt القط /tmp/Example1.txt

على الشاشة يجب أن تشاهد:

الآن اخرج من الحاوية:

بمجرد تنفيذ هذا الأمر والخروج من سطر الأوامر، تتوقف حاوية Docker عن العمل. يمكنك رؤية ذلك إذا كنت تستخدم الأمر docker ps:

من بين الحاويات قيد التشغيل، لن ترى الحاوية المستخدمة أعلاه:

تم إنشاء أمر صورة معرف الحاوية وأسماء منافذ الحالة

ومع ذلك، يمكنك إضافة المفتاح -a لرؤية جميع الحاويات - سواءً كانت قيد التشغيل أو متوقفة - وبعد ذلك ستظهر لك الحاوية التي كنت تعمل فيها سابقًا:

$ docker ps -a أمر صورة معرف الحاوية تم إنشاء أسماء المنافذ 11cc47339ee1 ubuntu "/bin/bash" منذ 9 دقائق تم الخروج (127) منذ 10 ثوانٍ صغير_sinoussi

عند إنشاء حاوية، يكون لها معرف واسم يتم إنشاؤه تلقائيًا. في هذه الحالة، 11cc47339ee1 هو رقم التعريف (ID) للحاوية، وsmall_sinoussi هو الاسم الذي تم إنشاؤه. يعرض الأمر ps -a هذه البيانات، بالإضافة إلى الصورة التي تم إنشاء الحاوية منها (في هذه الحالة ubuntu)، ومتى تم إنشاء الحاوية (منذ 9 دقائق)، والأمر الذي تم تشغيله فيها ("/bin/ bash"). يمكنك أيضًا رؤية حالة الحاوية (تم تركها قبل 10 ثوانٍ). إذا كانت الحاوية لا تزال قيد التشغيل، فسترى الحالة "أعلى" والوقت الذي كانت تعمل فيه.

يمكنك الآن إدخال الأمر مرة أخرى لإنشاء الحاوية:

تشغيل عامل الإرساء $ -ti أوبونتو

على الرغم من أن الأمر يبدو كما كان في المرة السابقة، إلا أنه سينشئ حاوية جديدة تمامًا - سيكون لها رقم معرف مختلف، وإذا حاولت إلقاء نظرة على محتويات ملف المثال 1 الذي قمت بتحريره مسبقًا، فلن تجده .

Root@6e4341887b69:/# cat /tmp/Example1

سيكون الإخراج:

القط: /tmp/Example1: لا يوجد مثل هذا الملف أو الدليل

قد يبدو لك أن البيانات قد اختفت، ولكن بالطبع ليس هذا هو الحال. اخرج من الحاوية الثانية للتأكد من وجود كلتا الحاويتين (بما في ذلك الحاوية الأولى التي تحتوي على الملف المطلوب) على النظام.

Root@6e4341887b69:/# خروج $ docker ps -a

سيكون الإخراج:

أمر صورة معرف الحاوية، أسماء منافذ الحالة 6e4341887b69 ubuntu "/bin/bash" منذ حوالي دقيقة تم الخروج (1) منذ 6 ثوانٍ Kickass_borg 11cc47339ee1 ubuntu "/bin/bash" منذ 15 دقيقة تم الخروج (127) منذ 6 دقائق صغير_sinoussi

الخطوة 2: أعد تشغيل الحاوية الأولى

لإعادة تشغيل حاوية تم إنشاؤها بالفعل، تحتاج إلى استخدام أمر البدء مع مفتاحين -ai. في النهاية، عليك كتابة رقم تعريف الحاوية التي تريد العمل بها، أو اسمها. ونتيجة لذلك، سيبدو الأمر الخاص بك كما يلي:

بداية عامل الميناء -ai 11cc47339ee1

لقد عدت الآن إلى bash shell داخل الحاوية، ويمكنك التحقق من أن الملف الذي قمت بإنشائه في بداية المقالة لا يزال موجودًا هنا:

القط /tmp/Example1.txt

سترى على الشاشة:

الآن يمكنك الخروج من الحاوية:

بهذه الطريقة، يتم حفظ جميع التغييرات داخل الحاوية، حتى لو قمت بإيقاف الحاوية ثم إعادة تشغيلها. يتم حذف البيانات فقط عند حذف الحاوية نفسها. كما يوضح المثال أعلاه أن التغييرات تؤثر على حاوية فردية واحدة (وليس جميع الحاويات في وقت واحد).

الخطوة 3: قم بإزالة كلتا الحاويتين

الخطوة الأخيرة هي حذف الحاويتين اللتين قمت بإنشائهما باتباع هذا البرنامج التعليمي. للقيام بذلك، تحتاج إلى استخدام الأمر docker rm. ومع ذلك، فإنه يؤثر فقط على الحاويات المتوقفة. بعد الأمر، يجب عليك تحديد رقم تعريف أو اسم حاوية واحدة أو أكثر. على سبيل المثال، لحذف الحاويات التي تم إنشاؤها مسبقًا، تحتاج إلى إدخال الأمر:

Docker rm 6e4341887b69 Small_sinoussi

ستعرض الشاشة:

6e4341887b69 صغير_سينوسي

الآن تم حذف كلتا الحاويتين.

خاتمة

في هذا البرنامج التعليمي، تعرفت على الأوامر الأساسية للعمل في Docker وتعلمت كيفية إنشاء الحاويات وإيقافها وإعادة تشغيلها وحذفها.

أستخدم Docker منذ عدة أشهر لتنظيم عملية التطوير/التسليم لمشاريع الويب. أقدم لقراء خبرخبر ترجمة المقال التمهيدي عن عامل الإرساء - "فهم عامل الإرساء".

ما هو عامل الميناء؟

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

يسمح لك Docker في جوهره بتشغيل أي تطبيق تقريبًا، معزولًا بأمان في حاوية. يتيح لك العزل الآمن تشغيل العديد من الحاويات على نفس المضيف في نفس الوقت. تسمح لك الطبيعة خفيفة الوزن للحاوية، والتي تعمل بدون العبء الإضافي لبرنامج Hypervisor، بالحصول على المزيد من أجهزتك.

يمكن أن تكون منصة وأدوات المحاكاة الافتراضية للحاوية مفيدة في الحالات التالية:

  • تعبئة التطبيق الخاص بك (والمكونات التي تستخدمها) في حاويات عامل الإرساء؛
  • توزيع وتسليم هذه الحاويات إلى فرقك للتطوير والاختبار؛
  • وضع هذه الحاويات في مواقع الإنتاج الخاصة بك، سواء في مراكز البيانات أو في السحابة.

ما الذي يمكنني استخدامه لعامل الإرساء؟

نشر التطبيقات الخاصة بك بسرعة

يعد Docker رائعًا لتنظيم دورة التطوير. يسمح Docker للمطورين بتشغيل الحاويات المحلية مع التطبيقات والخدمات. والذي يسمح لك لاحقًا بالتكامل مع عملية التكامل المستمر وسير عمل النشر.

على سبيل المثال، يقوم المطورون لديك بكتابة التعليمات البرمجية محليًا ومشاركة حزمة التطوير الخاصة بهم (مجموعة من صور Docker) مع زملائهم. وعندما يصبحون جاهزين، يقومون بدفع الكود والحاويات إلى موقع الاختبار وإجراء أي اختبارات ضرورية. ومن موقع الاختبار، يمكنهم إرسال التعليمات البرمجية والصور إلى الإنتاج.

أسهل في الطرح والفتح

تعمل المنصة القائمة على حاوية عامل الإرساء على تسهيل نقل حمولتك. يمكن تشغيل حاويات Docker على جهازك المحلي، سواء كان حقيقيًا أو على جهاز افتراضي في مركز بيانات، أو في السحابة.

إن قابلية النقل وطبيعة الوزن الخفيف لعامل الإرساء تجعل من السهل إدارة عبء العمل لديك ديناميكيًا. يمكنك استخدام عامل الإرساء لنشر تطبيقك أو خدماتك أو إيقاف تشغيلها. تسمح سرعة عامل الإرساء بالقيام بذلك في الوقت الفعلي تقريبًا.

أحمال أعلى وحمولات أكثر

Docker خفيف الوزن وسريع. فهو يوفر بديلاً مرنًا وفعالاً من حيث التكلفة للأجهزة الافتراضية المعتمدة على برنامج Hypervisor. وهو مفيد بشكل خاص في البيئات عالية التحميل، على سبيل المثال، عند إنشاء السحابة الخاصة بك أو النظام الأساسي كخدمة. ولكنه مفيد أيضًا للتطبيقات الصغيرة والمتوسطة الحجم عندما تريد تحقيق أقصى استفادة من الموارد المتوفرة لديك.

مكونات عامل الميناء الرئيسية

يتكون Docker من مكونين رئيسيين:
  • Docker: منصة افتراضية مفتوحة المصدر؛
  • Docker Hub: منصتنا كخدمة لتوزيع وإدارة حاويات الإرساء.
ملحوظة! يتم توزيع Docker بموجب ترخيص Apache 2.0.

بنية عامل الميناء

يستخدم Docker بنية خادم العميل. يتواصل عميل Docker مع البرنامج الخفي Docker، الذي يتحمل عبء إنشاء الحاويات الخاصة بك وتشغيلها وتوزيعها. يمكن تشغيل كل من العميل والخادم على نفس النظام، ويمكنك توصيل العميل ببرنامج خفي لرسو السفن عن بعد. يتواصل العميل والخادم عبر مأخذ توصيل أو RESTful API.

عامل ميناء الخفي

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

عميل عامل الميناء

عميل Docker، برنامج الإرساء، هو الواجهة الرئيسية لـ Docker. يتلقى أوامر من المستخدم ويتفاعل مع برنامج عامل الإرساء.

داخل عامل الميناء

لفهم ما يتكون منه عامل الإرساء، عليك أن تعرف ثلاثة مكونات:
  • الصور
  • التسجيل
  • حاويات

الصور

صورة Docker هي قالب للقراءة فقط. على سبيل المثال، قد تحتوي الصورة على نظام التشغيل Ubuntu مع Apache وتطبيق عليه. يتم استخدام الصور لإنشاء الحاويات. يسهّل Docker إنشاء صور جديدة أو تحديث الصور الموجودة أو يمكنك تنزيل الصور التي أنشأها أشخاص آخرون. الصور هي مكونات بناء عامل الإرساء.

التسجيل

يقوم سجل Docker بتخزين الصور. هناك سجلات عامة وخاصة يمكنك من خلالها تنزيل الصور أو تحميلها. سجل Docker العام هو Docker Hub. هناك مجموعة ضخمة من الصور المخزنة هناك. كما تعلم، يمكن إنشاء الصور بواسطتك أو يمكنك استخدام الصور التي أنشأها الآخرون. السجلات هي عنصر التوزيع.

حاويات

الحاويات تشبه الدلائل. تحتوي الحاويات على كل ما يلزم لتشغيل التطبيق. يتم إنشاء كل حاوية من صورة. يمكن إنشاء الحاويات أو بدء تشغيلها أو إيقافها أو ترحيلها أو حذفها. يتم عزل كل حاوية وتوفر منصة آمنة للتطبيق. الحاويات هي مكونات العمل.

فكيف يعمل دوكر؟

ونحن نعلم حتى الآن أن:
  • يمكننا إنشاء الصور التي توجد فيها تطبيقاتنا؛
  • يمكننا إنشاء حاويات من الصور لتشغيل التطبيقات؛
  • يمكننا توزيع الصور من خلال Docker Hub أو سجل صور آخر.
دعونا نرى كيف تتناسب هذه المكونات معًا.

كيف تعمل الصورة؟

نحن نعلم بالفعل أن الصورة عبارة عن قالب للقراءة فقط يتم إنشاء الحاوية منه. تتكون كل صورة من مجموعة من المستويات. يستخدم Docker نظام ملفات موحد لدمج هذه الطبقات في صورة واحدة. يسمح نظام ملفات الاتحاد للملفات والأدلة من أنظمة ملفات مختلفة (فروع مختلفة) بالتداخل بشفافية، مما يؤدي إلى إنشاء نظام ملفات متماسك.

أحد أسباب كون عامل الإرساء خفيف الوزن هو أنه يستخدم طبقات مثل هذه. عندما تقوم بتغيير الصورة، مثل تحديث تطبيق ما، يتم إنشاء طبقة جديدة. لذلك، بدون استبدال الصورة بأكملها أو إعادة بنائها، كما قد يكون الأمر يتعلق بجهاز افتراضي، تتم إضافة الطبقة فقط أو تحديثها. وليس عليك توزيع الصورة الجديدة بالكامل، بل يتم توزيع التحديث فقط، مما يجعل توزيع الصور أسهل وأسرع.

في قلب كل صورة توجد صورة أساسية. على سبيل المثال، ubuntu، الصورة الأساسية لـ Ubuntu، أو fedora، الصورة الأساسية لتوزيع Fedora. يمكنك أيضًا استخدام الصور كقاعدة لإنشاء صور جديدة. على سبيل المثال، إذا كان لديك صورة Apache، فيمكنك استخدامها كصورة أساسية لتطبيقات الويب الخاصة بك.

ملحوظة! يقوم Docker عادةً بسحب الصور من سجل Docker Hub.

يمكن إنشاء صور Docker من هذه الصور الأساسية؛ ونطلق على خطوات إنشاء هذه الصور التعليمات. تقوم كل تعليمات بإنشاء صورة أو مستوى جديد. وستكون التعليمات على النحو التالي:

  • الأمر Run
  • إضافة ملف أو دليل
  • إنشاء متغير البيئة
  • تعليمات حول ما يجب تشغيله عند تشغيل حاوية هذه الصورة

يتم تخزين هذه التعليمات في ملف Dockerfile. يقرأ Docker ملف Dockerfile هذا عند إنشاء الصورة، وينفذ هذه التعليمات، ويعيد الصورة النهائية.

كيف يعمل سجل عامل الإرساء؟

السجل عبارة عن مستودع لصور عامل الإرساء. بمجرد إنشاء الصورة، يمكنك نشرها على سجل Docker Hub العام أو على السجل الشخصي الخاص بك.

باستخدام عميل عامل الإرساء، يمكنك البحث عن الصور المنشورة بالفعل وتنزيلها على جهاز الإرساء الخاص بك لإنشاء حاويات.

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

كيف تعمل الحاوية؟

تتكون الحاوية من نظام التشغيل وملفات المستخدم والبيانات الوصفية. كما نعلم، يتم إنشاء كل حاوية من صورة. تخبر هذه الصورة عامل الإرساء بما هو موجود في الحاوية، وما هي العملية التي يجب أن تبدأ، ومتى تبدأ الحاوية، وبيانات التكوين الأخرى. صورة Docker للقراءة فقط. عندما يقوم عامل الإرساء بتشغيل حاوية، فإنه يقوم بإنشاء طبقة قراءة/كتابة أعلى الصورة (باستخدام نظام الملفات الموحد كما ذكرنا سابقًا) حيث يمكن تشغيل التطبيق.

ماذا يحدث عندما تبدأ الحاوية؟

إما من خلال برنامج عامل الإرساء أو من خلال RESTful API، يخبر عميل عامل الإرساء برنامج عامل الإرساء ببدء تشغيل الحاوية.

$ sudo docker run -i -t ubuntu /bin/bash

دعونا نلقي نظرة على هذا الأمر. يبدأ العميل باستخدام أمر docker، مع خيار التشغيل الذي يطلب منه بدء حاوية جديدة. الحد الأدنى لمتطلبات تشغيل الحاوية هو السمات التالية:

  • الصورة التي سيتم استخدامها لإنشاء الحاوية. في حالتنا أوبونتو
  • الأمر الذي تريد تشغيله عند بدء تشغيل الحاوية. في حالتنا /bin/bash

ماذا يحدث تحت الغطاء عندما نقوم بتشغيل هذا الأمر؟

يقوم Docker بالترتيب بما يلي:

  • تنزيل صورة أوبونتو:يتحقق عامل الإرساء من وجود صورة أوبونتو على الجهاز المحلي، وإذا لم تكن موجودة، فإنه يقوم بتنزيلها من Docker Hub. إذا كانت هناك صورة، فسيتم استخدامها لإنشاء حاوية؛
  • ينشئ حاوية:عند استلام الصورة، يستخدمها عامل الإرساء لإنشاء حاوية؛
  • تهيئة نظام الملفات وتثبيت مستوى القراءة فقط:يتم إنشاء الحاوية في نظام الملفات ويتم إضافة الصورة إلى مستوى القراءة فقط؛
  • تهيئة الشبكة/الجسر:ينشئ واجهة شبكة تسمح لعامل الإرساء بالتواصل مع الجهاز المضيف؛
  • ضبط عنوان IP:يجد ويحدد العنوان؛
  • يبدأ العملية المحددة:إطلاق التطبيق الخاص بك؛
  • العمليات وتنتج المخرجات من التطبيق الخاص بك:يتصل ويسجل الإدخال والإخراج القياسي ودفق الأخطاء للتطبيق الخاص بك حتى تتمكن من تتبع كيفية أداء التطبيق الخاص بك.
لديك الآن حاوية صالحة للعمل. يمكنك إدارة الحاوية الخاصة بك، والتفاعل مع التطبيق الخاص بك. عندما تقرر إيقاف التطبيق، احذف الحاوية.

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

تم كتابة Docker بلغة Go ويستخدم بعض ميزات Linux kernel لتنفيذ الوظيفة المذكورة أعلاه.

مساحات الأسماء

يستخدم Docker تقنية مساحات الأسماء لتنظيم مساحات العمل المعزولة، والتي نطلق عليها اسم الحاويات. عندما نبدأ حاوية، يقوم عامل الإرساء بإنشاء مجموعة من مساحات الأسماء لتلك الحاوية.

يؤدي هذا إلى إنشاء طبقة معزولة، حيث يعمل كل جانب من جوانب الحاوية في مساحة الاسم الخاصة به ولا يمكنه الوصول إلى النظام الخارجي.

قائمة ببعض مساحات الأسماء التي يستخدمها عامل الإرساء:

  • معرف الهوية:لعزل العملية؛
  • شبكة:لإدارة واجهات الشبكة؛
  • التصنيف الدولي للبراءات:لإدارة موارد IPC. (برنامج المقارنات الدولية: InterProccess Communication)؛
  • منت:لإدارة نقاط التثبيت؛
  • التوقيت العالمي:لعزل إصدار النواة والتحكم (UTC: نظام المشاركة بالوقت Unix).

مجموعات التحكم

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

نظام ملفات الاتحاد

Union File Sysem أو UnionFS هو نظام ملفات يعمل عن طريق إنشاء طبقات، مما يجعله خفيف الوزن وسريعًا للغاية. يستخدم Docker UnionFS لإنشاء الكتل التي تم بناء الحاوية منها. يمكن لـ Docker استخدام العديد من إصدارات UnionFS بما في ذلك: AUFS وbtrfs وvfs وDeviceMapper.

تنسيقات الحاويات

يقوم Docker بدمج هذه المكونات في غلاف نسميه تنسيق الحاوية. التنسيق الافتراضي يسمى libcontainer. يدعم Docker أيضًا تنسيق حاوية Linux التقليدي باستخدام LXC. في المستقبل، قد يدعم Docker تنسيقات الحاويات الأخرى. على سبيل المثال، التكامل مع BSD Jails أو Solaris Zones.