JavaRush /مدونة جافا /Random-AR /التعارف الأول مع دوكر
Viacheslav
مستوى

التعارف الأول مع دوكر

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

مقدمة

في هذه المراجعة القصيرة أود أن أتطرق إلى موضوع مثل النقل بالحاويات. وعليك أن تبدأ بفهم ماهية النقل بالحاويات في الواقع. وفقًا لويكيبيديا، " الحاويات " هي محاكاة افتراضية على مستوى نظام التشغيل (أي ليس الأجهزة) حيث تحتفظ نواة نظام التشغيل بمثيلات متعددة لمساحة المستخدم المعزولة بدلاً من نسخة واحدة فقط. " مساحة المستخدم " هي مساحة عنوان الذاكرة الظاهرية لنظام التشغيل المحجوزة لبرامج المستخدم. مثيلات مساحة المستخدم (تسمى عادةً الحاويات) متطابقة تمامًا مع مثيل نظام تشغيل واحد من وجهة نظر المستخدم. تضمن النواة عزلًا كاملاً للحاويات، بحيث لا يمكن للبرامج من حاويات مختلفة أن تؤثر على بعضها البعض. اتضح أن الحاويات هي المحاكاة الافتراضية للبرمجيات، أي المحاكاة الافتراضية على مستوى نظام التشغيل، والتي تكون نواة نظام التشغيل مسؤولة عنها. إحدى السمات المميزة لهذا الأسلوب هي أن جميع الحاويات تستخدم نواة مشتركة، مثل نظام التشغيل المضيف (أي النظام الذي توجد عليه الحاويات). يتيح لك ذلك التخلص من العبء الزائد لمحاكاة الأجهزة الافتراضية وإطلاق نسخة كاملة من نظام التشغيل. يمكننا القول أن هذه محاكاة افتراضية "خفيفة الوزن". النواة هي الجزء المركزي من نظام التشغيل الذي يوفر للتطبيقات وصولاً منسقًا إلى موارد الكمبيوتر، مثل وقت المعالج والذاكرة والأجهزة الخارجية وأجهزة الإدخال والإخراج الخارجية. توفر النواة أيضًا عادةً خدمات نظام الملفات وبروتوكول الشبكة. بشكل عام، هذا هو قلب النظام بأكمله. للحصول على معلومات إضافية، قد يكون من المفيد مراجعة المادة " معلومات عامة عن الحاويات ". وبضع كلمات أخرى لإكمال المقدمة. لقد فهمنا الآن أن نظام التشغيل يحتوي على نواة. يوفر العزلة لمثيلات مساحة المستخدم. في هذا السياق، قد تصادف مصطلح " مجموعات التحكم ". هذا هو اسم آلية Linux kernel التي تسمح لك بتحقيق ذلك. لذلك يمكننا القول أن مسار الحاويات بدأ مع أنظمة Linux. ومع ذلك، بدءًا من نظام التشغيل Windows 10، ظهر أيضًا دعم النقل بالحاويات. للعمل مع المحاكاة الافتراضية، تحتاج إلى تكوين دعم المحاكاة الافتراضية في BIOS لجهاز الكمبيوتر الخاص بك. كيفية القيام بذلك تعتمد على الكمبيوتر. على سبيل المثال، قد يبدو الأمر كما يلي:
المقدمة الأولى إلى Docker - 2
على نظام التشغيل Windows، يمكنك التحقق من ذلك بطرق مختلفة. على سبيل المثال، يمكنك تنزيل أداة مساعدة خاصة من موقع Microsoft على الويب: أداة الكشف عن المحاكاة الافتراضية بمساعدة الأجهزة . حسنًا، تجدر الإشارة إلى مفهوم مهم آخر - برنامج Hypervisor. برنامج Hypervisor هو جهاز مراقبة افتراضي، وهو برنامج لضمان التنفيذ المتوازي لعدة أنظمة تشغيل على نفس الكمبيوتر. يضمن برنامج Hypervisor عزل أنظمة التشغيل عن بعضها البعض ومشاركة الموارد بين أنظمة تشغيل التشغيل. أحد برامج Hypervisor هو Oracle VirtualBox .
المقدمة الأولى إلى Docker - 3

عامل ميناء

لذلك، ما هي المحاكاة الافتراضية واضح. لكن كيف تستخدمه؟ وهنا يأتي دوكر لمساعدتنا. Docker هو برنامج لأتمتة نشر وإدارة التطبيقات في البيئات الحاوية. يجدر بنا أن نبدأ بحقيقة أن Docker يمثلها مفهوم مثل Docker Enginge. ويجب أن تبدأ بموقع Docker الرسمي وقسم " نظرة عامة على Docker ".
المقدمة الأولى إلى Docker - 4
تقول الوثائق أن عامل الإرساء يتكون من:
  • يسمى خادم Docker عملية Docker Daemon (dockerd).
  • واجهة سطر الأوامر، والمعروفة أيضًا باسم CLI (عامل الإرساء).
  • واجهة برمجة تطبيقات REST التي تصف كيف يمكن للبرامج "التحدث" مع برنامج Deamon وإخباره بما يجب عليه فعله.
قبل أن نتعمق أكثر، دعونا نقوم بتثبيت عامل الإرساء، أي تثبيت برنامج عامل الإرساء الخفي. يحتوي موقع Docker على تعليمات لتثبيت " Docker for Windows ". ومن المثير للاهتمام أن Docker لديه متطلبات النظام الخاصة به. وإذا كان لديك، مثلي، نظام Windows قديم، على سبيل المثال Windows 7، فأنت بحاجة إلى استخدام Docker Toolbox.
المقدمة الأولى إلى Docker - 5

صندوق أدوات عامل الميناء

لتثبيت Docker على الأجهزة القديمة التي لا تفي بمتطلبات النظام. يقول موقع الويب ذلك، "Legacy Desktop Solution". دعنا نذهب إلى صفحة " Docker Toolbox " ونقوم بتنزيله. تزن هذه المجموعة حوالي 211 ميغابايت. سنقوم بتثبيته كإعداد افتراضي، أي أننا نتفق بكل بساطة مع كل شيء دون إعادة ترتيب الأعلام. بعد التثبيت، سوف نتحقق من أن كل شيء على ما يرام. في المستقبل، ستكون ساحة معركتنا هي سطر الأوامر. أوصي بعدم استخدام سطر أوامر Windows، لأنه قد تكون هناك مشكلات غير واضحة فيه. من الأفضل استخدام bash shell. على نظام التشغيل Windows، الطريقة الأكثر موصى بها للحصول عليه هي تثبيت نظام التحكم في إصدار git ، وسيظل مفيدًا. لأن "المجمعة" معها ستكون الباش الذي نحتاجه. في هذه المراجعة سأستخدم git bash. يمكنك أيضًا تثبيت bash باستخدام CYGWIN . لنبدأ تشغيل bash أو git bash. دعونا نتأكد من أننا قمنا بتثبيت Docker Machine، المعروف أيضًا باسم Docker Machine: docker-machine -version ما هو Docker Machine هذا؟ تعد Docker Machine أداة مساعدة لإدارة المضيفين الذين تم إرساءهم (هؤلاء هم المضيفون الذين تم تثبيت Docker Engine عليهم). إذا قمنا فورًا بعد تثبيت Docket Toolbox بعرض أجهزة الإرساء باستخدام الأمر docker-machine ls، فسنرى قائمة فارغة:
المقدمة الأولى إلى Docker - 6
دعونا نصنع آلة جديدة. للقيام بذلك، نحتاج إلى تشغيل أمر الإنشاء : docker-machine create -- driver virtualbox javarush: سنرى سجل إنشاء جهاز الإرساء:
المقدمة الأولى إلى Docker - 7
وما يهمنا هنا هو ما يلي. ما هو Boot2Docker؟ هذا توزيع Linux بسيط لتشغيل محرك Docker (نحن ندرك أن Docker يعمل بفضل أدوات المحاكاة الافتراضية لنظام التشغيل Linux، وفي نظام التشغيل Windows ظهرت الآلية اللازمة بدءًا من نظام التشغيل Windows 10 فقط). يعتمد هذا التوزيع على توزيعة " Tiny Core Linux ". ذكر أيضًا عن VirtualBox VM. هذا لأننا حددنا --driver virtualbox. تم إنشاء جهاز افتراضي جديد في VirtualBox من صورة Boot2Docker. بعد الإنشاء، يمكننا تشغيل VirtualBox (نظرًا لأن VirtualBox مثبت مع Docker Toolbox) ورؤية الجهاز الظاهري الذي تم إنشاؤه لجهاز الإرساء:
المقدمة الأولى إلى Docker - 8
بعد الإنشاء، سيُطلب منا تشغيل الأمر " docker-machine env " للحصول على متغيرات البيئة التي يجب تهيئتها للاتصال بجهاز الإرساء:
المقدمة الأولى إلى Docker - 9
بعد تنفيذ هذا الأمر باستخدام docker-machine، نتصل بمضيف مُرسى عن بعد (في هذه الحالة، مضيف افتراضي مستضاف على Virtual Box) ويمكننا تنفيذ أوامر docker محليًا كما لو كنا ننفذها على مضيف بعيد. للتحقق، يمكننا تشغيل الأمر " معلومات عامل الإرساء ". إذا لم يتم إنشاء الاتصال بجهاز الإرساء، فسنتلقى خطأً. وإذا كان كل شيء على ما يرام، معلومات حول عامل الإرساء على جهاز الإرساء. حان الوقت الآن لفهم كيفية عمل Docker بشكل عام وكيفية استخدامه.
المقدمة الأولى إلى Docker - 10

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

لذلك لدينا عامل ميناء. ما هو عامل الإرساء هذا على أي حال؟ ستساعدنا وثائق Docker وقسم " البدء " على فهم ذلك . يقدم الجزء التمهيدي من هذا القسم مفاهيم Docker . تنص على أن Docker عبارة عن منصة لتطوير التطبيقات وتصحيح أخطائها وتشغيلها في الحاويات. لذلك، فإن الشيء الرئيسي بالنسبة لـ Docker هو الحاويات. حتى لو نظرت إلى شعار عامل الإرساء، فهو حوت يحمل حاويات على ظهره. ولكن ما هي الحاوية؟ بعد ذلك، في قسم " الصور والحاويات "، يُذكر أن الحاوية هي نسخة قيد التشغيل من الصورة. والصورة عبارة عن "حزمة" تحتوي على كل ما هو ضروري للتطبيق (الرمز والبيئة والمكتبات والإعدادات وما إلى ذلك). الآن دعونا نحاول ذلك بأنفسنا. يحتوي موقع Docker على قسم يسمى " نماذج Docker " والذي يتضمن " Docker for Beginners ". الأمثلة من هنا تبدو أكثر إثارة للاهتمام بالنسبة لي. لذلك، أردنا فجأة التعرف على Alpine Linux ويمكننا القيام بذلك باستخدام حاويات Docker. للحصول على صورة، يجب علينا "سحبها" أو "سحبها" للخارج. لذلك، نقوم بتنفيذ أمر docker pull :docker pull apline
المقدمة الأولى إلى Docker - 11
كما نرى، نقوم بالتنزيل من مكان ما. افتراضيًا، يفحص Docker مستودعه الموجود على الشبكة https://hub.docker.com . بعد استرداد الصورة بنجاح، يمكننا التحقق من قائمة الصور المتاحة عن طريق تشغيل أمر docker Images :
المقدمة الأولى إلى Docker - 12
الآن لدينا صورة أبلين. نظرًا لأن الحاوية عبارة عن نسخة قيد التشغيل من الصورة، فلنقم بتشغيل هذه الصورة بالذات. لنبدأ بتشغيل الحاوية باستخدام الأمر docker run alpine. وكما نرى، لم يحدث شيء. إذا قمنا بتنفيذ الأمر docker psلعرض جميع الحاويات النشطة، فلن نحصل أيضًا على شيء. ولكن إذا قمنا بالتنفيذ، docker ps -aفسنرى جميع الحاويات:
التعارف الأول مع دوكر - 13
الشيء هو أننا لم نطلق Docker في الوضع التفاعلي. ولذلك نفذ الأمر وتوقف. كان الأمر لفتح المحطة. لنفعل نفس الشيء، ولكن في الوضع التفاعلي (باستخدام العلامة -it ):
المقدمة الأولى إلى Docker - 14
كما ترون، بعد التغلب على خطأ واحد واستخدام التلميح، وصلنا إلى الحاوية ويمكننا العمل فيها! للخروج من الحاوية دون إيقاف تشغيلها، يمكنك الضغط على Ctrl + p + q. إذا قمنا بالتشغيل الآن docker ps، فسنرى حاوية واحدة نشطة. للدخول إلى حاوية قيد التشغيل بالفعل، قم بتشغيل الأمر docker exec :
التعارف الأول مع دوكر - 15
أوصي بقراءة وصف نموذج Docker للحصول على وصف ممتاز لكيفية حدوث كل هذا: " 1.0 تشغيل حاويتك الأولى ". يعجبني ذلك لأن كل شيء مكتوب هناك بطريقة يسهل الوصول إليها ومفهومة للغاية. لإعادة الصياغة بإيجاز، نحن متصلون باستخدام جهاز الإرساء بجهاز افتراضي يقوم بتشغيل Docker Daemon. باستخدام CLI عبر REST API، نطلب تشغيل صورة جبال الألب. يعثر عليه Docker وبالتالي لا يقوم بتنزيله. يقوم Docker بإنشاء حاوية جديدة ويقوم بتشغيل الأمر الذي حددناه في هذه الحاوية. وكل هذا بالطبع جيد. ولكن لماذا نحتاج كل هذا؟ وهنا نحتاج إلى معرفة كيفية إنشاء عامل الإرساء للصورة. ويقوم بإنشائها بناءً على ملف الإرساء.
المقدمة الأولى إلى Docker - 16

ملف الإرساء

كما هو مذكور في مرجع Dockerfile ، ملف dockerfile هو ملف نصي يحتوي على كافة الأوامر للحصول على صورة. في الواقع، تم إنشاء جميع الصور التي نتلقاها (حتى Alpine، من المثال أعلاه) من ملف dockerfile. دعونا نبني صورتنا باستخدام تطبيق Java. ونحتاج أولاً إلى تطبيق Java هذا. أقترح استخدام نظام بناء Gradle، والذي يمكنك قراءة المزيد عنه في هذه المراجعة القصيرة: " مقدمة موجزة عن Gradle ". سوف يساعدنا في إنشاء مشروع " Gradle Build init plugin ". لنقم بإنشاء تطبيق Java جديد باستخدام Gradle: gradle init --type java-application يقوم هذا الأمر بإنشاء مشروع Java للقالب. هذا تطبيق مستقل، لكننا نرغب في إنشاء تطبيق ويب. لنقم بإزالة فئتي App وAppTest (تم إنشاؤها تلقائيًا بواسطة Gradle Build Init Plugin). لإنشاء تطبيق ويب بسرعة، سنستخدم البرنامج التعليمي من Gradle: " إنشاء تطبيقات ويب Java ". وفقا للبرنامج التعليمي، دعونا نفعل: عليك أن تكون حذرا هنا. كما هو الحال دائمًا، قد تكون هناك أخطاء في الأمثلة. ها هو:
المقدمة الأولى إلى Docker - 17
الآن، لاختباره، دعنا نضيف المكون الإضافي الرائع إلى build.gradle، كما هو موضح في قسم " إضافة المكون الإضافي الرائع وتشغيل التطبيق ":
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
من المثير للاهتمام أن جريتي لا ترى الخطأ في HelloServlet، الموضح أعلاه. وهذا يثبت أن التطبيق يمكن أن يتصرف بشكل مختلف في بيئات مختلفة. يمكن لـ Gretty العمل حيث قد يتسبب الخادم المستقل العادي في حدوث خطأ. كل ما تبقى هو التأكد من أن التطبيق يعمل بشكل صحيح. دعنا نفعل:gradle appRun
التعارف الأول مع دوكر - 18
إذا كان كل شيء على ما يرام، فاستخدم الأمر gradle warلتجميع الأرشيف باستخدام حرب الامتداد (أرشيف الويب). افتراضيًا، يقوم gradle بإنشائه في ملف \build\libs. الآن، نحن على استعداد لكتابة ملف الإرساء الخاص بنا. باستخدام " مرجع Dockerfile " سنقوم بإنشاء ملف Dockerfile. لنقم بإنشاء ملف يسمى "Dockerfile" في جذر مشروع Java الخاص بنا (في نفس مكان البرنامج النصي للإنشاء). دعونا نفتحه للتحرير. هذا الملف له تنسيقه الخاص، الموضح في قسم " مرجع ملف Docker: التنسيق ". يبدأ أي ملف إرساء ببيان FROM، يشير إلى "الصورة الأساسية". يمكننا القول أن هذه هي الصورة الأم التي على أساسها نصنع صورتنا. من السهل جدًا علينا اختيار صورة الوالدين. يحتاج تطبيق الويب إلى خادم ويب. على سبيل المثال، يمكننا استخدام خادم الويب Tomcat. نذهب إلى مستودع Docker الرسمي، والذي يسمى docker hub . ننظر هناك لنرى ما إذا كانت الصورة التي نحتاجها موجودة هناك:
التعارف الأول مع دوكر - 19
ومن الجدير أيضًا أن نفهم أن صورة القط تسمى. ولكن إلى جانب الاسم لديه علامة. العلامة تشبه الإصدار. تختلف صور Tomcat ذات الإصدارات المختلفة في إصدار Tomcat المستخدم وإصدار jre والصورة الأساسية. على سبيل المثال، يمكننا الحصول على صورة docker pull tomcat:9-jre8-alpine تستخدم الإصدار 9 من Tomcat، والإصدار 8 من jre وصورة جبال الألب كقاعدة. قد يكون هذا مهمًا لتقليل حجم صورتنا:
التعارف الأول مع دوكر - 20
وكما نرى فإن الفرق كبير. إذا قمنا ببناء صورتنا على أساس Tomcata Alpine، فسنبدأ بـ 100 ميغابايت فقط، وليس بـ 600. وبناءً على ذلك، سنضيف المحتوى التالي إلى ملف الإرساء الذي تم إنشاؤه مسبقًا:
# Базовый образ, "наследуемся" от него
FROM tomcat:9-jre8-alpine
# Копируем из Build Context'а собранный web archive в каталог томката
COPY build/libs/docker.war /usr/local/tomcat/webapps/docker.war
# Меняем рабочий каталог на томкатовский
WORKDIR /usr/local/tomcat
# Открываем порт 8080 для контейнера, т.к. его слушает томкат
EXPOSE 8080
والآن لننفذ الأمر لبناء الصورة: docker build -t jrdocker ..
التعارف الأول مع دوكر - 21
-t- هذه علامة، أي ما نسميه الصورة المجمعة. تعني النقطة الموجودة في النهاية أننا نضيف الدليل الحالي (الدليل الذي يوجد به ملف dockerfile والذي قمنا بتشغيل الأمر منه) إلى Build context. Build context- هذا هو سياق تلك الملفات المتوفرة عند إنشاء ملف عامل إرساء. كما ترون، بفضل هذا تمكنا من نسخ ملف الحرب المجمع إلى صورتنا، إلى دليل خادم الويب. الآن لنقم بتشغيل صورتنا:docker run -d --rm -p 8888:8080 jrdocker
التعارف الأول مع دوكر - 22
لفهم ما إذا كان الخادم قد بدأ التشغيل، يمكنك إلقاء نظرة على السجل من الحاوية. يمكن الحصول على السجل باستخدام الأمر docker logs، مع تحديد الحاوية بمعرفها أو اسمها. على سبيل المثال:
التعارف الأول مع دوكر - 23
حسنًا، لا تنس أنه يمكننا دائمًا الانتقال إلى الحاوية قيد التشغيل بالاسم باستخدام الأمر: winpty docker exec -it NameКонтейнера sh الآن كل ما تبقى هو الاتصال. في السابق، حددنا EXPOSE ، أي أننا سمحنا بالوصول إلى المنفذ 8080 من داخل الحاوية، وعندما أطلقنا الحاوية نفسها، حددنا علامة -p ( incomingports )، وبالتالي ربط المنفذ 8080 بالحاوية (خادم الويب Tomcat ينتظر الاتصالات هناك) مع المنفذ 8888 على جهاز به برنامج خفي لرسو السفن. كما نتذكر، قمنا بإطلاق برنامج docker ليس بشكل مباشر، ولكن من خلال docker-machine. لذلك، سنطلب مرة أخرى بيانات عن أجهزة الإرساء الخاصة بنا باستخدام الأمر docker-machine ls ونتصل بالخادم الموجود في الحاوية:
المقدمة الأولى إلى Docker - 24
وهكذا، قمنا للتو بإطلاق تطبيق الويب الخاص بنا في حاوية Docker! ) وأود أيضا أن أشير إلى ما يلي. في حالة حدوث مشكلات في الوصول، يجب أن تتذكر أن جهاز Docker هو أولاً وقبل كل شيء جهاز افتراضي Virtual BOx. قد تكون هناك مشكلات في إعدادات شبكة الجهاز الظاهري. قد يبدو تكوين VMBox العامل كما يلي:
التعارف الأول مع دوكر - 25
التعارف الأول مع دوكر - 26

طبقات

لقد اكتشفنا بالفعل أن الصور يتم إنشاؤها من ملفات dockerfiles وأن ملفات dockerfiles عبارة عن مجموعة من الأوامر. لقد اكتشفنا أيضًا أن ملف الإرساء له أصل. وأن حجم الصور مختلف. ومن المثير للاهتمام أنه يمكنك رؤية تاريخ إنشاء الصورة باستخدام أمر docker History . على سبيل المثال:
التعارف الأول مع دوكر - 27
من المهم أن نقول هذا لنفهم أن كل صورة، في جوهرها، هي مجموعة من الصور. يؤدي كل تغيير في الصورة (كل أمر جديد في ملف الإرساء) إلى إنشاء طبقة جديدة لها معرفها الخاص. يمكنك قراءة المزيد حول الطبقات في الوثائق " Docker: Images and Layers ". أوصي أيضًا بشدة بقراءة المقال عن حبري: " صور وحاويات Docker في صور ".

خاتمة

آمل أن تكون هذه النظرة العامة القصيرة كافية لإثارة اهتمامك بالحاويات. فيما يلي روابط لمواد إضافية قد تكون مفيدة: # فياتشيسلاف
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION