سوف نتحدث في هذا الموضوع عن تنزيل دوكر في ويندوز، ولينوكس، ومن ثم نقوم بتشغيل بعض البرمجيات containers عليه مثل Nginx و IIS وسوف نرى كيف أصبحت عملية تنزيل البرمجيات سهلة للغاية وبدون أي اعدادات تذكر، وسوف نوضح الفرق بين ال Linux containers و windows containers وكيف يمكن تحويل دوكر ليعمل على أي منهم، وأخيراً سوف نرى العزل Isolation التي توفره ال Containers.
المواضيع في السلسلة:
- مقدمة حول دوكر Docker
- البداية مع دوكر Docker (الموضوع الحالي)
- مشاركة المجلدات في دوكر Docker
- بناء ال Docker Images
- تشغيل قواعد البيانات في دوكر Database in Docker
- تشغيل البرامج باستخدام ال Docker Compose
تجربة دوكر بدون تثبيت أي برامج
في حال لم تريد تنصيب دوكر الآن، فيمكنك استخدام الموقع Play with Docker وتستطيع إضافة جهاز او أكثر من جهاز ومن ثم يمكنك تجربة الأوامر التي سوف نأخذها في الفقرات التالية. وسوف يتم اعطائك Session لمدة 4 ساعات للتجربة في جهاز تخيلي.
تحميل دوكر على نظام تشغيل ويندوز
في نظام التشغيل ويندوز، قم بتحميل الدوكر من خلال الرابط Docker Community Edition for Windows المتواجد على Docker Store:
ودوكر للويندوز يحتاج أن تعمل على نظام التشغيل ويندوز 10 اما Pro, Enterprise, Education وغير ذلك فلن يعمل، بالإضافة الى تحديث نظام التشغيل بأخر التحديثات، وهذه من متطلبات دوكر للويندوز، فاذا لم يكن لديك هذه المتطلبات فيمكن تنزيل Docker Toolbox وهي تعتبر الأن قديمة Legacy ولكنها للأجهزة التي لا تتوافق مع متطلبات دوكر للويندوز، سواءً Windows 7 or Windows 8 ولكن يجب أن يكون 64 بت، ويمكن تنزيلها من هنا Docker Toolbox:
ولتحميل دوكر على ويندوز سيرفر 2016 فلن نحتاج اليه وانما فقط يكفي ال Docker Engine.
بعد تحميلك Docker for Windows.exe وقم بتنزيله بالخطوات الافتراضية التالي-التالي الى ان ينتهي، وبعد الانتهاء يمكنك تشغيله من خلال قائمة البرامج وفتح Docker for Windows.
وهناك بعض النقاط والمتطلبات المهمة قبل تنصيب الدوكر، وهي:
عند تنصيب الدوكر سوف يقوم بتفعيل ال Microsoft Hyper-V في حال لم يكن مفعلاً، ويجب عليك حينها إعادة تشغيل الجهاز. ولن يعمل أي VM اخر مثلاً Virtual Box حيث لا يمكن تشغيل اثنين في آن واحد، ولن تعمل بجانب ال Docker for Windows.
أيضاً لن تستطيع تشغيل ال Android Studio Emulator لأنه يستخدم ال Hardware Accelerated Execution Manager (واختصاراً ال Intel HAXM) فهو يتعارض مع ال Hyper-V ولا يمكن تشغيلهم في آن واحد، ويجب عليك إعادة التشغيل في كل مرة اردت إيقاف أحدهم والتبديل للبرنامج الاخر.
ايضاً يجب تفعيل خاصية ال Virtualization من ال BIOS وذلك حتى يعمل دوكر ويستطيع تشغيل ال Linux Containers بداخل الويندوز باستخدام ال Hyper-V، وغالباً ما تكون مفعلة في الوضع الافتراضي، يمكنك التحقق من ذلك من ال Task Manger والذهاب لل CPU ومشاهدة ال Virtualization Enabled:
أثناء التنصيب سوف تجد الرسالة، وستجد أنه يمكن تفعيل ال Windows Container مباشرة بدلاً من الافتراضي Linux Container، ولكن على أي حالة يمكن تغييرها فيما بعد من خصائص دوكر. لذلك اتركها كما هي:
بعد التثبيت وفتحه:
سوف تجد أيقونة دوكر بجانب الساعة ويمكنك فتح الخصائص والاعدادات والتحويل من ال Windows Container الى Linux Containers وغيرها من المهام، وذلك بالضغط عليها بالزر الأيمن، وسوف نتحدث عن ذلك فيما بعد. حالياً عند تثبيت الدوكر سوف يعمل على ال Linux Container mode.
بعد تثبيت ال Docker for Windows سوف ينزل معه العديد من الأدوات مثل Docker Engine و Docker CLI Client و Docker Compose و Docker Machine.
ولأن ال Linux Containers يعني أنه يمكن تشغيل برمجيات لينوكس على ويندوز، وهذا سيتم عن طريق Virtual Machine يتم انشائها مباشرة ويتم تشغيل كل ال Linux Container بها، فقم بفتح ال Hyper-V Manager من قائمة البرامج وسوف تلاحظ وجود VM من نظام MobyLinux تعمل وهي التي يستخدمها دوكر للتعامل مع ال Linux Containers.
إذا ظهرت لك هذه الرسالة:
فعليك بالتأكد من دعم ال BIOS وتفعيله لل Virtualization، كما تطرقنا سابقاً، وإذا لم تكن مفعلة فيجب تفعيلها من اعدادت ال BIOS.
إذا كانت مفعلة فهذه المشكلة تحتاج الى ان تقوم بتعطيل ال Hyper-V يدوياً وإعادة التشغيل ومن ثم إعادة تفعيله مجدداً وإعادة التشغيل ومن ثم سوف يعمل دوكر معك، ولا أدرى لماذا هذه الخطوات ولكنها قد تحدث أحياناً. فقم بفتح خصائص الويندوز:
ومن ثم فعل ال Hyper-V:
أو قم بتعطيلها وأعد التشغيل، ومن ثم قم بتفعيلها واعد التشغيل مجدداً، وبعد إعادة التشغيل سوف يعمل معك بالشكل الصحيح.
بعد أن يعمل الدوكر لأول مرة سوف تجد هذه النافذة، وقم بالتسجيل واخذ Docker ID لكي تقوم بتسجيل الدخول فيه:
ولمعرفة النسخة التي تعمل عليها يمكن الضغط على ايقونة دوكر بالأسفل بالزر الأيمن والضغط على about وسوف تجد معلومات النسخة (وقد تتغير من النسخة هنا لأن دوكر تحدث البرنامج كل شهرين تقريباً)، لكن تظل المفاهيم واحدة:
بهذا الشكل نكون قد أنهينا من تنزيل دوكر على الويندوز.
ملاحظة: إذا كنت تعمل على نظام تشغيل Mac فيمكن ايضاً تحميل Docker for Mac ويمكن تطبيق كافة الجزئيات السابقة ما عدا جزئية ال Windows Container. وبالنسبة لل Windows Server 2016 فلن تحتاج لتحميل ال Docker for Windows وانما مباشرة تحتاج ال Engine فقط، وهناك نسخة مخصصة لل Windows Server 2016 وهي ال Enterprise Edition ويمكنك تحميلها بسهولة ايضاً في النظام.
تنصيب دوكر على لينوكس
سيتم تنصيبه على نظام Ubuntu 18.4 LTS وطريقة التنصيب في لينوكس بسيطة، فنقوم أولاً بتحديث ال apt من خلال الأمر:
$ sudo apt-get update
بعد ذلك سنقوم بتحميل بعضاً من ال packages حتى يتم التحميل عبر https بواسطة apt:
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
ستقوم بتحميل الدوكر GPG Key:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
سنقوم الان بتحديد ال Stable Repository لتحميل دوكر:
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu artful stable"
نقوم بتحديث ال apt مجدداً:
$ sudo apt-get update
الان نقوم بتحميل دوكر:
$ sudo apt-get install docker-ce
البداية في الأوامر
سوف ننتقل الآن الى التعامل مع دوكر، ولحسن الحظ كافة الأوامر التي سوف نتعامل معها سوف تعمل على دوكر بغض النظر عن نظام التشغيل المستخدم، سواء ويندوز أو ماك أو لينوكس.
أول امر هو لمعرفة معلومات عن الدوكر وهو docker info وسوف يخرج معلومات عن ال docker engine:
أيضاً يمكن استخدام docker version لمعرفة معلومات السيرفر والكلاينت كما يلي:
سوف تلاحظ أن الكلاينت يعمل على ويندوز وذلك لأن نظام الشغيل هو ويندوز، بينما السيرفر يعمل على ال Linux (باستخدام VM)، وكما ذكرنا يمكن تغييره الى ويندوز كما سيأتي فيما بعد لتشغيل Windows Containers مباشرة على النظام.
لننتقل الى أولى الأوامر: وهو docker ps لمعرفة حالة العمليات process status، وسوف يخرج كل ال containers التي تعمل الآن:
سوف تلاحظ أنه لا يوجد أي Container يعمل الان، والقائمة فارغة.
سوف نقوم بتشغيل اول container وهو يعتبر Hello-World واسمه كذلك ايضاً، من خلال الأمر: docker run hello-world، وكما ذكرنا سابقاً ان الأمر run سوف يقوم بعمل pull وبعدها يقوم بتشغيل ال container في آن واحد:
بعد أن عملت ال container سوف تنتهي مباشرة، ويمكن ان نشغلها مرة ثانية بنفس الأمر، وسوف نلاحظ أنه لن يتم تحميلها مجدداً، والسبب ان Image أصبحت موجودة في الجهاز وسيتم تشغيل ال container منها مباشرة:
سوف نقوم بتشغيل مثال أخر وليكن ويب سيرفر مثلاً Nginx من خلال الأمر docker run –p 80:80 nginx، وسوف نلاحظ الأن استخدام المعامل –p وهو لتحديد البورت فأول بورت 80 هو الخاص بالجهاز الحالي وهذا يعني اريد أي طلب بالبورت 80 ينتقل لهذه ال container، وبداخل ال container سوف يكون ال nginx يستمع للبورت 80 داخل ال container يتم التقاط الطلب بواسطتها، وهذا يعني كأنه يتم تشغيل ال nginx على بورت 80 في الجهاز مباشرة، ويمكن ان نغير البورت الأول مثلاً 8080 وبالتالي سوف يتم طلب 8080 ويتم تمريره لل nginx الذي يستمع عبر بورت 80.
سوف نلاحظ أن هناك 3 أشياء تم تحميلها وهي ال Layers لأنه غالباً ال Image يكون بها أكثر من طبقة وسوف نتحدث عن ذلك لاحقاً، وبعد التحميل سوف تجد انه لا مخرج من ال nginx لكنه يعمل الان، ويمكن فتح المتصفح مباشرة localhost وسوف تجد رسالة من الويب سيرفر:
هكذا بكل بساطة عمل ال nginx من خلال امر واحد فقط، وستجد بعد فتحك الصفحة عندها مخرجات على الكونسول التي يعمل بها ال nginx وهي عبارة عن logs لأي طلب يأتي للويب سيرفر:
فكرة ال containers مع ال Docker غيرت من مفاهيم تعلم الأدوات، فلن تحتاج الى أن تتعلم كيف يمكن تنصيب البرنامج قبل ان تستخدمه، فيمكنك الان ان تستخدمه مباشرة، وبعدها قرر هل تريد ان تتعلم طريقة التنصيب وكيف تم التنصيب.
الان لكي اخرج من ال container التي تعمل عليك بعمل detach وذلك اما من خلال CTRL+C أو CTRL+PQ لكي تخرج منها، ولكن سوف تظل ال container قيد العمل، وانما هو خروج من مخرجات تلك ال container التي تعمل.
ولكي تتأكد من ذلك قم بمشاهدة ال containers التي تعمل بالأمر docker ps، وسوف تجد ان ال nginx مازال يعمل:
سوف تجد ال Container ID وهو رقم ال container ويمكنك التعامل معه من خلال الرقم (أو جزء من الرقم فقط)، اسم ال Image، الأمر الذي تم تشغيله وهو يأتي مع ال image، وقت الانشاء، حالة ال container، البورت المفتوح، واسم عشوائي يعطي لل container (في حال لم تنسد اسم لها) ويمكنك التعامل معها ايضاً من خلال الاسم.
ويمكنك ايضاً فتح ال localhost وسوف تجد الموقع ما زال يعمل.
الان سوف نستخدم أمر إيقاف ال container وذلك من خلال docker stop Identifier ويمكن استخدام معرف ال container سواء كان ال CONTAINER_ID في الصورة السابقة او ال NAMES، وبالتالي يمكن ان يتم استخدام docker stop e51 أو docker stop eager_tereshkova وكلهم سوف يعطوا نفس النتيجة، ولاحظ لم نقم بكتابة كامل المرقم وانما اول جزء منه فقط، ويمكن وضع أي عدد من الأرقام، لكن في حال هناك أكثر من container كانوا لهم نفس البداية فسوف يحصل conflict وتخرج لك رسالة خطأ بأنه هناك أكثر من container بنفس البادئة وعليك بوضع عدد أطول من الأرقام حتى يتم معرفة ال container الذي تقصده.
إذا تم الإيقاف بشكل صحيح سوف تحصل على نفس الجزء من المعرف الذي قمت بإدخاله، ويمكنك التأكد من انه تم الإيقاف عن طريق docker ps ولن تجد ال container تعمل بعدها:
وايضاً إذا ذهبت للموقع localhost فلن تجده يعمل لأن الويب سيرفر لا يعمل.
سوف نقوم الان بتشغيل نفس container السابقة، وذلك من خلال الأمر docker start identifier، وقبل ان نقوم بتشغيلها، سوف نعرض الأمر docker ps –a والذي يظهر كل ال containers سواء التي تعمل او التي تم ايقافها، وسوف تشاهد المخرج التالي:
سوف تلاحظ 3 containers موجودة، اول واحدة هي ال nginx التي تم ايقافها قبل قليل، والأخريات هم ال hello-world حيث قمنا بتشغيلها مرتين docker run hello-world وهي تنتهي مباشرة بعد العمل، لذلك توجد نسختان هنا.
يمكن تشبيه الفكرة بالطريقة التقليدية عندما تقوم بتشغيل برنامج ما وايقافه عن العمل فهذا لا يعني انه تم مسحه، وانما يكون موجوداً، ونفس الفكرة في ال containers فبعد ايقافها فهي تكون موجودة ويمكن حذفها او إعادة تشغيلها مجدداً.
سنقوم الان بتشغيل ال nginx container باستخدام الامر start من خلال معرف ال container أو اسمه، وسوف يكون المخرج الرقم نفسه لدلالة على اكتمال العملية:
يمكن الان فتح الموقع مجدداً localhost وستجده يعمل بدون أي مشاكل. ويمكنك مشاهدة ال container يعمل عند تنفيذ الأمر docker ps.
من الأوامر الشائعة ايضاً هو الأمر docker images وسوف يعرض كل ال Images التي تحميلها ومتواجدة على الجهاز الان كما يلي:
وهذه ال images تعتبر هي القالب التي يتم منها انشاء ال container.
الان لحذف ال container سوف نستخدم الأمر: docker rm identifier، وقبل ان نقوم بحذفه يجب ان يكون متوقفاً عن العمل، وسوف نقوم الان بحذف ال nginx container كما يلي:
سوف تجد أعلاه قمنا أولاً بعرض كافة العمليات docker ps – a وسوف تلاحظ أن ال nginx تعمل، وقمنا بعدها بإيقافها من خلال docker stop e5، وبعد ذلك عرضنا العمليات مجدداً والان أصبحت متوقفة عن العمل، واخيراً قمنا بحذفها docker rm e5، الان في حال قمنا بعرض العمليات مجدداً فلن تكون موجودة:
سوف نقوم الان بحذف بقية ال containers وطالما هي متوقفة فيمكن اصدار امر الحذف مباشرة، ويمكن حذفهم في آن واحد من خلال كتابة المعرفات وبينهم مسافة، كما يلي:
سوف تجد أنه تم كتابة اسم ال container الأول خطأ، وتم حذف الثاني، ومن ثم قمنا بكتابته صحيحاً وتم الحذف في الأمر الذي يليه. الان عند كتابة docker ps –a فلن تجد أي containers تعمل أو متوقفة.
لكن ال Images ما زالت متواجدة، فعند كتابة docker images فسوف ترى ال images ولحذفها عليك بكتابة الأمر docker rmi identifier وكتابة معرف ال image، وفيما يلي سيتم حذفهم في آن واحد:
وسيتم حذف كافة ال Layers في ال images وبعدها عند كتابة docker images فلن تجد أي image متواجدة.
مثال ثاني
سوف نأخذ مثال أخر، وليكن هذه المرة توثيق ال Docker حيث يمكن فتح التوثيق بأكمله اونلاين من خلال هذا الرابط Docker Documentation.
ولكن يمكنك ايضاً تحميله offline ك docker images وتشغله محلياً على ويب سيرفر، وسوف نقوم بذلك، ويمكن استخدام الأمر docker search docs لكي ترسل أي كلمة بحث وارسلنا الآن docs لكي تخرج كل ال images المتواجد على ال docker hub بكامل الاسم لها، كما يلي:
أو يمكنك فتح ال docker hub ومن ثم البحث عن docs وسوف تجد ال docker docs وتستطيع مشاهدة تفاصيلها كما يلي:
وقبل التحميل سوف نلقى نظرة عن ال tags وهي مشابه لل git tags فهي نسخ او مراحل ما من هذا البرنامج، ويمكنك تحميل أي منها من خلال ال tag، وإذا لم يتم تحديد فسوف يتم تحميل ال latest (التاق الافتراضي).
سوف تلاحظ أن حجم ال image هي 1 قيقا، ولذلك قد تأخذ وقتاً للتحميل بحسب سرعة الاتصال لديك، وسوف نقوم بتحميل وتشغيل ال image بالأمر run كما يلي:
لاحظ أننا قمنا اولاً بتشغيل ال container بالبورت 8090 على ال host، أما البرنامج من داخل container فسوف يعمل على البورت 4000، وقمنا ايضاً بكتابة ال tag الذي نريده، ويمكنك تحديد أي نسخة تريد، وطالما حددنا latest فسوف يعطي اخر نسخة، وهذا الذي يحدث في حال لم يتم تحديد أي نسخة وهو تحميل ال latest.
لاحظ ايضاً رابط ال image يبدأ بال docs/docker.github.io حيث ال docs هذه تعتبر اسم الشركة، وبداخل هذه الشركة سوف تجد العديد من ال images، نفس فكرة الحساب في github فبداخله العديد من ال repositories.
أيضاً لاحظ أنه هناك العديد من ال Layers عند تحميل هذه ال Image فهي كبيرة من 1 قيقا بايت. واخيراً بعد انتهى التحميل اشتغلت مباشرة وظهر المخرج، ونستطيع فتح المتصفح الان localhost:8090 وسوف تجد كامل التوثيق متواجد لديك offline.
بعد فتحك للموقع وتصفحه سوف تجد في الكونسول العديد من المخرجات وهي logs من الويب سيرفر المضمن بداخل هذه ال container.
الآن لكي تخرج من هذه ال container وتعود الى سطر الأوامر يمكنك الضغط على CTLR+C، وبالطبع كما ذكرنا سابقاً فهذا لن ينهي ال container وانما ستظل تعمل. وسنقوم الان بإيقاف هذه ال container من خلال الأمر stop كما ذكرنا سابقاً.
الآن سوف نأخذ معاملات جديدة لأي أمر وهو تشغيل ال container في وضع ال interactive mode بحيث عند الضغط على CTLR+C فسوف يتم ايقافها من العمل وذلك بتمرير المعامل –it للأمر، بالإضافة الى تسمية ال container بدلاً من الاسم العشوائي الذي يظهر تلقائياً من خلال المعامل –name كما يلي:
سوف تلاحظ أنه تسمية ال container بالاسم docs (ويمكنك كتابة الأمر docker ps أو docker ps –a وسوف تجد الاسم لهذا ال container)، بالإضافة الى تشغيلها في وضع ال it بحيث تستجيب لأي مدخل، وكما ترى في الصورة السابقة بعد تشغيل ال container والتأكد من عمل الموقع، قمنا بإدخال CTLR+C لإيقافها (وهي سوف توقف البرنامج الرئيسي الذي يعمل على ال container والذي يعني إيقاف ال container من العمل) ومباشرة توقفت عن العمل ولن تظهر في قائمة docker ps.
إذا قمت بتشغيل الأمر السابق مجدداً فسوف تحصل على رسالة خطأ فلن تستطيع انشاء container اخر بنفس الاسم وعليك اما بحذف القديم، او تسمية الجديد باسم اخر.
ولكي تخرج من ال interactive mode container يجب عليك أن تقوم بإدخال CTRL+PQ حتى تخرج بشكل صحيح بدون ان توقف ال container التي تعمل.
تجربة ال Windows Containers
سوف نلقى نظرة الان عن تشغيل ال windows container، ولكي نقوم بالتحويل من ال Linux Container الى Windows Container فيجب الضغط في الأسفل على زر دوكر بالزر الأيمن واختيار Switch to Windows Container (وسوف يتم تفعيل ال Windows Container Feature) المتواجد على ويندوز 10.
بعد الانتقال عند الضغط مجدداً على نفس القائمة سوف تجدها الان أصبحت Switch to Linux Container وهذا يعني أنك تعمل على ال Windows Container ويمكنك تجربة الأوامر info, version الخاصة بدوكر لمعرفة تفاصيل ال client & server كما تطرقنا له في البدء.
عند كتابتك docker ps أو docker images (أو حتى docker ps –a) فلن تجد ال containers أو ال images التي كانت في ال Linux container حيث تم الانتقال ال windows container وهو مختلف عن ال Linux Containers.
وسوف نقوم بتشغيل IIS وهو الويب سيرفر المشهور في أنظمة الويندوز:
وسوف نجد هناك نسختين الأولى تعتمد على ال windowsservercore والثانية على ال nanoserver وفرق الحجم كبير، لذلك سوف نستخدم ال nanoserver وسوف نوضح الفرق بينهم فيما بعد.
لاحظ الأمر أعلاه، سوف تجد انه تم تحديد البورت 80 على ال host machine والبورت 80 داخل ال container لأنه هو البورت الذي سيعمل على ال iis، وايضاً ممرنا المعامل –d وهو اختصار لل detach بمعنى سيعمل ال container مباشرة ويرجع سطر الأوامر يستقبل الأوامر (كأنه نقوم بتشغيله بالطريقة العادية ومن ثم CTLR+C لكي نرجع لسطر الأوامر وفي نفس الوقت يكون ال container يعمل)، بمعنى كأنه يعمل في الخلفية الان.
ايضاً قمنا بتحديد اسم له iis ومن ثم حددنا Tag حتى نقوم بتحميل ال nanoserver وليس latest. وبعد ان يتم التحميل ويعمل مباشرة سوف تلاحظ أنك الان في سطر الأوامر ويمكن مشاهدة قائمة العمليات وسوف تجده على القائمة docker ps.
الان يمكنك فتح المتصفح والدخول الى localhost وستجد ال IIS يعمل ولديك الصفحة الافتراضية فيه:
هناك طريقة أخرى لم نتحدث عنها وهي كيف يمكن فتح الويب سيرفر بدون استخدام ال port mapping وانما باستخدام عنوان ال container واستخدام ال port للويب سيرفر بداخله، ولكن عليك بمعرفة عنوان ال IP لل container، ويمكن من خلال الأمر docker inspect containerId حيث تمرر ال containerId وسوف تجد معلومات حول ال container التي تعمل وستجد ال IP لها، كما يلي:
يمكنك عمل ping لهذا ال IP وسوف يبدوا كأنه جهاز اخر وانما حقيقة هو Virtual Adapter وكل البرامج بداخل ال container سوف تتصل بهذا ال network adapter وهذا ال IP Address.
ويمكنك استخدام هذا ال IP مباشرة بدلاً من ال Port Mapping كما يلي:
وهذا يعتبر جزء من ال Isolation التي توفره الدوكر وهو ال Network Isolation وسوف نتحدث عنها ونرى أنواعها وبشكل مبسط فقط، وبعد أن ننهي من الأساسيات كاملة. سوف نرى ماذا يحدث خلف الكواليس.
أنواع العزل Isolation في دوكر
البرامج التي تعمل في ال containers تكون معزولة وكأنها تعمل على جهاز لوحدها، وليس لديها علم عن البرامج ونظام الملفات المتواجد على النظام ال host (ونعنى بال host نظام التشغيل الأساسي الذي يعمل عليه الدوكر)، وهناك أنواع من ال isolation كما يلي:
- فصل وحجب قائمة العمليات Process
- فصل وحجب نظام الملفات File System
- فصل وحجب مسجل النظام Registry
- فصل وحجب الشبكات Networking
- فصل وحجب المستخدمين Users & Groups
وسوف نتأكد من كل هذه الأنواع ونرى كيف أن البرامج بداخل ال containers لن تستطيع مشاهدة هذه التفاصيل وانما لها بيانات أخرى، فيما يلي، وسوف نبدأ بمثال أخير نقوم بتحميله ومن ثم مشاهدة تفاصيل ال Image ونبذة عنها وبعدها ندخل في ال isolation
سوف نقوم بتحميل Microsoft/dotnet:nanoserver وهو ال DotNet Runtime ونقوم بتشغيلها مباشرة من خلال الأمر run كما يلي:
بعد ان تحميل وتشغيل ال dotnet فمباشرة ظهر C:\ ومن ثم توقفت عن العمل، ولو نظرت لقائمة العمليات docker ps فلن تجدها، وسوف تجدها متوقفة في ال docker ps –a.
ولاحظ أن أمر التشغيل Command على ما يبدوا هو لتشغيل سطر الأوامر ولكن حصل trunc في المخرج، لذلك يمكنك استخدام المعامل –no-trunc حتى يظهر كامل المخرجات بدون اختصار:
وكما يتبين فإن ال command line قد عملت مباشرة مع ال containers ومن ثم انتهت بعدها، لذلك يمكن ان نقوم بعمل attach لسطر الأوامر من خلال المعامل –it الذي سبق لنا تجربته حتى نستطيع التعامل مع سطر الأوامر ولا يتم انهاء ال container مباشرة. وبعد أن تقوم بكتابة سوف يتم مسح سطر الأوامر وكأنك تنتقل الى سطر أوامر اخر بداخل ال container.
الصورة التالية توضح الأمر، وطالما هذه container بها dotnet فيمكن ان استعلم عن ال framework بها، كما يلي:
حتى هذه اللحظة ما زلنا بداخل سطر الأوامر بداخل ال container ويمكن العودة للسطر الأوامر الخاص بالهوست عن طريق كتابة أمر الخروج exit وسوف تعود لل host.
يمكنك ان تجرب وتقوم بكتابة نفس الأمر dotnet على سطر الأوامر في الهوست، وإذا لم تكن لديك على جهازك الأساسي فسوف تحصل على رسالة خطأ، وهذا يعني ان البرنامج dotnet فقط يعمل بداخل ال container، أما إذا كانت ال dotnet متواجدة في ال host فسوف تعمل ايضاً. لكنها مفصولة تماماً عن التي متواجدة بداخل ال container وقد تكون النسخ مختلفة ايضاً، الصورة التالية تبين ذلك:
وبهذا الشكل نستطيع تشغيل أي برنامج بداخل ال container سواءً كان البرنامج المحدد ان يعمل مباشرة مع ال container أو أي برنامج اخر نريده يمكن ان نقوم بتشغيله، كما في الموضوع الأول في المقدمة، حيث قمنا بفتح ال mongo client المتواجد داخل نفس ال container من خلال الأمر exec.
ولكي نعرف كيف حصل هذا، يجب علينا أن نلقى نظرة الآن حول هذه ال image وبنيتها.
مكونات ال Image
ذكرنا سابقاً أن ال Image هي القالب للبرنامج، والذي يتم تشغيله في Container، وهي التي تحتوي على ملفات البرنامج والاعتماديات الخاصة بها، ولكنها تحتوي أيضاً على شيء أضافي وهو مكتبات نظام التشغيل.
الصورة التالية تعرض كيف تعمل البرمجيات في نظام التشغيل بشكل عام، حيث بداخل جهاز الحاسب، لدينا القطع المادية مثل المعالج، الذاكرة، القرص الصلب وغيرها، وبعد أن يعمل نظام التشغيل سوف يتم تحميل الكيرنل Kernel والذي يتعامل مع ال Hardware بشكل مباشر، بغض النظر عن نظام التشغيل ويندوز او لينوكس فهناك كيرنل يعمل بنفس المفهوم، ومن فوق الكيرنل هناك API مثل Win32 أو POSIX والتي يوفرها النظام لكل البرامج فيه، ومن فوق طبقة ال API فهناك طبقة برمجيات النظام التشغيل التي يأتي بها، مثلاً cmd وغيرها، واخيراً هناك طبقة برمجيات المستخدم التي يقوم بتنزيلها مثلاً جافا او بايثون أي دوت نت.
سوف تجد أن الطبقات مقسمة الى قسمين الأول ما يعرف بال Kernel Space والثانية هي ال User Space وهي تضم كافة البرمجيات ومكتبات نظام التشغيل الضرورية والتي تتعامل مع الكيرنل، وهذا التصميم شائع في أنظمة التشغيل حيث يوفر حماية لل Hardware من الوصول المباشرة بواسطة ال User Space ويجب ان يمر الطلب عبر الكيرنل والذي يحدد ويضبط العملية من خلال ال System Calls.
وهذا يعني مثلاً برنامج الجافا سوف يطلب مكتبات نظام التشغيل Win32 والتي تقوم بعمل System Call الى الكيرنل لتنفيذ المهمة.
الذي يهم في شرح هذه العملية هو أنه في السابق عندما نقوم بنشر البرمجيات فنركز على نشر الطبقة العليا “برمجيات المستخدم” فقط مثلاً جافا او Mongo وغيرها، ونقوم بتحميل ال Installer وهذا ال Installer يعتمد على أشياء يجب ان تكون موجودة مثلاً مكتبات نظام التشغيل والا فلن يعمل بشكل صحيح.
ولكي يتم تفادي مشكلة ان المكتبات غير موجودة فال containers & images تقوم بتغير الطريقة التقليدية، فبدلاً من نشر MonogoDB لوحده فقط، فسيتم نشر كل ما يتواجد في ال User Space وبالتالي يعني البرمجيات + برامج النظام + مكتبات النظام كلها تكون متواجدة في ال image.
وهكذا تكون ال Image مقسمها لعدة طبقات، منها طبقة برمجيات ومكتبات النظام، وبعدها طبقة البرمجيات والاعتماديات الخاصة بها، ويتم رفع ال image على ال Docker Hub.
وهنا يجب الإشارة الى بعض النقاط المهمة:
- بما أن ال Image بها برامج النظام، فيمكن ان يتم تشغيل البرنامج الأساسي في ال Image عند تشغيل ال Container، ويمكن ان يتم تشغيل أي من برامج النظام المتواجدة في ال Image ايضاً.
- إذا تم تحميل مثلاً java Image لل windows فسوف تكون المكتبات والبرمجيات في الطبقة الأساسية Base Layer هي للويندوز، فعند تحميل ال image سوف تلاحظ أنها مكونة من طبقات كما شاهدنا في الأمثلة السابقة، الآن بعد أن ينتهي التحميل، واردنا تحميل image أخرى تستخدم نفس ال base layer فلن يتم تحميلها مجدداً لأنها متواجدة وسيتم تحميل فقط طبقة البرمجيات ويتم استخدام الطبقة المتواجدة، وهذا لأن كل الطبقات التي يتم تحميلها لا تتغير فهي للقراءة فقط Read only. وبالتالي لن تحتاج الى تحميل كل ال User Space في كل مرة كاملة في حال كان يتواجد لديك Layers محملة من قبل في Images تستخدم نفس ال layers.
- عند تشغيل أكثر من Containers فلكل منهم كافة ال User Space ولكنهم في النهاية يشتركوا في نفس الكيرنل. وهذا ما يجعل ال Container أكثر كفاءة من ال VM حيث ال VM تستخدم كيرنل لكل VM يعمل بينما هنا كيرنل واحد لكل ال Containers.
الآن بعد ان تعرفنا على أنه يمكن تشغيل أي من البرامج المتواجدة في ال image فسوف نستخدم نفس ال dotnet image ونقوم بتشغيل ال dotnet مباشرة بدلاً من ال cmd:
طبعاً بعد أن ينتهي البرنامج سوف تتوقف ال Container عن العمل. وبنفس المفهوم يمكن تمرير PowerShell بدلاً من ال dotnet للدخول على ال PowerShell بداخل ال container.
الآن حان الوقت لكي نجرب فكرة ال Isolation ونرى هل هناك عزل أم لا.
عزل العمليات Process Isolation
ويمكن اختبارها بسهولة، حيث يمكن الدخول لأي Container وتنفيذ دالة استخراج كل العمليات التي تعمل، وايضاً تطبق نفس الأمر على ال host وسوف ترى الفرق في العمليات وأن لكل منهم عملياته الخاصة كأنه يعمل في جهاز منفصل.
الان إذا قمت بالدخول على ال PowerShell في ال host وطبقت نفس الأمر Get-Process سوف تجد قائمة كبيرة مختلفة من العمليات، وبالطبع يمكن ان تجرب نفس الامر في لينوكس من خلال الامر ps وشاهد الفرق بين العمليات، ولكن الان سنركز على الويندوز لمشاهدة طرق العزل، ولكن نفس الفكرة يمكن تطبيقها بأوامر اللينوكس بسهولة.
عزل نظام الملفات File System Isolation
سوف نقوم الان بعرض نظام الملفات بداخل ال Container ومشاهدة نظام الملفات على ال host وسوف ترى الفرق، وان لكل منهم tree مختلفة من الملفات. الصورة التالية تعرض الملفات بداخل على القرص سي بداخل ال Container:
بينما على ال host فالملفات مختلفة للغاية:
عزل الشبكات Network Isolation
بنفس الفكرة فال Network Adapter سوف تكون معزولة هي الأخرى، وسوف نقوم الان باستخراج معلومات ال Adapters المتواجد باستخدام الأمر ipconfig
وسنقوم بتطبيق الامر بداخل ال Container
وبالتالي داخل ال container سوف تكون على شبكة أخرى كأنه بالضبط يعمل على جهاز آخر،
وكما تلاحظ سوف تجد ان هناك Virtual Adapter على الهوست تكون هي ال Getaway المستخدمة في ال Container حتى يتم التخاطب بينهم من خلال هذه الشبكة.
وهذا يعني أستطيع تشغيل ويب سيرفر على ال container في البورت 80، حتى لو كان البورت 80 مستخدم في ال host حيث لكل منهم شبكة منفصلة عن الأخرى.
وهكذا سوف نجد ان العزل مطبق على كل هذه الأمور (العمليات، نظام الملفات، الشبكات) وأكثر من ذلك حيث يتم تطبيقه على متغيرات النظام Environment Variable وعلى مسجل النظام Registry وعلى المستخدمين في النظام ايضاً، وتستطيع التأكد منهم بنفس الطرق أعلاه، بعرض النتيجة في ال host وال container ومشاهدة الفرق بينهم.
أخر نقطة بخصوص ال Windows Container فهي تطبق داخلياً أما بال Windows Server Container والتي تستخدم للويندوز سيرفر وسيتم التشغيل مباشرة على النظام، والطريقة الثانية وهي ال Hyper-V Containers وهي بالاعتماد على Hyper-V (وهذا ما يتم في ويندوز 10) لتشغيل ال containers. وستجد ان الثانية بالرغم من أنها تستخدم VM (لكنه أسرع بكثير من ال VM العادي) الا أنها ايضاً قد توفر حماية أفضل بسبب ال VM والذي يتم العزل كلياً.
خلاصة
وصلنا لنهاية الموضوع الثاني، وكما نشاهد ان docker & container تساعدك على تشغيل البرمجيات وجعل حياتك أسهل عما كانت عليه سابقاً، الجدول التالي يعرض كيف كنا نعمل بالطريقة التقليدية سابقاً، وما هو طريقة دوكر لها، وما هو الأمر في دوكر لتطبيق هذا الأمر.
وسوف تجد أن الأمر الخاص بتحميل وتشغيل ال container في آن واحد لا يوجد له بديل بالطرق التقليدية وهذا ما يميز دوكر ويجعلها المستقبل للمطورين لتشغيل البرمجيات وتعلمها ايضاً بسهولة.
جزاكم الله تعالى كل خير ونفع بكم وزداكم من فضلة
خالفي للمعلوميات
شرح جميل ونافع
جزاك الله خير