مدونة عمار الخوالده

أساسيات الصور والحاويات - Images and Containers


أساسيات الصور والحاويات - Images and Containers
سلسلة أساسيات Docker

مفهوم الصورة والحاوية - Image & Container

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

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

الصورة التالية توضح مثالا على العلاقة بين الصورة والحاوية:

العلاقة بين الصورة والحاوية

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

Docker Registery

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

الـ Registery الافتراضية في Docker هي Docker Hub وغالبا ستغطي معظم احتياجاتك، فهي تحتوي على عدد كبير من الصور المنشورة للعموم ويمكن الوصول لها دون الاحتياج لصلاحيات خاصة.

يمكنك تصفح Docker Hub والبحث عن الصور الموجودة لأي تقنية أو نظام يخطر ببالك.

بدء التعامل مع أوامر Docker

أولا سنقوم بإعطاء أمثلة على إنشاء حاوية من صورة لنظام Ubuntu ونوضح خلالها طريقة استخدام بعض الأوامر.

في Docker Hub يمكنك تصفح تفاصيل أي Image مرفوعة على الـ Registery الخاص بهم من خلال الموقع مباشرة، صورة Ubuntu المستخدمة موجودة على هذا الرابط: https://hub.docker.com/_/ubuntu

لتحميل الصورة على الجهاز، يتم استخدام الأمر pull:

1docker pull ubuntu

قد يحتاج لبعض الوقت حتى يتم تحميل الصورة، نفذ الأمر docker images لمعرفة تفاصيل الصور المثبتة على جهازك:

نتيجة الأمر docker images

نلاحظ في الجدول السابق وجود Tag بجانب كل صورة، الـ Tag يمثل النسخة الخاصة بالصورة، يمكن التفكير بها على أنها فرع (Branch) مستقل، في العادة يتم استخدامه لتحديد نسخ البرنامج المستخدم في دوكر، وقد يتم استخدامه لأغراض أخرى مثل عمل أكثر من Tag وكل واحد يحتوي إعدادات مختلفة عن الآخر، الافتراضي دائما هو latest وفي الغالب يرمز لآخر نسخة من الخدمة أو البرنامج الذي تقدمه الحاوية.

على سبيل المثال، قم بتنفيذ الأمر التالي مع تحديد الـ Tag:

1docker pull ubuntu:18.04

عند تنفيذ docker images ستلاحظ وجود أكثر من نسخة من صورة ubuntu بـ Tags مختلفة:

الصور الموجودة بعد تنصيب ubuntu بنسخة 18.04

لنجرب الآن تشغيل حاوية ubuntu وتنفيذ أوامر بسيطة من داخلها.

1docker run ubuntu ls -l

الأمر run يقوم بتشغيل الحاوية مع تنفيذ أمر داخلها، وفي هذه الحالة اخترنا تنفيذ الأمر ls لعرض الملفات،

نتيجة تنفيذ أمر عرض الملفات ls داخل حاوية Docker

لاحظ أن نتيجة الأمر السابق عرضت الملفات الموجودة داخل الحاوية، بتنفيذ ls بشكل طبيعي سيظهر الملفات الموجودة على جهازك:

تنفيذ أمر ls في سطر أوامر Linux

من هنا نلاحظ أن الملفات في الحاوية مختلفة عن الملفات في جهازك ولا علاقة بينهما.

الأمر run وإنشاء الحاويات

جرب الآن تنفيذ الأمر التالي:

1docker run ubuntu touch abc.txt

هذا الأمر سيقوم بإنشاء ملف جديد باسم abc.txt، لو نفذنا الآن الأمر ls -l داخل دوكر:

1docker run ubuntu ls -l

ستلاحظ أن الملف abc.txt غير موجود!

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

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

صورة توضح نتيجة الأمر docker ps

لكن إذا أضفنا خيار -a سيظهر الحاويات التي تم تشغيلها وإن كانت متوقفة حاليا:

صورة توضح نتيجة الأمر docker ps -a

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

الحاوية رقم 1 تم فيها تنفيذ الأمر ls -l أما الحاوية رقم 2 قمنا فيها بإنشاء ملف جديد وبعدها في الحاوية رقم 3 نفذنا الأمر ls مرة أخرى، وبما أن الأمر ls تم تنفيذه في حاوية مختلفة فلم يظهر الملف الجديد.

يمكن مشاركة الملفات بين الحاويات المختلفة وبين الحاويات والنظام المستضيف (Host) باستخدام ميزة الـ (Volumes) في دوكر، وسيتم شرحها في دروس قادمة.

الاستفادة من Docker في تشغيل برنامج غير موجود على الجهاز

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

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

صورة لنتيجة تنفيذ الأمر cowsay في حال عدم وجوده على لجهاز

هذا البرنامج موجود داخل صورة باسم msoap/ascii-art، وهذه نتيجة تنفيذ الأمر داخل دوكر:

صورة توضيحية لتنفيذ الأمر cowsay باستخدام docker

لاحظ أن الصورة غير موجودة على الجهاز، وبعد تنفيذ الأمر docker run قام أولا بعملية pull، وبعد الانتهاء تم تنفيذ النتيجة وعرض الأمر.

طبعا لا يقتصر الأمر على تشغيل برامج بسيطة مثل cowsay بل يمكن استغلال دوكر في تشغيل أنظمة كاملة مثل Wordpress أو الاستفادة من أوامر معينة مثل php أو npm مع إدارة واختيار النسخ الخاصة بها دون الحاجة لوجودها على جهازك.

في الدرس القادم سيتم إعطاء مثال عملي على تشغيل مشروع بسيط باستخدام PHP مع التطرق لبعض المفاهيم المتعلقة بمشاركة الملفات بين الحاويات والـ Networking في دوكر بشكل مبسط.

1 مقدمة عن أداة Docker وفوائدها وحالات استخدامها
3 مفهوم الـ Volumes في Docker مع مثال على استخدام PHP CLI

اقرأ أيضا