Docker
شنو هو Docker؟
الـ Docker أداة تخليك تحزم التطبيق مالتك مع كل شي يحتاجه (لغة البرمجة، المكتبات، الإعدادات) داخل "صندوق" معزول اسمه Container. هذا الصندوق يشتغل بنفس الطريقة على أي جهاز، سواء حاسبتك، حاسبة زميلك، أو السيرفر.
يعني بدل ما تكول "بس الكود شغال بحاسبتي!" وتگعد تدور المشكلة لمدة يومين، تضمن إن البيئة نفسها بكل مكان.
ليش أحتاجه؟
انهي مشكلة "ما يشتغل عندي"
كل مبرمج مر بموقف: الكود يشتغل عنده بس ما يشتغل عند زميله. السبب؟ نسخة Node مختلفة، مكتبة ناقصة، أو إعدادات غريبة. Docker يحل هذا الموضوع جذرياً لأن البيئة كلها محزومة ويا التطبيق.
تنصيب المشروع بأمر واحد
بدل ما الموظف الجديد يگعد يومين ينصب 17 أداة ويضبط Environment Variables، يكتب أمر واحد بس وكلشي يشتغل. هذا الشي يفرق بالشركات بشكل كبير.
عزل المشاريع عن بعض
تشتغل على مشروعين؟ واحد يحتاج Node 18 والثاني يحتاج Node 20؟ بدون Docker راح تدوخ بالتضاربات. مع Docker كل مشروع بصندوقه الخاص.
بيئتك تطابق السيرفر
لما تطور داخل Container، انت تشتغل ببيئة تقريباً مطابقة لبيئة الإنتاج (Production). هذا يقلل المفاجآت وقت الرفع.
Container مقابل Virtual Machine
ناس تخلط بينهم. الفرق بسيط:
Virtual Machine: تنصب نظام تشغيل كامل فوق نظامك. ثقيلة، تاخذ دقائق حتى تشتغل، وتستهلك رام هواية.
Container: يشارك الـ Kernel مال نظام التشغيل الموجود. خفيف، يشتغل بثواني، ويستهلك موارد أقل بمراحل.
| الميزة | Virtual Machine | Container |
|---|---|---|
| السرعة | دقائق للبدء | ثواني |
| الحجم | كيكابايتات (GB) | ميكابايتات (MB) |
| الموارد | يحجز رام كامل | يستخدم بس اللي يحتاجه |
| العزل | كامل (نظام مستقل) | على مستوى العمليات |
ملاحظة: هذا ما يعني إن الـ VMs سيئة. كل واحد اله استخدامه. بس للتطوير اليومي، الـ Containers هي الخيار الأسرع والأخف.
المصطلحات الأساسية
هاي المصطلحات راح تسمعها بكل مكان، لازم تعرف شنو تعني:
Image (الصورة): قالب جاهز يحتوي على كل شي يحتاجه التطبيق. تشبه ملف الـ ISO. ما تتغير، بس تكدر تبني منها Containers.
Container (الحاوية): نسخة شغالة من الـ Image. الـ Image هي المخطط، والـ Container هو البيت المبني. تكدر تشغل أكثر من Container من نفس الـ Image.
Dockerfile: ملف نصي فيه التعليمات اللي تكول لـ Docker شلون يبني الـ Image مالتك. مثل وصفة الطبخ بالضبط.
Docker Hub: "متجر" الـ Images. فيه آلاف الـ Images الجاهزة لـ Node.js, Python, PostgreSQL, Nginx وغيرهم. تنزلها وتستخدمها مباشرة.
Docker Compose: أداة تخليك تشغل أكثر من Container سوية بملف واحد. مثلاً التطبيق + قاعدة البيانات + Redis.
Volume: مكان لحفظ البيانات بشكل دائم. بدونه، كل شي داخل الـ Container ينمسح لمن توگفه.
وين يدخل Docker بشغلك اليومي؟
بيئة التطوير المحلية: بدل ما تنصب PostgreSQL أو MongoDB على حاسبتك مباشرة، تشغلها كـ Container. تريد تجربها؟ شغلها. خلصت؟ وقفها. ما تبقى أي "زبالة" بنظامك.
الـ CI/CD: أغلب أنظمة الـ CI (مثل GitHub Actions) تشغل الاختبارات مالتك داخل Containers. هذا يضمن إن الاختبارات تمر بنفس البيئة كل مرة.
الرفع للسيرفر (Deployment): بدل ما تنصب كلشي على السيرفر يدوياً، ترفع الـ Image وتشغلها. والتحديث يصير بسطر واحد: تسحب الـ Image الجديدة وتعيد تشغيل الـ Container.
المايكروسيرفسز (Microservices): المشاريع الكبيرة تتقسم لخدمات صغيرة، كل خدمة بـ Container خاص. كل خدمة تتطور وتتحدث بشكل مستقل عن الباقي.
Docker بلينكس مقابل ويندوز
الـ Docker أصلاً مبني على تقنيات من الـ Linux Kernel (مثل cgroups و namespaces). يعني بلينكس يشتغل Native بشكل مباشر وبأفضل أداء.
بالويندوز، Docker يحتاج يشغل WSL 2 (يعني لينكس افتراضي) ورا الكواليس حتى يشغل الـ Containers. يشتغل، بس مو بنفس الخفة.
اذا انت مطور جدي وتستخدم Docker بشكل يومي، هذا سبب إضافي ليش لينكس هو الخيار الأنسب للمطورين.
منين أبدي أتعلم؟
الموقع الرسمي هو أفضل مصدر:
- Docker Documentation — الـ Getting Started مالتهم ممتاز ويوديك خطوة بخطوة.
كورسات عملية:
- Docker للمبتدئين - TechWorld with Nana — من أوضح الشروحات بالإنكليزي.
- KodeKloud - Docker for Beginners — فيه تمارين عملية تكتب الأوامر مباشرة بالمتصفح.
نصيحة: لا تحاول تحفظ كل أوامر Docker. نصب Docker، خذ مشروعك الحالي، وحاول تشغله داخل Container. الأوامر راح تحفظها بالتكرار مو بالقراءة.
خلاصة
الـ Docker مو "شي زيادة للمحترفين". هو أداة أساسية لأي مطور، خاصة بالـ Backend والـ DevOps. الفكرة بسيطة: تحزم شغلك بصندوق، وهذا الصندوق يشتغل بكل مكان. ابدأ بتنصيبه وجرب تشغل أي Image جاهزة من Docker Hub، ومن تحس بالراحة، اكتب أول Dockerfile لمشروعك.