أساسيات الصور والحاويات - Images and Containers
مفهوم الصورة والحاوية - 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
لمعرفة تفاصيل الصور المثبتة على جهازك:
نلاحظ في الجدول السابق وجود Tag بجانب كل صورة، الـ Tag يمثل النسخة الخاصة بالصورة، يمكن التفكير بها على أنها فرع (Branch) مستقل، في العادة يتم استخدامه لتحديد نسخ البرنامج المستخدم في دوكر، وقد يتم استخدامه لأغراض أخرى مثل عمل أكثر من Tag وكل واحد يحتوي إعدادات مختلفة عن الآخر، الافتراضي دائما هو latest وفي الغالب يرمز لآخر نسخة من الخدمة أو البرنامج الذي تقدمه الحاوية.
على سبيل المثال، قم بتنفيذ الأمر التالي مع تحديد الـ Tag:
1docker pull ubuntu:18.04
عند تنفيذ docker images
ستلاحظ وجود أكثر من نسخة من صورة ubuntu بـ Tags مختلفة:
لنجرب الآن تشغيل حاوية ubuntu وتنفيذ أوامر بسيطة من داخلها.
1docker run ubuntu ls -l
الأمر run يقوم بتشغيل الحاوية مع تنفيذ أمر داخلها، وفي هذه الحالة اخترنا تنفيذ الأمر ls لعرض الملفات،
لاحظ أن نتيجة الأمر السابق عرضت الملفات الموجودة داخل الحاوية، بتنفيذ ls
بشكل طبيعي سيظهر الملفات الموجودة على جهازك:
من هنا نلاحظ أن الملفات في الحاوية مختلفة عن الملفات في جهازك ولا علاقة بينهما.
الأمر run وإنشاء الحاويات
جرب الآن تنفيذ الأمر التالي:
1docker run ubuntu touch abc.txt
هذا الأمر سيقوم بإنشاء ملف جديد باسم abc.txt
، لو نفذنا الآن الأمر ls -l
داخل دوكر:
1docker run ubuntu ls -l
ستلاحظ أن الملف abc.txt
غير موجود!
السبب في ذلك أن الأمر docker run
يقوم بإنشاء حاوية جديدة معزولة عن غيرها في كل مرة، وكما اتضح لنا سابقا، فإن لكل حاوية نظام ملفات خاص بها وهو معزول عن باقي الحاويات أو عن النظام المُستضيف.
لنتعرف الآن على الأمر docker ps
، هذا الأمر يستخدم لمعرفة الحاويات التي تعمل حاليا، إذا قمت بتنفيذه سيعطيك نتيجة فارغة بالغالب لأن الحاويات التي قمنا بتشغيلها كلها توقفت عن العمل بعد انتهاء الأوامر التي تم تمريرها لها:
لكن إذا أضفنا خيار -a
سيظهر الحاويات التي تم تشغيلها وإن كانت متوقفة حاليا:
لاحظ أن الحاويات الثلاثة التي شغلناها خلال الأمثلة في هذا المقال، تحتوي على أرقام تعريفية مختلفة (Container ID) ولاحظ أيضا أن دوكر تقوم بإعطاء اسم لكل حاوية بشكل عشوائي في حال لم تقم بتحديد اسم خلال تشغيل الحاوية.
الحاوية رقم 1 تم فيها تنفيذ الأمر ls -l
أما الحاوية رقم 2 قمنا فيها بإنشاء ملف جديد وبعدها في الحاوية رقم 3 نفذنا الأمر ls
مرة أخرى، وبما أن الأمر ls
تم تنفيذه في حاوية مختلفة فلم يظهر الملف الجديد.
يمكن مشاركة الملفات بين الحاويات المختلفة وبين الحاويات والنظام المستضيف (Host) باستخدام ميزة الـ (Volumes) في دوكر، وسيتم شرحها في دروس قادمة.
الاستفادة من Docker في تشغيل برنامج غير موجود على الجهاز
الأمثلة السابقة كانت عبارة عن تنفيذ أمر داخل نظام تشغيل في حاوية، لكن دوكر لا يقتصر فقط على إنشاء حاويات لأنظمة التشغيل، بل إن من أهم فوائد دوكر هي تنفيذ برامج داخل حاويات دون الحاجة لتحميل هذه البرامج على جهازك.
على سبيل المثال سنقوم بمحاولة تشغيل برنامج cowsay
باستخدام دوكر، تلاحظ في الصورة التالية أن البرنامج غير موجود على جهازي أصلا:
هذا البرنامج موجود داخل صورة باسم msoap/ascii-art
، وهذه نتيجة تنفيذ الأمر داخل دوكر:
لاحظ أن الصورة غير موجودة على الجهاز، وبعد تنفيذ الأمر docker run
قام أولا بعملية pull
، وبعد الانتهاء تم تنفيذ النتيجة وعرض الأمر.
طبعا لا يقتصر الأمر على تشغيل برامج بسيطة مثل cowsay
بل يمكن استغلال دوكر في تشغيل أنظمة كاملة مثل Wordpress أو الاستفادة من أوامر معينة مثل php
أو npm
مع إدارة واختيار النسخ الخاصة بها دون الحاجة لوجودها على جهازك.
في الدرس القادم سيتم إعطاء مثال عملي على تشغيل مشروع بسيط باستخدام PHP مع التطرق لبعض المفاهيم المتعلقة بمشاركة الملفات بين الحاويات والـ Networking في دوكر بشكل مبسط.