استخدام Docker Compose لإنشاء عدة حاويات

عمار الخوالدةمنذ 5 سنوات

مقدمة

من أهم الفوائد التي تقدمها الحاويات هو إمكانية إعدادها بسهولة، فمتى ما اردت يمكنك إعداد حاوية تحاكي أي بيئة بسرعة، لذلك فإن من الممارسات الجديدة هو جعل الحاوية الواحدة تعمل عملا واحدا فقط، فلتطوير موقع PHP مثلا فإن من الافضل عمل حاوية لسيرفر الويب فقط، وحاوية لقواعد البيانات، وحاوية لـ PHP، وأعظم فائدة في هذه الطريقة هو إمكانية تركيب أو ازالة أي عنصر ( حاوية ) من هذا التصميم بسهولة دون الحاجة لاستغراق وقت طويل في إعداد الحزم ومتغيرات البيئة وغيرها، فلو احتجت في مشروعك إلى استخدام Redis على سبيل المثال، فإن كل ما عليك فعله هو جلب صورة لـ Redis وربطها بباقي الحاويات، ولو احتجت لتغيير قاعدة البيانات مثلا من Mysql إلى MongoDB فان عليك استبدال حاوية لـ MongoDB بحاوية Mysql.

هذه العمليات كلها قد تكون صعبة لو كنت تعمل على حاوية واحدة، ففي كل مرة عليك أن تعدل كثيرا من الإعدادات في Dockerfile الذي قد يكون كبيرا جدا بسبب استخدام الكثير من الادوات فيه، والوقت من ذهب بالنسبة للمطور، فلن تحب بالطبع أن تتأخر في تسليم مشروع ما أو أن تتأخر في اطلاقه، بل من الأفضل انهاء المشروع في وقت اقل من الوقت المحدد، ولهذا فإن على المبرمج استخدام الأدوات التي تسهل وتسرع له عملية التطوير.

وبناء على ما سبق، فأداة Docker Compose هي أداة رائعة لربط الحاويات بعضها ببعض، فباستخدام ملف واحد ستستطيع ربط الحاويات ببعض بسهولة، ( طريقة تنصيب الأداة ) في هذا الدرس سنشرح بعض أوامر Docker Compose، وفي الدرس القادم سنطبق عليه مثالا واقعيا.

 

كيف أبدأ

كما في إنشاء الصورة، فإن Docker Compose يعتمد على ملف يحتوي على التعليمات التي تلزمه لمعرفة ما عليه فعله، تعليمات Compose تُكتب بلغة YAML بداخل ملف بصيغة yaml او yml، فأول خطوة لاستخدام Docker Compose هو انشاء ملف باسم docker-compose.yml.

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

version: "3"

ستتمكن باستخدام Docker Compose من توزيع كل جزء يعتمد عليه تطبيقك على عدة حاويات، فتستطيع تشغيل NodeJs على حاوية، و Nginx على حاوية أخرى، وحاوية ثالثة للتعامل مع ملفات مشروعك، فكل جزء من هذه الأجزاء يسمى خدمة Service، قم بفتح Code block جديدة بداخل services لتعريف كل خدمة لديك:

version: "3"
services:
  mysystem:
    image: ubuntu:16.04

  anotherone:
    build: ./myimage

 

في هذا المثال لدينا خدمتان، الأولى باسم mysystem وتقوم بسحب صورة ubuntu من Docker Hub، والثانية هي anotherone وبدلا من جلب الصورة من Docker Hub تقوم ببناء ملف Dockerfile الموجود داخل مجلد myimage.

 

وهذا يسهل بالطبع عملية تشغيل هذه الحاويات، ففي المشاريع الكبيرة عند تقسيم متطلبات المشروع إلى خدمات، ستحتاج إلى تشغيل عدد كبير من الحاويات، و Docker Compose ستسهل عليك تشغيلها أو ايقافها كلها دفعة واحدة باستخدام أمر واحد.

 

تعرفنا على أمر image و build لكن بالطبع يوجد العديد من الأوامر الأخرى المتعلقة بالخدمات، كالأمر ports الذي يساعدك على تحديد المنافذ وتوجيهها ( في ملفات Dockerfile يُستخدم الأمر EXPOSE أو استخدام -p بعد أمر docker لتحديد البورتات، لكن التعامل مع المنافذ في ملف docker-compose أسهل )

version: "3"
services:
  mysystem:
    image: ubuntu:16.04

  anotherone:
    build: ./myimage
    ports:
      - 8000:80
      - 9000:9000

 

كما تلاحظ فإننا نحدد البورت الذي تعمل عليه خدمة معينة في الحاوية ( البورت 80 مثلا ) ونوجهه إلى بورت معين على الجهاز المستضيف ( البورت 8000 في المثال )، فلو كان لديك خدمة مثل خادم Apache مثلا يعمل على البورت 80، فإنك على جهازك ستصل إلى الخدمة باستخدام البورت 8000، عن طريق كتابة localhost:8000 في المتصفح مثلا.

 

بإمكانك استخدام الأمر environment لتحديد متغيرات البيئة، لكن ما الفائدة من استخدامه طالما أن بإمكاننا استخدام الأمر ENV في Dockerfile؟

أحيانا قد لا تحتاج لإنشاء صورة، فقد تجد صورة تناسب مشروعك تماما، فبدلا من انشاء Dockerfile فقط لوضع متغيرات البيئة، نقوم باستخدام environment في docker-compose بما أننا في كل الأحوال سنقوم باستخدامه.

version: "3"
services:
  mysystem:
    image: ubuntu:16.04
    environment:
      MY_VARIABLE: 1342

  anotherone:
    build: ./myimage
    ports:
      - 8000:80
      - 9000:9000

 

للربط بين الحاويات فإن Docker Compose يقوم تلقائيا بإنشاء شبكة (Network) بين الحاويات ليصبح بالإمكان الاتصال بينها، يمكنك بالطبع انشاء شبكات خاصة بك لكننا لن نتطرق إلى هذا الموضوع في هذه السلسلة البسيطة.

 

ولضمان نجاح الاتصال بين الحاويات، يُستخدم الأمر depends_on حيث تقوم بتحديد الخدمات ( الحاويات ) التي تعتمد عليها الخدمة التي استخدمت لها الأمر depends_on وما يفعله Docker Compose هو ترتيب تشغيل الحاويات، بحيث لا يتم تشغيل حاوية تعتمد على حاوية لم يتم انشاؤها بعد.

version: "3"
services:
  mysystem:
    image: ubuntu:16.04
    environment:
      MY_VARIABLE: 1342
    depends_on:
        - anotherone
        - third_one

  anotherone:
    build: ./myimage
    ports:
      - 8000:80
      - 9000:9000

  third_one:
    image: example

لاحظ استخدام depends_on على الحاوية الأولى (mysystem)، هكذا سيضمن لك Docker Compose أن الحاوية mysystem سيتم تشغيلها قبل anotherone و third_one، بحيث يصبح ترتيب تشغيل الحاويات كالآتي:

mysystem -> anotherone -> third_one

أو

mysystem -> third_one -> anotherone

 

من الأوامر المفيدة أيضا الأمر container_name، وباستخدامه بامكانك تحديد اسم الحاوية، وهو يقوم بعمل الخيار name-- في الأمر docker run، فاسم الخدمة ( مثل mysystem أو anotherone ) لا يمثل اسم الحاوية، إنما هو اسم يستخدم للتعامل مع الخدمة ضمن ملف docker-compose وفي الغالب سيكون اسم الحاوية مشابها له مع رقم تسلسلي، أما لتحديد اسم معين للحاوية فستكون بحاجة للأمر container_name.

version: "3"
services:
  mysystem:
    image: ubuntu:16.04
    container_name: 3alampro

 

وأخيرا سنتطرق إلى ميزة مهمة جدا، ألا وهي الـ Volumes، وقد شرحناها مسبقا وإنما نعطي مثالا على طريقة استخدامها في ملف Docker Compose:

version: "3"
services:
  mysystem:
    image: ubuntu:16.04
  volumes:
   - ./myfolder:/var/www

 

لتشغيل الخدمات التي عرفتها في ملف docker-compose، ففي المجلد الذي يحتوي على الملف قم بتنفيذ الأمر:

docker-compose up


يمكنك استخدام d- كـ flag للأمر السابق لتشغيل الخدمات في الخلفية.

لايقاف الخدمات:

docker-compose stop

 

أما لإيقاف (وحذف) جميع الخدمات ( الحاويات ) والشبكات (Networks) والـ Volumes التي تم انشاؤها بالأمر up، نستخدم الأمر التالي:

docker-compose up

 

أحيانا تستخدم ملف Dockerfile وتحتاج لإعادة بنائه بعد تعديله، فعندها تستخدم أحد الأمرين التاليين:

docker-compose build
docker-compose up --build

 

الأمر الأول يقوم بإعادة بناء الصور، أما الثاني يقوم بإعادة بنائها ثم تشغيلها.

 

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

المحاضر

عمار الخوالدة

الكلمات الدليلية

عن الدرس

4 إعجاب
1 متابع
0 مشاركة
3459 مشاهدات
منذ 5 سنوات

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !