ما هو Docker

عمار الخوالدةمنذ 5 سنوات

مقدمة

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

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

 

جميع المشاكل السابق ذكرها يمكن حلها باستخدام Docker.

 

ما هو Docker

دوكر (Docker) هي أداة مُوجَّهةٌ لمُدراءِ الأنظمة والمطورين تستخدم في عمليات بناء ( Build ) وتشغيل البرامج ضمن بيئة معينة عبر تشغيل المشروع بداخل حاويات دوكر ( Docker Containers )، مما يسهل عملية نقل المشروع من جهاز إلى جهاز آخر دون الحاجة لتعديل إعدادات ومتغيرات النظام، أو تنصيب أو تحميل حزم معينة، حيث يتم فقط تنصيب دوكر وتشغيل الحاويات المُعدة مسبقا بإعدادات معينة تسمح بتشغيل التطبيق ضمن هذه الحاويات.

 

ما هي الحاوية وما الفرق بينها وبين الآلة الوهمي

الحاوية (Container) هي عبارة عن مجموعة من الحزم، المعزولة عن الجهاز المحلي الخاص بك (Local Machine) يمكن تشغيل واستخدام البرامج الموجودة داخل الحاوية دون أن تتعارض الحزم الموجودة داخل الحاوية مع الحزم المنصبة بالفعل على جهازك.

 

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

لتوضيح الفرق أكثر، افترض أنك تريد تشغيل ثلاثة تطبيقات مختلفة على جهازك الشخصي ( أو على سيرفر مثلا )، لكن كل تطبيق يحتاج حزماً مختلفة عن التطبيق الآخر، وقد تتعارض هذه الحزم في ما بينها، لذلك أنت بحاجة لعزل هذه التطبيقات عن بعضها البعض، الصورة التالية توضح كيفية عزل هذه التطبيقات باستخدام الآلات الوهمية ( عن طريق استخدام VirtualBox مثلا) وكيفية عزلها باستخدام حاويات Docker:

الفرق بين حاويات دوكر ( Docker Containers ) والآلات الوهمية ( VMs )

 

 

كيف يتم إنشاء الحاويات

حتى تنشئ حاوية فأنت بحاجة إلى أن تعرف Docker على صفات الحاوية التي تريد إنشاءها، فلو أردت مثلا إنشاء حاوية لنظام Ubuntu ( أي أنها تحتوي على مكتبات وحزم Ubuntu كما شرحنا سابقا ) فإنك بحاجة لإخبار Docker بأنك بحاجة إلى حاوية Ubuntu بنسخة 16.04 مثلا، وهنا تظهر الحاجة إلى الصور (Image)، فالصورة هي عبارة عن ملف نصي يحتوي على صِفات وإعدادات الحاوية التي تريد إنشاءها، وبإمكانك إنشاء أكثر من حاوية باستخدام نفس الصورة، تتم بناء الصور فوق صور أخرى، فلو أردت إنشاء صورة تحتوي على الحزم الخاصة لتشغيل خادم Apache مثلا، فإنك غالبا ستقوم بجلب صورة Ubuntu أو صورة لأي نظام آخر ثم كتابة أوامر معينة لتنصيب وإعداد خادم Apache، فستحصل بهذه الطريقة على صورة لـ Apache لكنك بالفعل قمت بإعادة استخدام صورة مسبقة وقمت بإضافة بعض الحزم وتعديل الإعدادات لها.

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

البدء باستخدام Docker

بعد تنصيب Docker على جهازك، قم بتنفيذ الأمر التالي:

docker run hello-world

 

الأمر run يقوم بإنشاء حاوية عن الصورة ( في هذا المثال اسم الصورة hello-world) من ثم تشغيل هذه الحاوية، الصورة hello-world هي عبارة عن مثال يستخدم للتجربة فقط، الأمر run يفترض أن الصورة موجودة بالفعل على جهازك، وإن لم يجد الصورة سيقوم تلقائيا بسحب (pull) الصورة من مستودعات Docker من ثم إنشاء حاوية عن الصورة.

 

مثال لتشغيل حاوية Ubuntu

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

نفذ الأمر التالي لسحب صورة من الـ Registery وهو Docker Hub بشكل افتراضي:

docker pull nginx:1.14

الأمر pull يستخدم لسحب أو تحميل صورة على جهازك، nginx هي اسم الصورة، والجزء الذي يقع بعد إشارة ( : ) هو tag يختلف باختلاف الصورة، لكنه يمثل نسخة البرنامج، او الحزمة التي تشغلها هذه الصورة، ويمكنك عدم كتابة tag للحصول على آخر نسخة بإمكانك مشاهدة جميع الصور المتوفرة في موقع Docker Hub.

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

docker images

وسيعرض لك جميع الصور المحملة على جهازك، والآن لتشغيل حاوية Nginx قم بتنفيذ الأمر run:

docker run --name 3alampro nginx:1.14

سيتم الآن تشغيل الحاوية ( لو نفذت الأمر run ولم تكن الصورة متوفرة لديك فإنه سيقوم بتنفيذ الأمر pull بشكل تلقائي )، الأمر name هو أمر اختياري يمكنك تنفيذه لتسمية الحاوية باسم تكتبه بعد الأمر، إن لم تقم بتسمية الحاوية فسيتم إعطاء اسم تلقائي لها، للخروج من طرفية الحاوية اضغط ctrl + d أو اكتب الأمر exit.

لعرض جميع الحاويات التي تعمل حاليا:

docker ps

 

ويمكنك أيضا إضافة الخيار -a إلى الأمر السابق لرؤية جميع الحاويات التي تم تشغيلها مسبقا بما فيها الحاويات التي لا تعمل حاليا، لو قمت بالخروج من الطرفية التي قمت بتنفيذ الأمر run من خلالها ثم نفذت الأمر ps، ستلاحظ أن الحاوية تم اغلاقها بمجرد اغلاق الطرفية، وذلك لأن لحاويات دوكر حالة من حالتين، إما العمل في المقدمة (Foreground) أو في الخلفية (Detached)، وبشكل افتراضي، تعمل حاويات دوكر في المقدمة، بمعنى أنها تعمل ضمن محاكي الطرفية Termenal الذي يعمل الآن، ولا تعمل كـ Demon في الخلفية، لذلك نستخدم الأمر d- لتشغيل الحاوية في الخلفية:

docker run -d --name 3alampro nginx:1.14

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

والآن لنتأكد ما إذا كان كل شيء يعمل بشكل سليم، نحن نعلم أن Nginx يعمل على المنفذ 80، فغالبا ستقوم بكتابة localhost:80 في المتصفح لتجربته، والمفاجأة أنه لن يعمل :)

 

فكما قرأت في بداية هذا المقال، الحاوية عبارة عن بيئة معزولة عن نظام التشغيل لديك، فـ Nginx يعمل فعلا على المنفذ 80 داخل الحاوية، لكنه لا يعمل خارجها، لذلك نستخدم p- مع الأمر run لنشر البورتات من الحاوية إلى الجهاز المستضيف:

docker run -p 8000:80 -d --name 3alampro nginx:1.14

بهذا الأمر سيتم نشر البورت 80 من داخل الحاوية، إلى البورت 8000 خارجها، فبإمكانك الآن كتابة localhost:8000 داخل متصفحك، والنتيجة أنك سترى صفحة الترحيب من Nginx:

 

بما أن الحاوية تعمل في الخلفية الآن فلن تتوقف عن العمل بخروجك من الطرفية، ولإيقاف عمل حاوية من الحاويات، استخدم الأمر stop:

docker stop 3alampro

 

أما لتشغيل حاوية تم إنشاؤها مسبقا فاستخدم الأمر start بدلا من الأمر run، فأنت لست بحاجة لإنشاء حاوية مرة أخرى:

docker start 3alampro

ملاحظة: عند استخدام الأمر start لا يمكنك تحديد البورت أو تحديد ما إذا كان يمكن للحاوية العمل بالخلفية أم لا، لكن الحاوية ستعمل بنفس الإعدادات التي حددتها عندما قمت بإنشاء الحاوية باستخدام الأمر run، فعند تشغيل الحاوية 3alampro ستتمكن من الوصول إلى nginx من خلال البورت 8000 وستعمل الحاوية في الخلفية.

يمكنك الاتصال بالـ Terminal الخاص بالحاوية التي تعمل لتنفيذ أوامر عليها باستخدام الأمر exec:

docker exec -it 3alampro bash

فالأمر exec يقوم بتنفيذ أمر shell داخل الحاوية، أما it- فـ i تقوم بفتح تيار إدخال (STDIN) و t تقوم بإنشاء (TTY) للتعامل مع الطرفية، فالخياران معا يقومان بالسماح لك بالبقاء داخل طرفية الحاوية وتنفيذ الأوامر، أما استخدام الأمر exec دون هذين الخيارين فسيُنفذ الأمر دون السماح لك بالدخول إلى الطرفية لتنفيذ الأوامر، وبما أن الأمر exec يحتاج إلى تمرير أمر طرفية له، فيمكنك تمرير bash لفتحها والتمكن من تنفيذ الأوامر بداخلها، شاهد الصورة لتتضح الفكرة أكثر:

عند تنفيذ الأمر uname في البداية، تم إظهار الـ hostname الخاص بجهازي، أما بعد تنفيذ الأمر exec تلاحظ أن شكل محث الصدفة (Shell Prompt) قد تغير بسبب استخدام الـ shell الخاصة بالحاوية، وعند تنفيذ uname ثانية نلاحظ أن الـ hostname قد تغير، لذلك فبالإمكان تنفيذ أي أمر هنا ليتم تطبيقه على الحاوية.

 

أما ان لم تعد تريد الحاوية فبإمكانك حذفها باستخدام الامر rm:

docker rm 3alampro

 

وأخيرا، من المزايا الرائعة في Docker هي الـ Volumes، حيث بإمكانك تركيب (mount) مجلد من جهازك إلى مسار آخر في الحاوية، ومن فوائد هذا الأمر هو عدم الحاجة لنسخ ملفات مشروعك مثلا من جهازك إلى الحاوية، بل بإمكانك الوصول إلى نفس الملفات من داخل الحاوية أو من جهازك، وكل في مسار مختلف، ولتجربة هذه الميزة قمت بإنشاء ملف باسم aaa.html على جهازي، وسأقوم بتشغيل حاوية تتمكن من الوصول إلى هذا الملف، بحيث يزودني nginx بالملف عند ادخال المسار الخاص به ويصبح بإمكاني فتح الملف من خلال المتصفح:

 

docker run -d -p 8000:80 --name 3alampro -v ~/Desktop/Workspace:/usr/share/nginx/html nginx

 

الخيار v- هو الذي سيقوم بعمل Mounting، المسار ~/Desktop/Workspace هو مسار على جهازي يحتوي الملف aaa.html، أما المسار usr/share/nginx/html/ فهو المسار الذي يستخدمه Nginx على الحاوية.

يمكنك تصفح باقي أوامر Docker من هنا.

 

في الدرس القادم سنشرح طريقة إنشاء صورة مخصصة.

 

المحاضر

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

الكلمات الدليلية

عن الدرس

16 إعجاب
7 متابع
1 مشاركة
27742 مشاهدات
منذ 5 سنوات

التعليقات (2)

nour Boutrs:

شرح مميز شكراً لك على هذا المجهود الرائع 

ريان:

شكرا شرح أكثر من رائع

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !