تعلمت Docker، واستخدمتها، وحوّلت كل شيء تقريبًا إلى حاويات.
لم تعد مضطرًا إلى إضاعة الوقت في إعداد بيئات التطوير يدويًا على جهازك. تسحب Image، وتشغّل Container، ثم يعمل كل شيء.
ولفترة طويلة، ربما لم تسأل نفسك ما هي الـContainer فعلًا. وربما اكتفيت بالتفكير: «ما الفائدة من معرفة ذلك؟ المهم أنها تعمل».
ثم بدأت الأسئلة بالظهور:
- إذا كانت الـContainer معزولة عن جهازي، فهل تأتي داخل الـImage بنظام تشغيل كامل؟
- إذا كان هناك نظام تشغيل داخلها، فلماذا تكون Container Images خفيفة إلى هذا الحد؟
- لماذا يحتاج Windows إلى بيئة Linux مثل WSL2 لتشغيل Container بسيطة تعمل بنظام Linux؟
الجواب هو أن الـContainer ليست Virtual Machine. فـContainer Image عبارة أساسًا عن حزمة من ملفات User Space: كود التطبيق، والمكتبات، والملفات التنفيذية، والإعدادات، والبيانات الوصفية. وعند تشغيل الـContainer، يعمل التطبيق كـProcess على نواة نظام التشغيل المضيف، بينما يوفر الـKernel العزل باستخدام ميزات مثل Namespaces، ويضبط حدود الموارد باستخدام Control Groups أو Cgroups.
يتولى Docker Engine إدارة هذه العملية، وتجهيز طريقة رؤيتها لنظام الملفات، وضبط الشبكة والموارد، وتطبيق إعدادات العزل. لذلك فالـContainer ليست نظام تشغيل كاملًا داخل صندوق؛ بل هي بيئة معزولة لعملية تستخدم نواة المضيف.
ولهذا يمكن أن تكون Container Images خفيفة. فهي لا تحتوي عادةً على Kernel خاص بها أو Bootloader أو تثبيت كامل لنظام تشغيل. بل تحتوي على مكونات User Space التي يحتاج إليها التطبيق، وتكون مرتبة ضمن طبقات يمكن إعادة استخدامها بكفاءة.
وهناك تفصيل مهم يتعلق بمنصة Windows. تحتاج Linux Containers إلى سلوك نواة Linux. وبما أن Windows يستخدم نواة مختلفة، يشغّل Docker Desktop عادةً Virtual Machine خفيفة بنظام Linux، وغالبًا من خلال WSL2، لتوفير البيئة التي تحتاج إليها هذه الـContainers. لذلك لا نستخدم WSL2 لأن الـContainers آلات افتراضية؛ بل لأن الـContainer والمضيف يحتاجان إلى واجهة نواة متوافقة.
هل يهم هذا المستوى من التفاصيل؟ في هندسة الحاسوب والبرمجة، نعم. ففهم المعمارية يوضح نقاط القوة والحدود في الأداة التي نستخدمها.
فعلى سبيل المثال، توفر الـContainers عزلًا على مستوى العمليات، لكنها لا تقدم بالضرورة حدًا أمنيًا مماثلًا لما توفره Virtual Machine تقليدية. وقد تكون الـContainer مضبوطة بشكل خاطئ، أو تعمل بصلاحيات زائدة، أو تعرض خدماتها للشبكة، أو تحتوي على اعتماديات ضعيفة. وعبارة «التطبيق يعمل داخل Container» ليست استراتيجية أمنية كاملة.
عندما ننظر خلف الأوامر السهلة، نبدأ برؤية كيفية بناء الأنظمة الكبيرة: توفر الـImages ملفات User Space قابلة لإعادة الإنتاج، ويوفر الـKernel الأدوات الأساسية، بينما ينسق الـEngine العملية ونظام الملفات والشبكة وحدود الموارد.
ولهذا فإن فهم «كيف» أمر مهم. استخدام الأداة يجعلك أكثر إنتاجية، أما فهم معماريتها فيساعدك على تفسير سلوكها، وتصحيح أعطالها، واستخدامها بطريقة مسؤولة. وهذا أحد الأمور التي تحول المبرمج إلى مهندس.

