أحد المميزات في دوكر Docker هي سهولة تشغيل البرامج بدون خطوات وتعقيدات كثيرة في التنزيل، وهذا الأمر سوف نستخدمه كثيراً لتحميل البرامج التي نحتاجها لاستضافة مواقعنا مثل nginx أو IIS وايضاً لتشغيل أي Command Line Application أخر.
في هذا الموضوع سوف نقوم بتشغيل عدة برامج من سطر الأوامر Command Line ومنها نتعرف على بعض الأمور في دوكر وال Containers، خصوصاً ما يجري بداخل ال Container Image، وكيف يمكن مشاركة مجلدات او ملفات بين نظام التشغيل الأساسي مع ال Container ولماذا نحتاج لذلك.
المواضيع في السلسلة:
- مقدمة حول دوكر Docker
- البداية مع دوكر Docker
- مشاركة المجلدات في دوكر Docker (الموضوع الحالي)
- بناء ال Docker Images
- تشغيل قواعد البيانات في دوكر Database in Docker
- تشغيل البرامج باستخدام ال Docker Compose
ذكرنا في المواضيع السابقة أن كل ال User Space تكون بداخل ال Container Image سواءً كان نظام الملفات أو المكتبات الخاصة بنظام التشغيل وايضاً بعض البرامج الأخرى، كلها تكون بداخل وعاء ال Image، كما في الصورة التالية:
سوف نقوم الآن بالتأكد من ذلك وسحب image ومشاهدة محتواها، وسوف نقوم اولاً بمعرفة ال Images التي لدينا على الجهاز، وذلك من خلال الأمر docker images:
وسوف نعمل على ال iis image فهي الأقل حجماً، واذا لم تكن لديك فيمكن تحميلها من خلال الأمر docker pull microsoft/iis:nanoserver وسيتم تحميلها.
الآن سوف نستخدم أمر تصدير ال image الى ملف .tar مضغوط حتى نستطيع فكه ومشاهدة محتوياته، وذلك من خلال الأمر docker save image كما يلي:
بعد الانتهاء من التصدير سوف تجد الملف المضغوط الذي قمت بتصديره في المسار المحدد، كما يلي:
سوف نحتاج الى فك الضغط من ذلك الملف، وسوف تحتاج لبرنامج لفك الضغط، ولأن نظام الويندوز لا يدعم ذلك الملف، فيمكنك تحميل أي برنامج للقيام بفك الملف مثلاً WinRAR أو 7zip أو أن تستفيد من دوكر وتقوم بتشغيل Linux Container وظيفته فك الملف من الضغط، وهذا ما سنفعله حيث أن فكرة تشغيل برامج نظام تشغيل آخر لكي تقوم ببعض العمليات مثل فك الضغط من خلال أمر واحد وكأن البرنامج يعمل على جهازك الحالي هي من الأفكار الجميلة في دوكر.
كل أنظمة تشغيل لينوكس تأتي ب tar command line لضغط وفك الملفات وسوف نستخدم هذا البرنامج بداخل ال Linux container للقيام بهذا الأمر.
لذلك سنقوم أولاً بالتحويل الى ال Linux Containers وذلك بالضغط على ايقونة دوكر بالأسفل ومن ثم اختيار Switch to Linux Containers، وبعد التحويل تستطيع تجربة مشاهدة ال docker images وسترى لديك ال images الخاصة باللينوكس.
سوف نحتاج الى image بها برامج لينوكس ويمكن تحميل أي من Linux images وسوف نختار ubuntu وسوف نقوم بتحميل ال image من المصدر الأصلي لها official حتى نضمن أنها من المصدر الأصلي ولا يوجد بها أي تعديلات.
سنقوم بتحميلها من خلال الأمر docker pull ubuntu ومن ثم التأكد من أن ال image أصبحت موجودة لدينا:
الان سنقوم بتشغيل ال container من هذه ال image وسوف نقوم بفتح برنامج ال shell وهو سطر الأوامر في لينوكس، وسوف نقوم بكتابة امر فك الضغط من الملف حتى تخرج الملفات التي نريد فكها.
ولكن كما ذكرنا سابقاً ان ال container يعطي انعزال isolation للعمليات ولنظام الملفات File System، فهذا يعني أنه من داخل ال container فلن تستطيع الوصول لأي ملف على ال File System لأنها معزولة عنها، ولذلك يبقى السؤال كيف يمكن الوصول للملف الذي تريد فك ضغطه اذاً؟
استخدام ال Volumes لمشاركة جزء من نظام الملفات
لحل هذه المشكلة سوف نقوم بعمل mount لجزء من نظام الملفات النظام الأساسي، سواءً كان مجلدا كاملاً بكل محتواه، أو حتى ملف واحد فقط، وهذا الجزء الذي تم عمل mount له سيكون متاح لل container للقراءة والكتابة فيه، يمكنك تخيلها كأنه أدخلت USB للجهاز فسوف تجد قرص جديد على جهازك، فبالنسبة لل container الملف الذي تم عمل mount له يكون بمثابة قرص او جزء جديد فيه. هذه العملية تسمى في دوكر بال Volumes.
ولأننا الان في Linux Containers وهذا يعني كل ال Containers سوف تعمل على ال Moby VM بداخل ال Hyper-V، فيجب ان نقوم بعمل مشاركة من نظام ويندوز الى لينوكس اولاً، حتى بعد ذلك نستطيع تحديد الأجزاء التي نريدها ان نشاركها لل Containers.
بالزر الأيمن من دوكر بالأسفل اختر اعدادات Settings ومن ثم Shared Drives واختر القرص الذي تريد مشاركته مع نظام التشغيل لينوكس واضغط على Apply وسوف يطلب منك إدخال كلمة مرور النظام للتأكيد.
الأن أصبح القرص C متاحاً لنظام التشغيل لينوكس، ولكن ما زالت ال Containers لن تستطيع الوصول له، ويجب ان نستخدم ال volume الآن لتحديد الجزء من الملفات التي نرغب بالوصول لها.
سوف نقوم بتجربة عدة أوامر لكي نفهم تلك الفكرة، ونبدأ بالأمر التالي وهو أمر تشغيل عادي docker run، ولكن ارسلنا له معامل –rm وهي تعني قم بحذف ال container بعد ان تنتهي وليس لها علاقة بال volumes، بعد ذلك يأتي المعامل –v وبها معاملين الأول هو جزء نظام الملفات الذي نريد مشاركته مع ال container، وبعدها : ومن ثم المسار الذي ستظهر فيه الملفات في ال containers، ولأن ال Container هي لينوكس فيجب ان تتعامل بمسارات اللينوكس حيث تبدأ ب / وهي الروت، بعكس الويندوز التي تبدأ بالقرص أولاً. بعد ذلك نحدد اسم ال image التي سنشغل ال container منها، وبعدها البرنامج بداخلها وهو ls الذي يعرض الملفات، وهو يستقبل معامل ايضاً وتم تمرير /data.
الان ستعمل ال containers وتم مشاركة ال C:/Users لها على المسار /data وبالتالي تستطيع مشاهدتها، وبالفعل تم تشغيل برنامج ls بذلك المسار وتم طباعة كل محتوى ذلك المجلد. وهو نفس الملفات إذا قمت بفتحها بال Windows Explorer أو من خلال ال dir وسوف تجد نفس الملفات بالضبط، وهذا يعني ان ال mounting للقرص يعمل والان ال container تتشارك بالملفات.
الأن بدلاً من عمل mount لكل الملفات هذه، سوف نقوم بعملها للملف الواحد الذي نريده، ونقوم بتحديده وبالتالي ال container لن ترى الا هذا الملف فقط، كما يلي:
وهذا أفضل من ناحية الأمان، حيث نعطي ال Containers البيانات التي تحتاجها فقط في أداء عملها لا أكثر من ذلك.
أصبحنا جاهزين لتشغيل ال sh بنفس الطريقة السابقة بدلاً من العرض، وسوف نستخدم وضع ال –it حتى نستطيع ادخال الأوامر، وأول امر هو tar –tf وهو لمشاهدة محتوى الملف المضغوط بدون فك:
لاحظ المحتوى هو مجموعة من الطبقات المكونة منها هذه ال image.
سنقوم الان بفك المحتوى من نفس الشل وذلك من خلال الأمر tar –xf كما يلي:
بعد فك الملف لمجلد جديد تم تحديده بالمعامل –C ظهرت رسالة بأن المجلد غير موجود، وبعدها قمنا بإنشائه ومن ثم تم فك الضغط مجدداً، وبعد ذلك قمنا بعرض محتوى المجلد الجديد وظهرت البيانات فيه.
بهذا الشكل قمنا بعمل فك للملف المضغوط في ويندوز بداخل ال container، ولكن ماذا إذا اردت ان يتم الفك ايضاً الى ويندوز؟ فالتعديل بسيط، فبدلاً من ان نقوم بعمل mount ملف من ويندوز الى مجلد بداخل لينوكس، سوف نقوم بعمل mount مجلد من ويندوز الى مجلد داخل لينوكس، وبعدها نقوم بفك الملفات في ذلك المجلد او مجلد جديد بداخله، وسوف نرى ذلك التغيير في ويندوز.
سوف نحتاج ان ننشئ مجلد جديد في الويندوز في داخل المجلد ال mounted حتى نضع الملفات فيه، ويمكن فعله من خلال الويندوز وانشاء مجلد جديد بالزر الأيمن وتسميته مثلاً iis، او حتى سوف نطبق نفس الفكرة وهي تشغيل امر لينوكس لإنشاء مجلد في ال mounted folder كما يلي:
الأن قم بفتح المسار في الويندوز وستجد ان المجلد الجديد متواجد الآن:
الآن سنقوم بكتابة أمر فك الضغط الى ذلك المجلد، وبدلاً من فتح الشل ومن ثم كتابة أوامر الضغط يمكن الاختصار وتشغيلها مباشرة كما في الصورة التالية:
بهذا الأمر الأن سوف نجد انه تم فك الملف المضغوط في ويندوز، الى مجلد بداخل الويندوز وذلك من خلال برنامج يعمل بداخل نظام التشغيل لينوكس، أمر رائع!
طبعاً مفهوم ال Volumes أتاح مشاركة بين مجلدات أو ملفات في النظام الأساسي وال container وبالتالي أي تغيير يتم عمله بداخل ال container في ذلك المجلد سوف يظهر في النظام الأساسي، وهذا ما تم تطبيقه في الأعلى.
بدخل أي من المجلدات السابقة سوف نرى ايضاً ملف الطبقة مضغوط، وسوف نختار المجلد الذي يبدأ ب 49 ونقوم بفك الملف المضغوط بداخله، سوف نكرر نفس الخطوات، وهذه المرة سوف ندخل على الشل، ونقوم بفكها في مجلد نقوم بإنشائه ايضاً، وذلك من خلال أمر انشاء المجلد mkdir باي اسم ومن ثم فك ملف الطبقة المضغوط لهذا الملف بنفس الأمر السابق، وبعد الفك سوف نقوم بفتحه من داخل الويندوز الآن، وهو يبدوا كما يلي:
هل تلاحظ ما هو محتوى هذه الطبقة؟ هو نظام الملفات لل image، فكما ذكرنا أن ال image تحمل ال File System الخاصة بها لأنها معزولة عن الخاصة بنظام التشغيل.
تشغيل برنامج ffmpeg للتعامل مع ملفات الفيديو
لنفرض اردت تحويل مقطع فيديو صغير الى صورة git، فسوف تحتاج الى تنزيل برنامج وتتأكد من انه يخلوا من المشاكل وغيرها، وأحد أشهر البرامج هو ffmpeg ويعمل على عدة أنظمة تشغيل، وسوف نقوم بتشغيله بنفس الفكرة ونستفيد من ال Linux Container لكي يحول لنا الفيديو الى صورة ويضعها لنا على نظام الملفات في مجلد نحدده، مثلاً الفيديو ملف mp4 المتواجد في هذا الرابط سوف نقوم الآن بتشغيل برنامج ffmepg وإعطاء أمر التحويل بداخل volume حتى نستطيع الوصول لها بسهولة، مثلاً اريد كتابته على الفولدر C:\test.video سوف نقوم بانشائه ومن ثم ندخل على ال powershell من سطر الأوامر وننفذ أمر التشغيل:
تم فتح ال powershell وذلك حتى نستفيد من خاصية المتغير pwd وهي تعني المسار المحلي، لأنه كما يتضح في الصورة التنفيذ سوف يتم من داخل المجلد الذي يتواجد عليه ال cmd وهو test.video ويمكن اذا أردت تشغيله من ال cmd بشكل عادي ان تقوم بكتابة المسار الذي تريد عمل mount له. ايضاً لاحظ استخدمنا –volume بدلاً من الاختصار –v وكلاهما في دوكر لنفس الأمر وهو استخدام ال volume لكي تحدد مجلد تقوم بعمل mounting له في مجلد بداخل ال container. بعد الانتهاء سوف تجد أن الصورة الآن لديك على المجلد:
خلاصة
فكرة ال Volume وال Mounting مشابه لفكرة تركيبك ل USB في نظام التشغيل، حيث ستجد قرص جديد لديك.
أولاً يكون النظام الأساسي Host به نظام الملفات والأقراص مثلاً في نظام الويندوز، وبعد أن يتم تشغيل Container سوف يتم تشغيلها من Image موجودة، وكما رأينا سابقاً ال Image يكون بها نظام الملفات الخاص بها وبالتالي لديها File System Tree بداخلها معزولة عن نظام التشغيل الأساسي وكل ذلك يتم بمجرد تشغيل ال Container.
الآن بعد إضافة ال Volume وعمل Mounting لمجلد من النظام الأساسي الى مجلد في ال Container فسوف تكون كأنها عبارة اختصار للوصول الى المجلد الأصلي في النظام الأساسي وأي عملية تجري سيتم مشاهدتها مباشرة من النظام الأساسي.
وسوف نرى لاحقاً أن لهذا الأمر فوائد عديدة مثلاً قمت بتطوير الموقع، فيتم وضعه على النظام الأساسي وبعدها يتم عمل mounting للمجلد الخاص بالموقع ويتم تشغيل ال nginx مثلاً، وبالتالي يتم قراءة الملفات والكتابة ايضاً بها، ولل Volumes استخدامات أخرى وأهمها الحفاظ على البيانات بعد ان يتم إيقاف او حذف ال container وسوف يتم التطرق لها عند الحديث عن تشغيل قواعد البيانات بداخل ال Containers في مواضيع قادمة.
بهذا الشكل نكون قد تعرفنا على فكرة ال Sharing Host File الى ال Containers وكيف يتم كتابة الملفات من والى النظام الأساسي، وأيضاً وضحنا فوائد وسهولة تشغيل البرامج بداخل ال containers للقيام بأي عمليات مطلوبة وذلك من خلال أوامر دوكر البسيطة، الموضوع القادم بإذن الله سوف يكون حول بناء Image خاصة بنا.
جزاكم الله تعالى كل خير ربنا يجعلها فى ميزان حسناتكم أمين يا رب العالمين