الحاويات مع Docker وKubernetes

لقد أحدثت الحاويات ثورة في كيفية بناء البرامج وشحنها وتشغيلها. من خلال تجميع التطبيقات مع تبعياتها في وحدات محمولة وخفيفة الوزن، تحل الحاويات مشكلة "أنها تعمل على جهازي" وتتيح النشر المتسق عبر بيئات التطوير والاختبار والإنتاج.
مقدمة
لقد أحدثت الحاويات ثورة في كيفية بناء البرامج وشحنها وتشغيلها. من خلال تجميع التطبيقات مع تبعياتها في وحدات محمولة وخفيفة الوزن، تحل الحاويات مشكلة "أنها تعمل على جهازي" وتتيح النشر المتسق عبر بيئات التطوير والاختبار والإنتاج.
جعل Docker الحاويات قابلة للوصول. لقد جعلها نظام Kubernetes قابلة للإدارة على نطاق واسع. ويشكلون معًا العمود الفقري لنشر التطبيقات السحابية الأصلية الحديثة.
ما هي الحاويات؟
الحاويات مقابل الأجهزة الافتراضية
┌───────────────────────┐ ┌───────────────────────┐
│ Virtual Machine │ │ Container │
├───────────────────────┤ ├───────────────────────┤
│ ┌─────────────────┐ │ │ ┌─────────────────┐ │
│ │ Application │ │ │ │ Application │ │
│ ├─────────────────┤ │ │ ├─────────────────┤ │
│ │ Guest OS │ │ │ │ Dependencies │ │
│ │ (full kernel) │ │ │ ├─────────────────┤ │
│ ├─────────────────┤ │ │ │ Container │ │
│ │ Hypervisor │ │ │ │ Runtime │ │
│ ├─────────────────┤ │ │ ├─────────────────┤ │
│ │ Host OS │ │ │ │ Host OS │ │
│ └─────────────────┘ │ │ │ Kernel (shared)│ │
└───────────────────────┘ │ └─────────────────┘ │
└───────────────────────┘
| ميزة | جهاز افتراضي | حاوية |
|---|---|---|
| وقت التمهيد | دقائق | ميلي ثانية |
| مقاس | جيجا بايت | ميغابايت |
| الحمل الزائد لنظام التشغيل | نظام تشغيل كامل لكل جهاز افتراضي | نواة مشتركة |
| عزل | قوي (على مستوى الأجهزة) | مستوى العملية |
| أداء | قريب من الوطن | قريب من الوطن |
| قابلية | جيد | ممتاز |
| كثافة | منخفض (10-100 لكل مضيف) | عالية (100-1000 لكل مضيف) |
عامل الميناء: منصة الحاوية
المفاهيم الأساسية
| مفهوم | وصف |
|---|---|
| صورة | قالب للقراءة فقط يحتوي على تعليمات لإنشاء حاوية |
| حاوية | نسخة قابلة للتشغيل من الصورة |
| ملف الإرساء | ملف نصي يحتوي على تعليمات لإنشاء صورة |
| ** التسجيل ** | تخزين الصور وتوزيعها (Docker Hub وECR وGCR) |
| مقدار | تخزين مستمر للبيانات خارج نظام ملفات الحاوية |
| شبكة | التواصل بين الحاويات والعالم الخارجي |
| ** يؤلف ** | تحديد وتشغيل التطبيقات متعددة الحاويات |
أفضل ممارسات ملف Dockerfile
# 1. Use specific base images (not 'latest')
FROM node:20-alpine AS builder
# 2. Set working directory
WORKDIR /app
# 3. Copy dependency files first (leverage layer caching)
COPY package*.json ./
RUN npm ci --production
# 4. Copy application code last
COPY . .
# 5. Use multi-stage builds
FROM node:20-alpine AS production
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
# 6. Run as non-root user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
# 7. Expose only necessary ports
EXPOSE 3000
# 8. Use exec form of CMD
CMD ["node", "dist/server.js"]
ورقة الغش لأوامر Docker
# Build image
docker build -t myapp:1.0 .
# Run container
docker run -d --name myapp -p 3000:3000 myapp:1.0
# Execute command in running container
docker exec -it myapp bash
# View logs
docker logs -f myapp
# List containers
docker ps -a
# Stop and remove
docker stop myapp && docker rm myapp
# Volumes (persistent data)
docker volume create data-volume
docker run -v data-volume:/app/data myapp:1.0
# Compose (multi-service)
docker compose up -d
docker compose logs -f
docker compose down
شبكة دوكر
# docker-compose.yml
version: '3.8'
services:
web:
image: myapp:latest
ports:
- "3000:3000"
networks:
- frontend
- backend
depends_on:
- api
- db
api:
image: api:latest
networks:
- backend
environment:
- DB_HOST=db
db:
image: postgres:16-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- backend
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
networks:
frontend:
backend:
volumes:
postgres_data:
secrets:
db_password:
file: ./secrets/db_password.txt
Kubernetes: تنسيق الحاويات
يقوم Kubernetes (K8s) بأتمتة نشر التطبيقات الموجودة في حاويات وتوسيع نطاقها وإدارتها عبر المجموعة.
بنيان
┌──────────────────────────────────────────────┐
│ Kubernetes Control Plane │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ API │ │ Scheduler│ │ Controller │ │
│ │ Server │ │ │ │ Manager │ │
│ └──────────┘ └──────────┘ └──────────────┘ │
│ ┌─────────────────────────────────────────┐│
│ │ etcd (distributed key-value store) ││
│ └─────────────────────────────────────────┘│
└─────────────────┬────────────────────────────┘
│
┌─────────────────▼────────────────────────────┐
│ Worker Nodes │
│ ┌──────────────────────────────────────────┐│
│ │ Node 1 ││
│ │ ┌──────┐ ┌──────┐ ┌──────┐ ││
│ │ │ Pod │ │ Pod │ │ Pod │ ││
│ │ └──────┘ └──────┘ └──────┘ ││
│ │ ┌────────────────────────────────────┐ ││
│ │ │ kubelet ││ kube-proxy ││ container │ ││
│ │ │ ││ ││ runtime │ ││
│ │ └────────────────────────────────────┘ ││
│ └──────────────────────────────────────────┘│
│ ┌──────────────────────────────────────────┐│
│ │ Node 2 (same structure) ││
│ └──────────────────────────────────────────┘│
└──────────────────────────────────────────────┘
كائنات Kubernetes الأساسية
Pod — أصغر وحدة قابلة للنشر
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp-container
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
النشر - إدارة الكبسولة التعريفية
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: myapp:1.0
ports:
- containerPort: 3000
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 3
periodSeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
الخدمة — وصول مستقر إلى الشبكة
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 3000
protocol: TCP
type: ClusterIP # Internal access only
---
# For external access:
apiVersion: v1
kind: Service
metadata:
name: myapp-loadbalancer
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 3000
type: LoadBalancer
الدخول - توجيه HTTP/HTTPS
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
خريطة التكوين والسر — التكوين
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: production
DB_HOST: postgres-service
LOG_LEVEL: info
---
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
DB_PASSWORD: c3VwZXJzZWNyZXQ= # base64 encoded
نشر التطبيق
# Apply configurations
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
# Check status
kubectl get pods
kubectl get deployments
kubectl get services
kubectl get ingress
# View logs
kubectl logs -f deployment/myapp-deployment
# Scale
kubectl scale deployment/myapp-deployment --replicas=5
# Rollout update
kubectl set image deployment/myapp-deployment myapp=myapp:2.0
kubectl rollout status deployment/myapp-deployment
# Rollback if needed
kubectl rollout undo deployment/myapp-deployment
ميزات Kubernetes المتقدمة
المقياس التلقائي للكبسولة الأفقية (HPA)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp-deployment
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
الكميات المستمرة
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard
---
apiVersion: v1
kind: Pod
metadata:
name: postgres
spec:
containers:
- name: postgres
image: postgres:16-alpine
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgres-storage
volumes:
- name: postgres-storage
persistentVolumeClaim:
claimName: data-claim
مساحات الأسماء
# Create namespaces for environment isolation
kubectl create namespace dev
kubectl create namespace staging
kubectl create namespace production
# Deploy to specific namespace
kubectl apply -f deployment.yaml -n production
# Resource quotas per namespace
kubectl create quota prod-quota --hard=cpu=40,memory=80Gi,pods=50 -n production
Docker مقابل Kubernetes – متى يجب استخدام ماذا؟
| سيناريو | عامل الميناء وحده | أضف كوبيرنيتيس |
|---|---|---|
| التنمية المحلية | ✅ نعم | ❌ المبالغة |
| نشر خادم واحد | ✅ نعم | ❌ المبالغة |
| 2-3 الخدمات المصغرة | ✅ عامل الميناء يؤلف | ❌ المبالغة في العادة |
| مطلوب توافر عالية | ❌ تجاوز الفشل اليدوي | ✅الشفاء التلقائي |
| هناك حاجة إلى القياس التلقائي | ❌ يدوي | ✅ HPA |
| كتلة متعددة العقدة | ❌ محدودة | ✅مدمج |
| التحديثات المتداولة | ❌ يدوي | ✅مدمج |
| عمليات نشر الكناري | ❌مجمع | ✅ الدعم الأصلي |
| متعدد السحابة | ❌غير محمول | ✅ محمولة |
إطار القرار:
- ابدأ بـ Docker — دائمًا. الحاويات هي الأساس.
- استخدم Docker Compose — لعمليات النشر المحلية للمطورين وCI والمضيف الفردي.
- اعتماد Kubernetes عندما: تحتاج إلى HA أو القياس أو العقد المتعددة أو التنسيق المعقد.
- استخدم Kubernetes المُدارة (EKS، وAKS، وGKE) — تجنب الإدارة الذاتية لمستوى التحكم.
أفضل الممارسات
بناء الصورة
- استخدم علامات صور أساسية محددة (
العقدة:20-alpine، وليسالعقدة:الأحدث). - تنفيذ إنشاءات متعددة المراحل لتقليل حجم الصورة.
- مسح الصور بحثًا عن نقاط الضعف:
docker scan myapp:1.0. - صور التوقيع:
علامة cosign --key cosign.key myapp:1.0.
حماية
- قم بتشغيل الحاويات كـ مستخدمين غير جذريين.
- قم بتعيين ** نظام الملفات الجذر للقراءة فقط **:
readOnlyRootFilesystem: true. - استخدم الأسرار للبيانات الحساسة، وليس لمتغيرات البيئة.
- تنفيذ سياسات الشبكة لتقييد حركة المرور بين القرون.
- قم بتمكين RBAC للوصول إلى Kubernetes API.
إدارة الموارد
- قم دائمًا بتعيين طلبات الموارد وحدودها.
- استخدم حصص الموارد لكل مساحة اسم.
- قم بتنفيذ HPA للقياس التلقائي.
- استخدم PodDisruptionBudget لمعرفة مدى التوفر أثناء الصيانة.
الرصد والملاحظة
# Sidecar pattern for logging
spec:
containers:
- name: app
image: myapp:latest
- name: log-collector
image: fluentd:latest
volumeMounts:
- name: logs
mountPath: /var/log/app
خط أنابيب CI/CD
# GitHub Actions — Build + Deploy to Kubernetes
name: CI/CD
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Docker image
run: docker build -t registry.example.com/myapp:${{ github.sha }} .
- name: Push to registry
run: docker push registry.example.com/myapp:${{ github.sha }}
- name: Deploy to Kubernetes
run: |
kubectl set image deployment/myapp-deployment \
myapp=registry.example.com/myapp:${{ github.sha }}
النظام البيئي
| فئة | أدوات |
|---|---|
| ** وقت تشغيل الحاوية ** | عامل ميناء، حاوية، CRI-O |
| التنسيق | كوبيرنيتيس، نوماد، دوكر سوارم |
| ** مدير الحزم ** | هيلم، تخصيص |
| شبكة الخدمة | إستيو، لينكيرد، هدب |
| يراقب | بروميثيوس + جرافانا، داتا دوج |
| ** التسجيل ** | إلك ستاك، جرافانا لوكي، بطلاقة |
| حماية | تريفي، فالكو، أوبا/حارس البوابة، كيفيرنو |
| جيت أوبس | أرجوكد، الجريان |
| ** أدوات المطور ** | سكافولد، تيلت، ديف سبيس |
| تخزين | الرخ/سيف، لونغهورن، بورتووركس |
| بدون خادم على K8s | كناتيف، أوبن فاس، كيدا |
خاتمة
يوفر Docker وKubernetes معًا منصة قوية لبناء التطبيقات الحديثة ونشرها وتوسيع نطاقها:
- ابدأ بـ Docker — تخزين التطبيقات وإتقان ملفات Dockerfiles والإنشاء.
- تعرّف على أساسيات Kubernetes — Pods، وعمليات النشر، والخدمات، وConfigMaps.
- استخدام Kubernetes المُدارة — اسمح لموفري الخدمات السحابية بالتعامل مع مستوى التحكم.
- اعتماد GitOps — ArgoCD أو Flux لعمليات النشر التعريفية التي يتم التحكم فيها بالإصدار.
- الاستثمار في إمكانية الملاحظة — تعد المراقبة والتسجيل والتتبع أمرًا ضروريًا على نطاق واسع.
إن الاستثمار في تعلم النقل بالحاويات والتنسيق يؤتي ثماره في موثوقية النشر والكفاءة التشغيلية وقابلية نقل التطبيقات عبر البيئات.
مقالات مختارة

50 مهارة من Claude تستحق البناء في 2026

ابن مساعد ملاحظات خاص بالذكاء الاصطناعي
حوّل مجلد ملاحظات Markdown إلى مساعد بحث دون كشف المسودات الخاصة.

أتمتة استخراج بيانات الفواتير باستخدام OCR
ابن خط معالجة يقرأ الفواتير ويستخرج الحقول ويعلّم القيم غير المؤكدة للمراجعة.
التعليقات
0 تعليقاتلا توجد تعليقات معتمدة بعد. قد تنتظر الردود الجديدة المراجعة.