Docker & Kubernetes — الدليل الشامل من الحاويات المنفردة إلى إدارة العناقيد السحابية
دليل شامل للمطورين يشرح المفاهيم المعمارية للحاويات والفرق بين Docker والأجهزة الافتراضية وإدارة العناقيد السحابية عبر Kubernetes.
Docker & Kubernetes — الدليل الشامل من الحاويات المنفردة إلى إدارة العناقيد السحابية
1. مشكلة النشر التقليدي وظهور فكرة الحاويات (The "Works on My Machine" Problem)
تخيل أنك انتهيت من تطوير تطبيق متكامل يتكون من:
- واجهة أمامية (Frontend) مثل Angular أو Next.js
- خادم واجهات برمجة التطبيقات (API Server) مثل ASP.NET Core أو Node.js
- قاعدة بيانات علائقية مثل PostgreSQL
- طبقة تخزين مؤقت وإدارة جلسات مثل Redis
على بيئة التطوير المحلية (Local Development)، كل شيء يعمل بكفاءة وسلاسة. لكن بمجرد محاولة نشر التطبيق على الخادم الفعلي (Production Server)، تبدأ المشاكل بالظهور:
- الخادم يحتوي على إصدار مختلف من .NET Runtime أو Node.js.
- هناك مكتبات واعتماديات (Dependencies) ناقصة على نظام التشغيل.
- متغيرات البيئة (Environment Variables) غير مهيأة بشكل متطابق.
- خدمة Redis تحتاج إلى تثبيت وتهيئة مستقلة وإعدادات شبكة مختلفة.
هنا تظهر الجملة الشهيرة في عالم تطوير البرمجيات: "ولكن التطبيق يعمل على جهازي!" ("It works on my machine!").
+-----------------------+ +-----------------------+
| Developer Machine | | Production Server |
| - Node.js v20.x | Deploy | - Node.js v16.x (💥) |
| - PostgreSQL 16 | -----------> | - PostgreSQL 13 (💥) |
| - Dependencies OK | | - Missing Libs (💥) |
| ==> RUNNING PASS ✅ | | ==> CRASHED 500 ❌ |
+-----------------------+ +-----------------------+
2. كيف كنا نقوم بالنشر بدون Docker؟
بدون Docker، يتم استئجار خادم افتراضي (VPS) بنظام Linux، ويقوم المهندس بالخطوات التالية يدويًا:
- تثبيت الحزم وحزم التشغيل (Runtimes).
- تثبيت وتكوين خادم الويب العكسي (مثل Nginx).
- تثبيت الاعتماديات وإعداد متغيرات البيئة.
- نسخ ملفات التطبيق وبدء التشغيل.
المشكلة الحقيقية تظهر عندما تتعدد البيئات:
- Development: بيئة التطوير الفردية.
- Testing / QA: بيئة اختبار الجودة.
- Staging: بيئة مطابقة للإنتاج.
- Production: البيئة الحية التي يتعامل معها المستخدمون.
أي اختلاف طفيف في إصدارات الحزم أو إعدادات نظام التشغيل بين هذه البيئات يؤدي إلى انهيار غير متوقع في الإنتاج. الحل لم يكن بنقل كود التطبيق فقط، بل بنقل التطبيق مع كامل بيئة تشغيله (Application + Runtime Environment).
3. أساسيات Docker وكيف يعمل
بدلًا من كتابة تعليمات تثبيت يدوية للخادم، نقوم بتعريف مواصفات البيئة في ملف نصي يُسمى Dockerfile:
# 1. Base Image
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base
WORKDIR /app
EXPOSE 8080
# 2. Build Stage
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY ["MyApp.csproj", "./"]
RUN dotnet restore "./MyApp.csproj"
COPY . .
RUN dotnet build "MyApp.csproj" -c Release -o /app/build
# 3. Publish Stage
FROM build AS publish
RUN dotnet publish "MyApp.csproj" -c Release -o /app/publish /p:UseAppHost=false
# 4. Final Runtime
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]
دورة حياة الحاويات:
Dockerfile (الوصف) ──[docker build]──> Docker Image (الحزمة المدمجة) ──[docker run]──> Container (الحاوية قيد التشغيل)
- Dockerfile: الوصف البرمجي الدقيق لخطوات البناء.
- Docker Image: القالب الجاهز والغير قابل للتعديل (Immutable Snapshot) الذي يحتوي على الكود والحزم ونظام الملفات.
- Container: البيئة المعزولة الفعلية التي يتم تشغيلها من الـ Image.
4. الفرق الجوهري بين الحاويات (Containers) والأجهزة الافتراضية (VMs)
+-----------------------------------+ +-----------------------------------+
| Virtual Machines (VMs) | | Docker Containers |
+-----------------------------------+ +-----------------------------------+
| [App A] [App B] [App C] | | [App A] [App B] [App C] |
| [Bins/Lib][Bins/Lib][Bins/Lib] | | [Bins/Lib][Bins/Lib][Bins/Lib] |
| [Guest OS][Guest OS][Guest OS] | | [Docker Engine] |
| +-----------------------------+ | | +-----------------------------+ |
| | Hypervisor (Type 1 / 2) | | | | Host OS & Linux Kernel | |
| +-----------------------------+ | | +-----------------------------+ |
| | Physical Hardware | | | | Physical Hardware | |
| +-----------------------------+ | | +-----------------------------+ |
+-----------------------------------+ +-----------------------------------+
| وجه المقارنة | Virtual Machines (VMs) | Docker Containers |
|---|---|---|
| نظام التشغيل | يحتوي كل جهاز افتراضي على نظام تشغيل كامل (Guest OS) يستهلك عدة جيجابايت | تشترك الحاويات في نواة نظام التشغيل المضيف (Shared Host Kernel) |
| زمن التشغيل | يحتاج دقائق للإقلاع الكامل للـ OS | يعمل خلال أجزاء من الثانية (Milliseconds) |
| استهلاك الموارد | استهلاك عالي جدًا للذاكرة والمعالج | خفيف جدًا وفعال في استغلال الموارد |
| العزل | عزل عتادي كامل عبر Hypervisor | عزل معالجات ومساحات أسماء عبر Kernel Namespaces & Cgroups |
5. إدارة التطبيقات متعددة الحاويات عبر Docker Compose
عندما يتطلب التطبيق عدة خدمات متزامنة (Web App + PostgreSQL + Redis)، يتم توحيد تشغيلها عبر docker-compose.yml:
version: '3.8'
services:
api:
build: .
ports:
- "8080:8080"
environment:
- DB_HOST=postgres
- REDIS_HOST=redis
depends_on:
- postgres
- redis
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: secretpassword
volumes:
- pgdata:/var/lib/postgresql/data
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
pgdata:
أمر واحد docker compose up -d يشغل البيئة بأكملها بشبكة داخلية معزولة وأحجام تخزين دائمة.
6. لماذا نحتاج Kubernetes؟ (Where Docker Stops & Orchestration Begins)
Docker و Docker Compose مثاليان لجهاز المطور أو لخادم وحيد. ولكن في بيئة الإنتاج السحابية، تظهر تحديات جديدة:
- ماذا لو توقفت الحاوية فجأة أثناء الليل؟ (Auto-healing)
- ماذا لو زاد عدد الزوار فجأة ونحتاج إلى 10 نسخ من الحاوية بدلًا من نسختين؟ (Auto-scaling)
- كيف نوزع الزيارات بالتساوي بين النسخ المتعددة؟ (Load Balancing)
- كيف نقوم بنشر إصدار جديد بدون إيقاف الخدمة ولو لثانية واحدة؟ (Zero-Downtime Rolling Updates)
- ماذا لو تعطل الخادم الفعلي بالكامل؟ كيف ننقل الحاويات إلى خادم سليم تلقائيًا؟ (Self-healing & Scheduling)
هنا يأتي دور Kubernetes (K8s) كنظام لإدارة وتنسيق مجموعات الحاويات عبر عنقود من الخوادم (Container Orchestration).
+-------------------------------------------------------------------------------+
| KUBERNETES CLUSTER |
+-------------------------------------------------------------------------------+
| [ Control Plane (Master Node) ] |
| - API Server | etcd (State Store) | Scheduler | Controller Manager |
+-------------------------------------------------------------------------------+
| [ Worker Node 1 ] | [ Worker Node 2 ] |
| - Kubelet | Kube-Proxy | Runtime | - Kubelet | Kube-Proxy | Runtime |
| +-----------------------------+ | +-----------------------------+ |
| | Pod (App v1) | Pod (App v1) | | | Pod (App v1) | Pod (Redis) | |
| +-----------------------------+ | +-----------------------------+ |
+-------------------------------------------------------------------------------+
7. المفاهيم الأساسية في Kubernetes (Core K8s Primitives)
1. الـ Pod
أصغر وحدة قابلة للنشر في Kubernetes. يمثل غلافًا يحتوي على حاوية واحدة أو أكثر تشترك في نفس الشبكة والتخزين.
2. الـ Deployment
المسؤول عن تحديد الحالة المرغوبة (Desired State) للتطبيق: عدد النسخ (Replicas)، استراتيجية التحديث، والتعافي التلقائي.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myregistry/myapp:v1.2.0
ports:
- containerPort: 8080
resources:
limits:
memory: "512Mi"
cpu: "500m"
requests:
memory: "256Mi"
cpu: "250m"
3. الـ Service
يوفر نقطة وصول ثابتة (Stable Virtual IP & DNS) وتوزيع الحمل (Load Balancer) عبر الـ Pods المتغيرة والمؤقتة:
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: ClusterIP
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 8080
4. الـ Ingress
بوابة الدخول للعنقود التي توجه حركة المرور الخارجية (HTTP/HTTPS) إلى الـ Services بناءً على اسم النطاق والمسار مع إدارة شهادات SSL/TLS.
8. الخلاصة الهندسية
- Docker: يحزم التطبيق واعتمادياته داخل حاوية قياسية موحدة تعمل في أي مكان.
- Docker Compose: يدير التطبيقات متعددة الحاويات على جهاز أو خادم فردي.
- Kubernetes: يدير عناقيد الحاويات على نطاق واسع في بيئات الإنتاج ويوفر التوسع التلقائي، وموازنة الأحمال، والتعافي الذاتي من الأعطال.
منشورات مقترحة
مشاريع ذات صلة
منصة عقارية متكاملة تدعم دورة حياة الإعلانات، وإشعارات الواتساب المباشرة، والبحث الجغرافي بالخريطة في القاهرة والجيزة.
منظومة تشغيلية متكاملة لشركات السياحة لإدارة الرحلات والحجوزات وإصدار الفواتير متعددة العملات وكشوف المسافرين.
منصة نادي سفر خاص قائمة على العضوية تجمع بين اكتشاف الفنادق الفاخرة المنتقاة، والأسعار المحمية للأعضاء، وطلبات الحجز المنظمة، ودورة عمل تشغيلية بمساعدة مستشار سفر مخصص.