إن النقل بالحاويات هو آلية تستخدم غالبًا في الممارسة العملية. على سبيل المثال، عند البحث في Headhunter، ستجد 477 وظيفة شاغرة حتى اليوم تذكر Docker. لذلك، لن تكون فكرة سيئة أن تتعرف على ماهيته. آمل أن تساعد هذه المراجعة القصيرة في تكوين الانطباع الأول. حسنًا، سيدعمه بمواد إضافية، مثل الدورات التدريبية على Udemy.
على نظام التشغيل Windows، يمكنك التحقق من ذلك بطرق مختلفة. على سبيل المثال، يمكنك تنزيل أداة مساعدة خاصة من موقع Microsoft على الويب: أداة الكشف عن المحاكاة الافتراضية بمساعدة الأجهزة . حسنًا، تجدر الإشارة إلى مفهوم مهم آخر - برنامج Hypervisor. برنامج Hypervisor هو جهاز مراقبة افتراضي، وهو برنامج لضمان التنفيذ المتوازي لعدة أنظمة تشغيل على نفس الكمبيوتر. يضمن برنامج Hypervisor عزل أنظمة التشغيل عن بعضها البعض ومشاركة الموارد بين أنظمة تشغيل التشغيل. أحد برامج Hypervisor هو Oracle VirtualBox .
تقول الوثائق أن عامل الإرساء يتكون من:
دعونا نصنع آلة جديدة. للقيام بذلك، نحتاج إلى تشغيل أمر الإنشاء :
وما يهمنا هنا هو ما يلي. ما هو Boot2Docker؟ هذا توزيع Linux بسيط لتشغيل محرك Docker (نحن ندرك أن Docker يعمل بفضل أدوات المحاكاة الافتراضية لنظام التشغيل Linux، وفي نظام التشغيل Windows ظهرت الآلية اللازمة بدءًا من نظام التشغيل Windows 10 فقط). يعتمد هذا التوزيع على توزيعة " Tiny Core Linux ". ذكر أيضًا عن VirtualBox VM. هذا لأننا حددنا
بعد الإنشاء، سيُطلب منا تشغيل الأمر " docker-machine env " للحصول على متغيرات البيئة التي يجب تهيئتها للاتصال بجهاز الإرساء:
بعد تنفيذ هذا الأمر باستخدام docker-machine، نتصل بمضيف مُرسى عن بعد (في هذه الحالة، مضيف افتراضي مستضاف على Virtual Box) ويمكننا تنفيذ أوامر docker محليًا كما لو كنا ننفذها على مضيف بعيد. للتحقق، يمكننا تشغيل الأمر " معلومات عامل الإرساء ". إذا لم يتم إنشاء الاتصال بجهاز الإرساء، فسنتلقى خطأً. وإذا كان كل شيء على ما يرام، معلومات حول عامل الإرساء على جهاز الإرساء. حان الوقت الآن لفهم كيفية عمل Docker بشكل عام وكيفية استخدامه.
كما نرى، نقوم بالتنزيل من مكان ما. افتراضيًا، يفحص Docker مستودعه الموجود على الشبكة https://hub.docker.com . بعد استرداد الصورة بنجاح، يمكننا التحقق من قائمة الصور المتاحة عن طريق تشغيل أمر docker Images :
الآن لدينا صورة أبلين. نظرًا لأن الحاوية عبارة عن نسخة قيد التشغيل من الصورة، فلنقم بتشغيل هذه الصورة بالذات. لنبدأ بتشغيل الحاوية باستخدام الأمر
الشيء هو أننا لم نطلق Docker في الوضع التفاعلي. ولذلك نفذ الأمر وتوقف. كان الأمر لفتح المحطة. لنفعل نفس الشيء، ولكن في الوضع التفاعلي (باستخدام العلامة -it ):
كما ترون، بعد التغلب على خطأ واحد واستخدام التلميح، وصلنا إلى الحاوية ويمكننا العمل فيها! للخروج من الحاوية دون إيقاف تشغيلها، يمكنك الضغط على
أوصي بقراءة وصف نموذج Docker للحصول على وصف ممتاز لكيفية حدوث كل هذا: " 1.0 تشغيل حاويتك الأولى ". يعجبني ذلك لأن كل شيء مكتوب هناك بطريقة يسهل الوصول إليها ومفهومة للغاية. لإعادة الصياغة بإيجاز، نحن متصلون باستخدام جهاز الإرساء بجهاز افتراضي يقوم بتشغيل Docker Daemon. باستخدام CLI عبر REST API، نطلب تشغيل صورة جبال الألب. يعثر عليه Docker وبالتالي لا يقوم بتنزيله. يقوم Docker بإنشاء حاوية جديدة ويقوم بتشغيل الأمر الذي حددناه في هذه الحاوية. وكل هذا بالطبع جيد. ولكن لماذا نحتاج كل هذا؟ وهنا نحتاج إلى معرفة كيفية إنشاء عامل الإرساء للصورة. ويقوم بإنشائها بناءً على ملف الإرساء.
الآن، لاختباره، دعنا نضيف المكون الإضافي الرائع إلى build.gradle، كما هو موضح في قسم " إضافة المكون الإضافي الرائع وتشغيل التطبيق ":
إذا كان كل شيء على ما يرام، فاستخدم الأمر
ومن الجدير أيضًا أن نفهم أن صورة القط تسمى. ولكن إلى جانب الاسم لديه علامة. العلامة تشبه الإصدار. تختلف صور Tomcat ذات الإصدارات المختلفة في إصدار Tomcat المستخدم وإصدار jre والصورة الأساسية. على سبيل المثال، يمكننا الحصول على صورة
وكما نرى فإن الفرق كبير. إذا قمنا ببناء صورتنا على أساس Tomcata Alpine، فسنبدأ بـ 100 ميغابايت فقط، وليس بـ 600. وبناءً على ذلك، سنضيف المحتوى التالي إلى ملف الإرساء الذي تم إنشاؤه مسبقًا:
لفهم ما إذا كان الخادم قد بدأ التشغيل، يمكنك إلقاء نظرة على السجل من الحاوية. يمكن الحصول على السجل باستخدام الأمر docker logs، مع تحديد الحاوية بمعرفها أو اسمها. على سبيل المثال:
حسنًا، لا تنس أنه يمكننا دائمًا الانتقال إلى الحاوية قيد التشغيل بالاسم باستخدام الأمر:
وهكذا، قمنا للتو بإطلاق تطبيق الويب الخاص بنا في حاوية Docker! ) وأود أيضا أن أشير إلى ما يلي. في حالة حدوث مشكلات في الوصول، يجب أن تتذكر أن جهاز Docker هو أولاً وقبل كل شيء جهاز افتراضي Virtual BOx. قد تكون هناك مشكلات في إعدادات شبكة الجهاز الظاهري. قد يبدو تكوين VMBox العامل كما يلي:
من المهم أن نقول هذا لنفهم أن كل صورة، في جوهرها، هي مجموعة من الصور. يؤدي كل تغيير في الصورة (كل أمر جديد في ملف الإرساء) إلى إنشاء طبقة جديدة لها معرفها الخاص. يمكنك قراءة المزيد حول الطبقات في الوثائق " Docker: Images and Layers ". أوصي أيضًا بشدة بقراءة المقال عن حبري: " صور وحاويات Docker في صور ".
مقدمة
في هذه المراجعة القصيرة أود أن أتطرق إلى موضوع مثل النقل بالحاويات. وعليك أن تبدأ بفهم ماهية النقل بالحاويات في الواقع. وفقًا لويكيبيديا، " الحاويات " هي محاكاة افتراضية على مستوى نظام التشغيل (أي ليس الأجهزة) حيث تحتفظ نواة نظام التشغيل بمثيلات متعددة لمساحة المستخدم المعزولة بدلاً من نسخة واحدة فقط. " مساحة المستخدم " هي مساحة عنوان الذاكرة الظاهرية لنظام التشغيل المحجوزة لبرامج المستخدم. مثيلات مساحة المستخدم (تسمى عادةً الحاويات) متطابقة تمامًا مع مثيل نظام تشغيل واحد من وجهة نظر المستخدم. تضمن النواة عزلًا كاملاً للحاويات، بحيث لا يمكن للبرامج من حاويات مختلفة أن تؤثر على بعضها البعض. اتضح أن الحاويات هي المحاكاة الافتراضية للبرمجيات، أي المحاكاة الافتراضية على مستوى نظام التشغيل، والتي تكون نواة نظام التشغيل مسؤولة عنها. إحدى السمات المميزة لهذا الأسلوب هي أن جميع الحاويات تستخدم نواة مشتركة، مثل نظام التشغيل المضيف (أي النظام الذي توجد عليه الحاويات). يتيح لك ذلك التخلص من العبء الزائد لمحاكاة الأجهزة الافتراضية وإطلاق نسخة كاملة من نظام التشغيل. يمكننا القول أن هذه محاكاة افتراضية "خفيفة الوزن". النواة هي الجزء المركزي من نظام التشغيل الذي يوفر للتطبيقات وصولاً منسقًا إلى موارد الكمبيوتر، مثل وقت المعالج والذاكرة والأجهزة الخارجية وأجهزة الإدخال والإخراج الخارجية. توفر النواة أيضًا عادةً خدمات نظام الملفات وبروتوكول الشبكة. بشكل عام، هذا هو قلب النظام بأكمله. للحصول على معلومات إضافية، قد يكون من المفيد مراجعة المادة " معلومات عامة عن الحاويات ". وبضع كلمات أخرى لإكمال المقدمة. لقد فهمنا الآن أن نظام التشغيل يحتوي على نواة. يوفر العزلة لمثيلات مساحة المستخدم. في هذا السياق، قد تصادف مصطلح " مجموعات التحكم ". هذا هو اسم آلية Linux kernel التي تسمح لك بتحقيق ذلك. لذلك يمكننا القول أن مسار الحاويات بدأ مع أنظمة Linux. ومع ذلك، بدءًا من نظام التشغيل Windows 10، ظهر أيضًا دعم النقل بالحاويات. للعمل مع المحاكاة الافتراضية، تحتاج إلى تكوين دعم المحاكاة الافتراضية في BIOS لجهاز الكمبيوتر الخاص بك. كيفية القيام بذلك تعتمد على الكمبيوتر. على سبيل المثال، قد يبدو الأمر كما يلي:عامل ميناء
لذلك، ما هي المحاكاة الافتراضية واضح. لكن كيف تستخدمه؟ وهنا يأتي دوكر لمساعدتنا. Docker هو برنامج لأتمتة نشر وإدارة التطبيقات في البيئات الحاوية. يجدر بنا أن نبدأ بحقيقة أن Docker يمثلها مفهوم مثل Docker Enginge. ويجب أن تبدأ بموقع Docker الرسمي وقسم " نظرة عامة على Docker ".- يسمى خادم Docker عملية Docker Daemon (dockerd).
- واجهة سطر الأوامر، والمعروفة أيضًا باسم CLI (عامل الإرساء).
- واجهة برمجة تطبيقات REST التي تصف كيف يمكن للبرامج "التحدث" مع برنامج Deamon وإخباره بما يجب عليه فعله.
صندوق أدوات عامل الميناء
لتثبيت 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-machine create -- driver virtualbox javarush
: سنرى سجل إنشاء جهاز الإرساء:
--driver virtualbox
. تم إنشاء جهاز افتراضي جديد في VirtualBox من صورة Boot2Docker. بعد الإنشاء، يمكننا تشغيل VirtualBox (نظرًا لأن VirtualBox مثبت مع Docker Toolbox) ورؤية الجهاز الظاهري الذي تم إنشاؤه لجهاز الإرساء:
حاويات عامل الميناء
لذلك لدينا عامل ميناء. ما هو عامل الإرساء هذا على أي حال؟ ستساعدنا وثائق Docker وقسم " البدء " على فهم ذلك . يقدم الجزء التمهيدي من هذا القسم مفاهيم Docker . تنص على أن Docker عبارة عن منصة لتطوير التطبيقات وتصحيح أخطائها وتشغيلها في الحاويات. لذلك، فإن الشيء الرئيسي بالنسبة لـ Docker هو الحاويات. حتى لو نظرت إلى شعار عامل الإرساء، فهو حوت يحمل حاويات على ظهره. ولكن ما هي الحاوية؟ بعد ذلك، في قسم " الصور والحاويات "، يُذكر أن الحاوية هي نسخة قيد التشغيل من الصورة. والصورة عبارة عن "حزمة" تحتوي على كل ما هو ضروري للتطبيق (الرمز والبيئة والمكتبات والإعدادات وما إلى ذلك). الآن دعونا نحاول ذلك بأنفسنا. يحتوي موقع Docker على قسم يسمى " نماذج Docker " والذي يتضمن " Docker for Beginners ". الأمثلة من هنا تبدو أكثر إثارة للاهتمام بالنسبة لي. لذلك، أردنا فجأة التعرف على Alpine Linux ويمكننا القيام بذلك باستخدام حاويات Docker. للحصول على صورة، يجب علينا "سحبها" أو "سحبها" للخارج. لذلك، نقوم بتنفيذ أمر docker pull :docker pull apline
docker run alpine
. وكما نرى، لم يحدث شيء. إذا قمنا بتنفيذ الأمر docker ps
لعرض جميع الحاويات النشطة، فلن نحصل أيضًا على شيء. ولكن إذا قمنا بالتنفيذ، docker ps -a
فسنرى جميع الحاويات:
Ctrl + p + q
. إذا قمنا بالتشغيل الآن docker ps
، فسنرى حاوية واحدة نشطة. للدخول إلى حاوية قيد التشغيل بالفعل، قم بتشغيل الأمر docker exec :
ملف الإرساء
كما هو مذكور في مرجع 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 ". وفقا للبرنامج التعليمي، دعونا نفعل:
- دعونا نفتح البرنامج النصي للبناء build.gradle ونصححه وفقًا للقسم: " إضافة ملف بناء Gradle ".
- لنقم بإضافة صفحات إلى src/main/webapp كما هو موضح في قسم " إضافة صفحات JSP إلى التطبيق التجريبي ".
- لنقم بإضافة فصل دراسي
HelloServlet
بالمحتوى من قسم " إضافة servlet وبيانات التعريف إلى المشروع ".
plugins {
id 'war'
id 'org.gretty' version '2.2.0'
}
من المثير للاهتمام أن جريتي لا ترى الخطأ في HelloServlet
، الموضح أعلاه. وهذا يثبت أن التطبيق يمكن أن يتصرف بشكل مختلف في بيئات مختلفة. يمكن لـ Gretty العمل حيث قد يتسبب الخادم المستقل العادي في حدوث خطأ. كل ما تبقى هو التأكد من أن التطبيق يعمل بشكل صحيح. دعنا نفعل:gradle appRun
gradle war
لتجميع الأرشيف باستخدام حرب الامتداد (أرشيف الويب). افتراضيًا، يقوم gradle بإنشائه في ملف \build\libs
. الآن، نحن على استعداد لكتابة ملف الإرساء الخاص بنا. باستخدام " مرجع Dockerfile " سنقوم بإنشاء ملف Dockerfile. لنقم بإنشاء ملف يسمى "Dockerfile" في جذر مشروع Java الخاص بنا (في نفس مكان البرنامج النصي للإنشاء). دعونا نفتحه للتحرير. هذا الملف له تنسيقه الخاص، الموضح في قسم " مرجع ملف Docker: التنسيق ". يبدأ أي ملف إرساء ببيان FROM، يشير إلى "الصورة الأساسية". يمكننا القول أن هذه هي الصورة الأم التي على أساسها نصنع صورتنا. من السهل جدًا علينا اختيار صورة الوالدين. يحتاج تطبيق الويب إلى خادم ويب. على سبيل المثال، يمكننا استخدام خادم الويب Tomcat. نذهب إلى مستودع Docker الرسمي، والذي يسمى docker hub . ننظر هناك لنرى ما إذا كانت الصورة التي نحتاجها موجودة هناك:
docker pull tomcat:9-jre8-alpine
تستخدم الإصدار 9 من Tomcat، والإصدار 8 من jre وصورة جبال الألب كقاعدة. قد يكون هذا مهمًا لتقليل حجم صورتنا:
# Базовый образ, "наследуемся" от него
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 .
.
-t
- هذه علامة، أي ما نسميه الصورة المجمعة. تعني النقطة الموجودة في النهاية أننا نضيف الدليل الحالي (الدليل الذي يوجد به ملف dockerfile والذي قمنا بتشغيل الأمر منه) إلى Build context
. Build context
- هذا هو سياق تلك الملفات المتوفرة عند إنشاء ملف عامل إرساء. كما ترون، بفضل هذا تمكنا من نسخ ملف الحرب المجمع إلى صورتنا، إلى دليل خادم الويب. الآن لنقم بتشغيل صورتنا:docker run -d --rm -p 8888:8080 jrdocker
winpty docker exec -it NameКонтейнера sh
الآن كل ما تبقى هو الاتصال. في السابق، حددنا EXPOSE ، أي أننا سمحنا بالوصول إلى المنفذ 8080 من داخل الحاوية، وعندما أطلقنا الحاوية نفسها، حددنا علامة -p ( incomingports )، وبالتالي ربط المنفذ 8080 بالحاوية (خادم الويب Tomcat ينتظر الاتصالات هناك) مع المنفذ 8888 على جهاز به برنامج خفي لرسو السفن. كما نتذكر، قمنا بإطلاق برنامج docker ليس بشكل مباشر، ولكن من خلال docker-machine. لذلك، سنطلب مرة أخرى بيانات عن أجهزة الإرساء الخاصة بنا باستخدام الأمر docker-machine ls ونتصل بالخادم الموجود في الحاوية:
طبقات
لقد اكتشفنا بالفعل أن الصور يتم إنشاؤها من ملفات dockerfiles وأن ملفات dockerfiles عبارة عن مجموعة من الأوامر. لقد اكتشفنا أيضًا أن ملف الإرساء له أصل. وأن حجم الصور مختلف. ومن المثير للاهتمام أنه يمكنك رؤية تاريخ إنشاء الصورة باستخدام أمر docker History . على سبيل المثال:خاتمة
آمل أن تكون هذه النظرة العامة القصيرة كافية لإثارة اهتمامك بالحاويات. فيما يلي روابط لمواد إضافية قد تكون مفيدة:- أفضل الممارسات لكتابة ملفات Dockerfiles
- حاوية على مضيف بعيد باستخدام Docker Machine
- مقال حبري " عامل الميناء. البداية "
- مقال حبري " تحسين صور Docker ".
- Udemy: " البدء مع Docker "
- يوتيوب: " دروس دوكر من الألف إلى الياء "
- ميزات برنامج Docker [GeekBrains]
GO TO FULL VERSION