دفتر ملاحظات Docker Compose - الأوامر الأكثر فائدة مع أمثلة

بالمناسبة، docker-compose مختلف عن docker compose...

Page content

هناك قائمة مصطلحات Docker Compose مع أمثلة مُصنَّفة لمساعدتك على إتقان ملفات Compose وال الأوامر بسرعة.

مخطط docker-compose

مرجع ملف Compose: docker-compose.yml

الهيكل الأساسي:

version: '3'       # إصدار تنسيق ملف Compose

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"   # منفذ المضيف 8080: منفذ الحاوية 80
  db:
    image: postgres
    environment:            # المتغيرات البيئية
      POSTGRES_PASSWORD: example
    volumes:
      - db_data:/var/lib/postgresql/data

networks:          # شبكة مخصصة
  appnet:
    driver: bridge

volumes:           # حجم مسمى
  db_data:
  • services: كل حاوية في تطبيقك متعدد الحاويات. في المثال أعلاه لدينا خدمتان: web و db.
  • networks & volumes: تعريف الشبكات المعزولة والتخزين المستمر - لدينا هنا شبكة appnet وحجم db_data.

أمثلة

خدمة واحدة مع خريطة المنفذ

services:
  app:
    build: .
    ports:
      - "8000:80"   # منفذ المضيف 8000: منفذ الحاوية 80

يعرض التطبيق على منفذ المضيف 8000 ويقوم ببناءه من ملف Dockerfile في الدليل الحالي.

خدمة متعددة مع حجم مشترك وشبكة مخصصة

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - type: bind
        source: ./app
        target: /app
    networks:
      - mynet
  db:
    image: postgres
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - mynet

networks:
  mynet:

volumes:
  db_data:

الويب والقاعدة على نفس الشبكة؛ القاعدة تستخدم حجمًا مستمرًا مسمى - db_data.

استخدام سياق البناء ومسار ملف Dockerfile

يمكنك بناء صورة Docker حسب الحاجة من المحدد في ملف docker-compose.yml Dockerfile.

services:
  app:
    build:
      context: .
      dockerfile: docker/MyDockerfile

مشاركة البيانات بين الخدمات

services:
  web:
    image: nginx
    volumes:
      - shared_data:/usr/share/nginx/html
  worker:
    image: myworker
    volumes:
      - shared_data:/usr/src/app/data

volumes:
  shared_data:

تتشارك الخدمتان نفس الحجم (لملفات ثابتة أو تبادل البيانات) - shared_data.

خيارات متقدمة لملف Compose

  • environment: تعيين متغيرات بيئة للحاويات.
  • depends_on: تحكم في ترتيب بدء الخدمة.
  • deploy.replicas: توسع الخدمة في وضع Swarm.

مثال:

services:
  web:
    image: nginx
    deploy:
      replicas: 3
    depends_on:
      - db

يبدأ 3 مثيلات من الويب؛ فقط يتحكم في ترتيب بدء التشغيل (ليس جاهزية).

الأوامر الأساسية لـ Docker Compose

الأوامر الوصف استخدام المثال
docker-compose up إنشاء وتشغيل الحاويات docker-compose up
docker-compose up -d تشغيل في الخلفية docker-compose up -d
docker-compose exec تنفيذ أمر في حاوية تعمل docker-compose exec web bash
docker-compose build بناء/إعادة بناء الصور docker-compose build
docker-compose down توقف وإزالة الحاويات، الشبكات، الأحجام، والصور docker-compose down
docker-compose logs -f عرض واتبع السجلات docker-compose logs -f
docker-compose ps قائمة الحاويات التي تعمل docker-compose ps
docker-compose run تشغيل أوامر مؤقتة (تتجاهل الأوامر في ملف Compose) docker-compose run web python manage.py migrate
docker-compose stop توقف الحاويات التي تعمل (يمكن إعادة تشغيلها باستخدام start) docker-compose stop
docker-compose restart إعادة تشغيل الخدمات docker-compose restart web
docker-compose pull سحب صور الخدمة docker-compose pull
docker-compose rm إزالة الحاويات المتوقفة للخدمة docker-compose rm web
docker-compose config التحقق من ملف Compose وعرضه docker-compose config
docker-compose up --scale web=3 بدء عدة مثيلات من خدمة docker-compose up --scale web=3

الأنماط الشائعة في Compose

  • قواعد البيانات مع بيانات مستمرة

    services:
      mysql:
        image: mysql
        environment:
          MYSQL_ROOT_PASSWORD: password
        volumes:
          - mysql_data:/var/lib/mysql
    
    volumes:
      mysql_data:
    

    تستمر بيانات القاعدة في الحجم mysql_data عبر إعادة تشغيل الحاويات.

  • ربط رمزي للكود أثناء التطوير

    services:
      app:
        build: .
        volumes:
          - .:/app
    

    تحرير الكود مباشرة على المضيف، يتم تعكسه تلقائيًا في الحاوية.

الأعلام المفيدة

  • -d: وضع التفريغ (تشغيل في الخلفية).
  • --build: إجبار إعادة بناء الصور قبل البدء.
  • --force-recreate: إعادة إنشاء الحاويات حتى لو لم تحدث.
  • --remove-orphans: إزالة الحاويات غير المحددة في ملف Compose.

تعريف وتحديد الخدمات

يمكنك تعريف وتحديد الخدمات، الشبكات، والأحجام في Docker Compose باستخدام ملف docker-compose.yml، الذي يركز على جميع متطلبات تكوين وتنظيم التطبيق.

  • الخدمات تُعرف تحت مفتاح services.
  • كل خدمة تمثل تكوين حاوية، حيث يمكنك تحديد:
    • الصورة: اختر صورة من Docker Hub أو سجل آخر.
    • المنافذ: خريطة منافذ الحاوية إلى منافذ المضيف.
    • المتغيرات البيئية: إرسال قيم التكوين.
    • الأحجام: استمرار البيانات أو مشاركة الملفات/المجلدات مع المضيف أو الخدمات الأخرى.
    • الشبكات: تحديد الشبكات التي يمكن للخدمة الوصول إليها.

مثال:

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"   # منفذ المضيف 8080: منفذ الحاوية 80
    environment:
      - NGINX_HOST=localhost
    volumes:
      - web_data:/usr/share/nginx/html
    networks:
      - frontend

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: secret
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - backend
  • هنا، الخدمة web تستخدم صورة nginx، تحدد متغير بيئة، ترفق حجمًا، تفتح منفذ 80 كـ 8080 على المضيف، وتتصل بشبكة frontend. الخدمة db تفعل شيئًا مشابهًا لـ PostgreSQL.

تحديد الشبكات المخصصة

  • الشبكات تحكم في أي الخدمات يمكن التواصل بينها. ينشئ Compose شبكة افتراضية، لكن يمكنك تعريف أكثر، تحديد مسارات مخصصة، تعيين خيارات، وتحديد أي خدمة تلتحق بشبكة معينة لعزل دقيق.
  • عرّف الشبكات في المستوى الأعلى تحت networks، وحدد أي شبكات يجب أن تلتحق بها الخدمة باستخدام مفتاح networks في مستوى الخدمة.

مثال:

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
  • ربط الشبكات بالخدمات:
services:
  app:
    networks:
      - frontend
      - backend
  db:
    networks:
      - backend
  • هذا الإعداد يسمح للخدمة app بالوصول إلى المستخدمين على الشبكتين frontend و backend، بينما db فقط متوفرة داخل backend.

تحديد الأحجام المخصصة

  • الأحجام تُعرف تحت مفتاح volumes في المستوى الأعلى. ربطها بالحاويات باستخدام مفتاح volumes تحت خدمة.
  • يمكن أن تكون الأحجام مسمى، تستخدم مسارات مخصصة، وتُشارك عبر عدة خدمات لاستمرار البيانات والمشاركة.

مثال:

volumes:
  web_data:                # حجم مسمى لملفات الويب
  db_data:                 # حجم مسمى للقاعدة

services:
  web:
    volumes:
      - web_data:/usr/share/nginx/html

  db:
    volumes:
      - db_data:/var/lib/postgresql/data
  • في هذا المثال، web_data مستمرة ومتوفرة لأي حاوية تلتقنها. db_data تضمن أن بيانات القاعدة لا تُفقد عند إعادة إنشاء الحاوية.
  • يمكنك تعريف ربط رمزي مع خيارات مسارات مخصصة لحالات متقدمة:
volumes:
  db_data:
    driver: local
    driver_opts:
      type: none
      device: /data/db_data
      o: bind
  • هذا التكوين ينشئ ربطًا رمزيًا من مسار المضيف /data/db_data داخل الحاوية.

ملخص أفضل الممارسات:

  • استخدم اسم الخدمة كاسم مضيف DNS للاتصال بين الخدمات.
  • ربط الخدمات إلى عدة شبكات حسب الحاجة لتحكم الوصول.
  • استخدم أحجام مسمى للاستمرارية والمشاركة البيانات.
  • عرّف كل شيء باستخدام YAML، مما يتيح التحكم في الإصدار وسهولة النشر.

ملفات Compose متعددة

لـ تنظيم تكوينات متعددة الخدمات المعقدة في Docker Compose، يمكنك استخدام ملفات Compose متعددة وملفات استبدال، مما يسمح بتكوينات قابلة للتوسع ومخصصة للبيئة. إليك كيف تعمل هذه الميزة:

  1. هيكل الملف الأساسي والاستبدال
  • أنشئ ملفًا أساسيًا (compose.yaml أو docker-compose.yml) يحتوي على جميع التعريفات الافتراضية المشتركة للخدمة.
  • أضف ملفات استبدال مخصصة للبيئة (مثل docker-compose.override.yml، docker-compose.dev.yml، docker-compose.prod.yml).

مثال لهيكل الملف:

/project-directory
|-- docker-compose.yml           # التكوين الأساسي
|-- docker-compose.override.yml  # الاستبدال المحلي/التطوير (يتم تطبيقه تلقائيًا)
|-- docker-compose.prod.yml      # الاستبدال للإنتاج
|-- docker-compose.test.yml      # الاستبدال للاختبار (إذا لزم الأمر)

يحدد الملف الأساسي الخدمات الأساسية، بينما كل ملف استبدال يخصص الإعدادات لبيئة معينة.

  1. كيفية دمج الملفات
  • دمج: عند تشغيل docker compose up، يدمج Docker Compose الملف الأساسي مع أي ملفات استبدال حسب الترتيب؛ الملفات لاحقة تتجاوز، تمتد، أو تضيف إلى الإعدادات في الملفات السابقة.
  • استبدال الحقول: إذا تم تعريف خدمة أو حقل في عدة ملفات، يتم استخدام قيمة الملف الأخير المحدد. الحقول الجديدة تُضاف.

مثال لدمج:

  • docker-compose.yml:
    services:
      web:
        image: myapp
        ports:
          - "8000:80"
    
  • docker-compose.override.yml:
    services:
      web:
        environment:
          - DEBUG=true
    
  • النتيجة: الخدمة web تستخدم الصورة والمنفذ من الملف الأساسي بالإضافة إلى متغير البيئة المُستبدل DEBUG.
  1. استخدام الأوامر مع عدة ملفات
  • السلوك الافتراضي: إذا كان موجودًا، يقوم Docker Compose تلقائيًا بتحميل docker-compose.override.yml مع docker-compose.yml عند تشغيل أي أمر.
  • تحديد الملفات يدويًا: استخدم أعلام -f لتحديد أي ملفات يتم دمجها وبنفس الترتيب:
    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
    
    • هذا يتجاهل الاستبدال الافتراضي ويستخدم الإعدادات الخاصة بالإنتاج.
  1. استراتيجيات تنظيم عملية
  • فصل البيئات: استخدم ملف استبدال لكل بيئة: تطوير، اختبار، إنتاج، إلخ.
  • الخدمات والفرق: قسم التكوين إلى ملفات منفصلة لخدمات مختلفة أو فرق، ودمجها حسب الحاجة.
  • التبديلات الميزة: يمكن أن تضيف ملفات إضافية خدمات أو إعدادات مخصصة للاحتياجات المؤقتة (مثل compose.debug.yml للتسجيل الإضافي).
  1. الفوائد
  • الوضوح: يحتفظ الملفات الفردية بحجم صغير ومتركز.
  • التوسع: إضافة خدمات جديدة أو بيئات أو إعدادات بسهولة.
  • الصيانة: تغيير أو مراجعة الأقسام ذات الصلة فقط لنشر معين.
  1. مثال: تبديل البيئات

التطوير:

docker compose -f docker-compose.yml -f docker-compose.dev.yml up

الإنتاج:

docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

تتلقى كل بيئة فقط الإعدادات الضرورية لها، مع وجود جميع التكوين المشترك في الملف الأساسي.

تنظيم تكوينات Compose المعقدة مع عدة ملفات - واستغلال نظام الاستبدال والدمج - يضمن المرونة، التخصيص حسب البيئة، والتوسع السهل لتطبيقات Docker متعددة الخدمات الكبيرة.

روابط مفيدة