دليل العالم الحقيقي للحاويات والتنسيق: الدحيح مقابل الدحيح
٩ ديسمبر ٢٠٢٥
Dockerfile - ملف نصي بسيط يصف كيفية تجميع البيئة.
هنا مثال أدنى حد:
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
قم ببنائه وتشغيله:
Docker build -t myapp:latest .
Docker run -d -p 8080:8080 myapp:latest
لديك الآن تطبيق مستقل يتصرف بشكل متطابق على أي آلة بها Docker مثبت.
مخطط Docker المعماري
graph TD;
A(Docker CLI] --> B(Docker Daemon]
B --> C([Container Runtime]
C --> D([Containers]
B --> E([Image Registry]
تشغل Docker الحاويات على مضيف واحد. بالنسبة للعديد من المطورين والفرق الصغيرة، هذا كافٍ. ولكن لأنظمة الإنتاج التي تمتد عبر عدة عقد، فإن Docker وحدها غير كافية.
Kubernetes: المنسق
Kubernetes (اختصارًا لـ "K8s") هي "منصة تنسيق" - تدير الحاويات عبر مجموعات من الآلات.
إنه يتعامل مع مهام مثل:
- "جدولة" الحاويات للتشغيل على العقد الصحيحة.
- "مقياس" التطبيقات صعودًا أو هبوطًا تلقائيًا.
- "الشفاء الذاتي" (إعادة تشغيل الحاويات الفاشلة).
- "التحديثات المتداولة" بدون وقت توقف.
- "اكتشاف الخدمة وتوازن التحميل".
نظرة عامة على بنية Kubernetes
graph LR;
subgraph Control Plane
A(API Server] --> B([Scheduler]
A --> C([Controller Manager]
A --> D([etcd]
end
subgraph Node
E([Kubelet] --> F([Pod]
E --> G([Container Runtime]
end
Control Plane --> Node
يتكون كل "مجموعة" Kubernetes من:
- "طائرة التحكم" - الدماغ، الذي يدير حالة المجموعة.
- "عقد العامل" - حيث تعمل الحاويات بالفعل.قد تبدو عملية نشر تطبيق بسيط على النحو التالي:
kubectl create deployment myapp --image=myapp:latest
kubectl expose deployment myapp --type=LoadBalancer --port=80
هذا يقوم بتشغيل تطبيقك، ويكشفه على الشبكة، ويقوم بالتوسع تلقائيًا إذا لزم الأمر.
Docker مقارنة مع Kubernetes: مقارنة
| الميزة | Docker | Kubernetes |
|---|---|---|
| الدور الأساسي | الحاويات | تنسيق الحاويات |
| النطاق | مضيف واحد | مجموعة عقد متعددة |
| وحدة النشر | حاوية | بود (واحدة أو أكثر من الحاويات) |
| التوسع | يدويًا أو Docker سوارم | تلقائيًا (مقياس بود الأفقي تلقائيًا) |
| الشبكات | جسر أو شبكات المضيف | شبكة التغليف على نطاق المجموعة |
| التخزين | المجلدات المحلية أو التثبيتات | الأحجام الدائمة، التخصيص الديناميكي |
| موازنة التحميل | أساسي (تكوين Docker أو سوارم) | اكتشاف الخدمة المدمجة وتحميل موازنة |
| الشفاء الذاتي | سياسة إعادة التشغيل فقط | المصالحة الكاملة (يعيد جدولة بود الفاشلة) |
| التكوين | Dockerfile، Compose | مظاهرات YAML (نشر، خدمات، إلخ.) |
Docker و Kubernetes معًا
هناك سوء فهم شائع بأن Docker و Kubernetes منافسان. في الواقع، يكملان بعضهما البعض.
- Docker يقوم ببناء وتشغيل الحاويات.
- Kubernetes يقوم بجدولة وإدارتها عبر المجموعات.
في الواقع، استخدم Kubernetes في الأصل Docker كوقت حاوية الافتراضي 4. على الرغم من أن Kubernetes يدعم الآن واجهة وقت الحاوية (CRI) - مما يسمح بوقت مثل containerd أو CRI-O - تظل صور Docker متوافقة تمامًا.
خطوة بخطوة: من Docker إلى Kubernetes
دعونا نتعرف على كيفية الانتقال من تطبيق Dockerized بسيط إلى نشر Kubernetes.
1. البناء واختبار محليًا مع Docker
Docker build -t myapp:latest .
Docker run -p 8080:8080 myapp:latest
2. دفع الصورة إلى السجل
Docker tag myapp:latest myregistry/myapp:v1
Docker push myregistry/myapp:v1
3. إنشاء نشر Kubernetes YAML
# myapp-deployment.yaml
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
ports:
- containerPort: 8080
4. نشر واكتشاف
kubectl apply -f myapp-deployment.yaml
kubectl expose deployment myapp-deployment --type=LoadBalancer --port=80 --target-port=8080
5. التحقق
kubectl get pods
kubectl get svc
مثال على الإخراج:
NAME READY STATUS RESTARTS AGE
myapp-deployment-7b8c9d7f8d-abcde 1/1 Running 0 2m
myapp-deployment-7b8c9d7f8d-fghij 1/1 Running 0 2m
الآن لديك تطبيق قابل للتطوير، وقابل للتكيف يعمل على Kubernetes - بدءًا من صورة Docker.
متى تستخدمه ومتى لا
| السيناريو | استخدم Docker | استخدم Kubernetes |
|---|---|---|
| التطوير المحلي | ✅ ممتاز للاختبار والتجريب | ⚠️ مبالغ فيه للتطوير المحلي |
| تطبيقات صغيرة الحجم | ✅ أبسط وأسرع | ❌ يضيف تعقيدًا غير ضروري |
| الإنتاج على نطاق واسع | ⚠️ تنسيق محدود | ✅ مثالي للتوسع والمرونة |
| عمليات النشر متعددة السحابة أو الهجينة | ⚠️ مطلوب الإعداد اليدوي | ✅ مصمم للنقلية |
| خطوط أنابيب CI/CD | ✅ رائع لمراحل البناء/الاختبار | ✅ رائع لمراحل النشر |
في جوهر الأمر:
- استخدم Docker عندما تريد البساطة والسرعة.
- استخدم Kubernetes عندما تحتاج إلى الأتمتة والتوسع وقابلية التسامح مع الخطأ.
دراسات حالة من العالم الحقيقي
مثال 1: منصة وسائط على نطاق واسع
تستخدم منصات البث الرئيسية Kubernetes لإدارة الخدمات الصغيرة التي تتعامل مع ملايين المستخدمين المتزامنين 5. يتم تشغيل كل خدمة كمجموعة من البودات، ويتم توسيعها تلقائيًا بناءً على حركة المرور.
مثال 2: منصات الخدمات المالية وAPI
تعتمد أنظمة الدفع والخدمات المالية غالبًا على Docker لبناء قابل للتكرار، ثم نشر تلك الحاويات في مجموعات Kubernetes لتوفرها 6.
مثال 3: منصات المطورين الداخلية
تبني الشركات بشكل متزايد منصات المطورين الداخلية التي تعمل بالطاقة Kubernetes - مما يقدم للمطورين بيئات ذاتية الخدمة مع الحفاظ على الحوكمة المركزية.
اعتبارات الأداء
أداء Docker
- وقت التشغيل: تبدأ الحاويات في أجزاء من الثانية.
- الأعباء: ضئيلة مقارنة بالآلات الافتراضية، حيث تشترك الحاويات في نواة المضيف.
- عزل الموارد: يستخدم مساحات الأسماء Linux وcgroups 7.
أداء Kubernetes
- التوسع: يقوم Horizontal Pod Autoscaler بتعديل النسخ بناءً على مقاييس وحدة المعالجة المركزية/الذاكرة.
- الجدولة: يقوم المخطط بتحسين التنسيب بناءً على طلبات الموارد.
- الأعباء: تضيف طائرة التحكم بعض التأخير، ولكنها تافهة مقارنة بالفوائد عند التوسع.
نصيحة: بالنسبة لأحمال العمل الصغيرة، فإن Docker Compose أسرع في الإعداد. بالنسبة لأحمال العمل الكبيرة، فإن Kubernetes يعوض عن نفقاته من خلال الأتمتة.
اعتبارات الأمان
يتطلب كل من Docker وKubernetes تكوينًا دقيقًا.
أمان Docker
- استخدم الحاويات غير الجذرية.
- قم بمسح الصور بحثًا عن نقاط الضعف بانتظام.
- قم بتوقيع الصور والتحقق من مصدرها.
- حدد قدرات الحاوية (على سبيل المثال، إسقاط
NET_ADMIN).
أمان Kubernetes
- استخدم التحكم في الوصول القائم على الأدوار (RBAC) 8.
- قم بتمكين سياسات الشبكة لعزل حركة المرور.
- احتفظ بالأسرار في أسرار Kubernetes، وليس متغيرات البيئة.
- قم بتصحيح العقد والمجموعة بانتظام.
يوصي OWASP بتطبيق مبدأ الامتياز الأدنى لجميع الحاويات وأدوار المجموعة 9.
الفخاخ والحلول الشائعة
| الفخ | السبب | الحل |
|---|---|---|
| فشل الحاويات في بدء التشغيل | اعتمادات مفقودة | تحقق من صورة Dockerfile والمسارات الأساسية |
البودات عالقة في CrashLoopBackOff |
تحطم التطبيق أو سوء التكوين | تحقق من السجلات باستخدام kubectl logs |
| مشكلات الشبكات | خدمة أو DNS غير مهيأة بشكل خاطئ | استخدم kubectl describe svc للتصحيح |
| أخطاء سحب الصورة | مصادقة السجل الخاص | أنشئ سر Kubernetes بمصادقاته |
| استنفاد الموارد | لم يتم تعيين حدود | حدد resources.requests و limits في YAML |
الاختبار والقابلية للملاحظة
اختبار حاويات Docker
- استخدم
Docker-composeلاختبارات التكامل. - قم بتشغيل اختبارات الوحدة داخل الحاويات للحفاظ على الاتساق.
Docker run --rm myapp:latest pytest tests/
اختبار عمليات النشر Kubernetes
- استخدم مساحات أسماء Kubernetes للمراحل.
- قم بتطبيق عمليات النشر الكناري أو الزرقاء والخضراء.
الرصد والتسجيل
- استخدم بروميثيوس للمؤشرات وجرافانا للوحة المعلومات.
- قم بمركزية السجلات عبر فلوينت أو مجموعة ELK.
- استخدم فحوصات الحالة والجاهزية لضمان وقت التشغيل.
مثال على تكوين الفحص:
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 10
periodSeconds: 30
الأخطاء الشائعة التي يقع فيها الجميع
- تشغيل كل شيء كجذر - مخاطرة أمنية كبيرة.
- عدم تعيين حدود الموارد - يمكن أن يؤدي إلى تعطل العقد تحت الحمل.
- تجاهل حجم الصورة - تؤدي الصور المنتفخة إلى إبطاء عمليات النشر.
- تخطي فحوصات الحالة - يؤدي إلى فشل غير مرئي.
- تضمين الأسرار بشكل ثابت - ينتهك أفضل الممارسات الأمنية.
دليل الاستكشاف والإصلاح
Docker
- عرض السجلات:
Docker logs <container_id> - فحص الحاوية:
Docker inspect <container_id> - فحص طبقات الصور:
Docker history
Kubernetes
- وصف المورد:
kubectl describe pod - عرض السجلات:
kubectl logs - تصحيح الأخطاء في Shell:
kubectl exec -it-- /bin/bash - حذف البودات العالقة:
kubectl delete pod--force --grace-period=0
الرؤية المستقبلية
أصبحت الحاويات والتنظيم الآن أساسًا لـ DevOps الحديثة. بينما لا يزال Docker هو أساس الحاويات، فقد تطورت Kubernetes إلى "طائرة التحكم العالمية" للتطبيقات السحابية الأصلية.
تشمل الاتجاهات الناشئة ما يلي:
- Serverless Kubernetes (على سبيل المثال، AWS Fargate و Google Cloud Run).
- GitOps workflows للنشر الإعلاني.
- Service meshes مثل Istio للتحكم المتقدم في حركة المرور.
لم تعد مناقشة Docker مقابل Kubernetes حول المنافسة - إنها حول التعاون.
النقاط الرئيسية
Docker يبسط التعبئة والتغليف وتشغيل التطبيقات.
Kubernetes يُتمم النشر والتوسع والإدارة.
معًا، يشكلون العمود الفقري للبنية التحتية السحابية الأصلية الحديثة.
الأسئلة الشائعة
السؤال 1: هل يمكنني استخدام Kubernetes بدون Docker؟
نعم. يدعم Kubernetes أي وقت تشغيل متوافق مع واجهة وقت تشغيل الحاوية (CRI)، مثل containerd أو CRI-O 4 .
السؤال 2: هل لا يزال Docker Swarm ذا صلة؟
Docker Swarm أبسط ولكن أقل ميزة من Kubernetes. إنه مناسب للأفرقة الصغيرة أو الإعدادات البسيطة.
السؤال 3: كيف يمكنني مراقبة أداء الحاوية؟
استخدم أدوات مثل Prometheus و Grafana و cAdvisor للمقاييس، و ELK أو OpenTelemetry للسجلات.
السؤال 4: ما هو الاختلاف في منحنى التعلم؟
Docker أسهل بكثير في التعلم في البداية؛ Kubernetes لديه منحنى تعلم أكثر حدة بسبب طبيعته الموزعة.
السؤال 5: هل يمكن أن تدير Kubernetes أيضًا الآلات الافتراضية؟
نعم، باستخدام مشاريع مثل KubeVirt، يمكن لـ Kubernetes إدارة الآلات الافتراضية جنبًا إلى جنب مع الحاويات.
الخطوات التالية
- جرب حاوية تطبيق صغير باستخدام Docker.
- قم بنشره على مجموعة Kubernetes محلية باستخدام Minikube أو Kind .
- استكشف المراقبة باستخدام Prometheus و Grafana.
- انتقل تدريجياً من عمليات النشر اليدوية إلى GitOps workflows.
إذا استمتعت بهذا الغوص العميق، ففكر في الاشتراك في نشرتنا الإخبارية للحصول على مزيد من الأفكار العملية حول DevOps والهندسة السحابية الأصلية.
حواشي
-
Docker وثائق - https://docs.Docker.com/ ↩
-
نظرة عامة على الحاويات Linux - https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html ↩
-
Kubernetes وثائق - https://Kubernetes.io/docs/home/ ↩
-
Kubernetes واجهة وقت تشغيل الحاوية (CRI) - https://Kubernetes.io/docs/concepts/containers/runtime-class/ ↩ ↩ 2
-
مدونة تقنية Netflix - https://netflixtechblog.com/ ↩
-
مدونة هندسة Stripe - https://stripe.com/blog/engineering ↩
-
وثائق مساحات أسماء Linux - https://man7.org/linux/man-pages/man7/namespaces.7.html ↩
-
Kubernetes RBAC - https://Kubernetes.io/docs/reference/access-authn-authz/rbac/ ↩
-
مبادئ توجيهية لأمان الحاوية OWASP - https://owasp.org/www-project-container-security/ ↩