الرئيسية قاعدة المعرفة الشبكات والاتصالات Docker Compose: تشغيل نظام صناعي متكامل بأمر واحد
الشبكات والاتصالات

Docker Compose: تشغيل نظام صناعي متكامل بأمر واحد

لماذا Docker Compose؟

تشغيل حاوية واحدة أمر بسيط. لكن التطبيقات الصناعية نادراً ما تعمل وحدها. نظام مراقبة SCADA نموذجي يحتاج خادم تطبيقات وقاعدة بيانات ولوحة عرض — ثلاث حاويات منفصلة يجب أن تتواصل وتتشارك البيانات وتبدأ بالترتيب الصحيح.

Docker Compose يُعرّف جميع الخدمات في ملف YAML واحد. أمر واحد يبدأ كل شيء، يربط الشبكات، ويُركّب الأحجام. وأمر واحد يُوقف كل شيء.

لنشر التطبيقات في المصانع، هذا يعني إعادة إنتاج البيئة على خادم اختبار قبل الإنتاج، تجهيز المهندسين الجدد بأمر docker compose up واحد، والتحكم بإصدارات بنيتك التحتية إلى جانب كود التطبيق.

ملف docker-compose.yml: الهيكل الأساسي

كل ملف Compose يتبع نفس الهيكل:

services:
  app:
    image: factory-monitor:v1
    ports:
      - "8080:8080"
  database:
    image: surrealdb/surrealdb:latest
    ports:
      - "8000:8000"
  dashboard:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"

الأوامر الأساسية

docker compose up -d          # بدء جميع الخدمات في الخلفية
docker compose logs -f        # عرض السجلات من جميع الخدمات
docker compose down           # إيقاف وحذف كل شيء
docker compose up -d --build  # إعادة البناء بعد تغيير الكود

الخدمات: تطبيق + قاعدة بيانات + لوحة مراقبة

إليك ملف Compose كامل لحزمة مراقبة صناعية:

services:
  factory-app:
    build: .
    ports:
      - "8080:8080"
    environment:
      - DATABASE_URL=ws://surrealdb:8000
      - RUST_LOG=info
    depends_on:
      surrealdb:
        condition: service_healthy
    restart: unless-stopped

  surrealdb:
    image: surrealdb/surrealdb:v2.1.4
    command: start --user root --pass factory123 surrealkv://data/factory.db
    ports:
      - "8000:8000"
    volumes:
      - surreal-data:/data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 10s
      timeout: 5s
      retries: 3
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=monitor2025
    restart: unless-stopped

volumes:
  surreal-data:
  grafana-data:

خيار depends_on مع condition: service_healthy يضمن انتظار التطبيق حتى تصبح قاعدة البيانات جاهزة.

الشبكات: عزل الخدمات وربطها

افتراضياً، ينشئ Compose شبكة واحدة لجميع الخدمات. لأمان أفضل، اعزل المجموعات:

services:
  factory-app:
    networks: [frontend, backend]
  surrealdb:
    networks: [backend]
  grafana:
    networks: [frontend]

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true

مع internal: true، قاعدة البيانات غير قابلة للوصول من الخارج. فقط التطبيق، الذي ينتمي للشبكتين، يمكنه التواصل مع قاعدة البيانات.

الأحجام: حفظ البيانات بين إعادات التشغيل

بدون الأحجام، جميع البيانات داخل الحاوية تُفقد عند توقفها. استخدم ربط المجلدات لملفات الإعدادات مع :ro للقراءة فقط:

services:
  grafana:
    volumes:
      - grafana-data:/var/lib/grafana
      - ./grafana/dashboards:/etc/grafana/provisioning/dashboards:ro

إدارة الأحجام

docker volume ls                                    # عرض جميع الأحجام
docker volume inspect factory-monitor_surreal-data  # فحص حجم محدد
docker volume prune                                 # حذف الأحجام غير المستخدمة

المتغيرات البيئية وملف .env

كتابة كلمات المرور مباشرة في docker-compose.yml مخاطرة أمنية. استخدم ملف .env:

SURREAL_USER=root
SURREAL_PASS=secure_factory_password_2025
SURREAL_PORT=8000
APP_PORT=8080
RUST_LOG=info
GF_ADMIN_PASS=dashboard_secure_2025

الإشارة إليها في docker-compose.yml

services:
  surrealdb:
    command: start --user ${SURREAL_USER} --pass ${SURREAL_PASS} surrealkv://data/factory.db
    ports:
      - "${SURREAL_PORT}:8000"
  factory-app:
    environment:
      - DATABASE_URL=ws://surrealdb:${SURREAL_PORT}
      - RUST_LOG=${RUST_LOG}
    ports:
      - "${APP_PORT}:8080"

أضف .env إلى .gitignore ووزّع ملف .env.example بقيم وهمية ليعرف أعضاء الفريق أي المتغيرات يجب ضبطها.

الخلاصة

Docker Compose يحوّل نشر الحاويات المتعددة من سلسلة أوامر يدوية إلى ملف تصريحي واحد. الخدمات تحدد ما يعمل، الشبكات تتحكم بحدود الاتصال، الأحجام تحفظ البيانات الحرجة، والمتغيرات البيئية تُبقي الأسرار خارج نظام التحكم بالإصدارات. في الدرس القادم، ستتعلم أساسيات إدارة أنظمة Linux اللازمة لإدارة الخوادم التي تعمل عليها هذه الحاويات.

docker-compose multi-container volumes networks services YAML دوكر كومبوز عدة حاويات الأحجام الشبكات الخدمات التنسيق