مقال

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

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

لقد أحدثت الحاويات ثورة في كيفية بناء البرامج وشحنها وتشغيلها. من خلال تجميع التطبيقات مع تبعياتها في وحدات محمولة وخفيفة الوزن، تحل الحاويات مشكلة "أنها تعمل على جهازي" وتتيح النشر المتسق عبر بيئات التطوير والاختبار والإنتاج.

3 دقيقة قراءةاللغة: AR العربيةمجاني0 تصفيقات0 تعليقات
التقنيةمقالات هندسيةDevOpsDockerKubernetesTechnologyEngineering ArticlesContainerization
خيارات القراءة

مقدمة

لقد أحدثت الحاويات ثورة في كيفية بناء البرامج وشحنها وتشغيلها. من خلال تجميع التطبيقات مع تبعياتها في وحدات محمولة وخفيفة الوزن، تحل الحاويات مشكلة "أنها تعمل على جهازي" وتتيح النشر المتسق عبر بيئات التطوير والاختبار والإنتاج.

جعل 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
كتلة متعددة العقدة ❌ محدودة ✅مدمج
التحديثات المتداولة ❌ يدوي ✅مدمج
عمليات نشر الكناري ❌مجمع ✅ الدعم الأصلي
متعدد السحابة ❌غير محمول ✅ محمولة

إطار القرار:

  1. ابدأ بـ Docker — دائمًا. الحاويات هي الأساس.
  2. استخدم Docker Compose — لعمليات النشر المحلية للمطورين وCI والمضيف الفردي.
  3. اعتماد Kubernetes عندما: تحتاج إلى HA أو القياس أو العقد المتعددة أو التنسيق المعقد.
  4. استخدم 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 معًا منصة قوية لبناء التطبيقات الحديثة ونشرها وتوسيع نطاقها:

  1. ابدأ بـ Docker — تخزين التطبيقات وإتقان ملفات Dockerfiles والإنشاء.
  2. تعرّف على أساسيات Kubernetes — Pods، وعمليات النشر، والخدمات، وConfigMaps.
  3. استخدام Kubernetes المُدارة — اسمح لموفري الخدمات السحابية بالتعامل مع مستوى التحكم.
  4. اعتماد GitOps — ArgoCD أو Flux لعمليات النشر التعريفية التي يتم التحكم فيها بالإصدار.
  5. الاستثمار في إمكانية الملاحظة — تعد المراقبة والتسجيل والتتبع أمرًا ضروريًا على نطاق واسع.

إن الاستثمار في تعلم النقل بالحاويات والتنسيق يؤتي ثماره في موثوقية النشر والكفاءة التشغيلية وقابلية نقل التطبيقات عبر البيئات.

مقالات مختارة

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

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

التقنيةAIAi GuidesAI Agents
0 تصفيقات
قراءة
ابن مساعد ملاحظات خاص بالذكاء الاصطناعي
مميزAR
9 دمجاني

ابن مساعد ملاحظات خاص بالذكاء الاصطناعي

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

التقنيةأدلة المنصةالكتابة بالذكاء الاصطناعيAIAutomationData
0 تصفيقات
قراءة
أتمتة استخراج بيانات الفواتير باستخدام OCR
تحريريAR
8 دمجاني

أتمتة استخراج بيانات الفواتير باستخدام OCR

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

التقنيةمقالات هندسيةالكتابة بالذكاء الاصطناعيAIAutomationData
0 تصفيقات
قراءة

التعليقات

0 تعليقات

لا توجد تعليقات معتمدة بعد. قد تنتظر الردود الجديدة المراجعة.