تحدثنا سابقاً عن كيفية تشغيل البرامج وال Containers، وكيف يمكن ان تشغل أحد البرامج بدخل ال Containers التي تعمل، وكيف نقوم بتشغيل ال Web Servers، وايضاً كيف نتعامل مع قواعد البيانات Databases، في هذا الموضوع سوف نقوم بكل هذه الخطوات ونشغل أي خدمة بكامل ملحقاتها موقع او ويب سيرفس بالإضافة مع قاعدة البيانات وذلك عن طريق ال Docker Compose. بالإضافة الى التعامل مع الشبكات واضافة أي container لأي شبكة تريدها.
المواضيع في السلسلة:
- مقدمة حول دوكر Docker
- البداية مع دوكر Docker
- مشاركة المجلدات في دوكر Docker
- بناء ال Docker Images
- تشغيل قواعد البيانات في دوكر Database in Docker
- تشغيل البرامج باستخدام ال Docker Compose (الموضوع الحالي)
أهمية ال Docker Compose
عندما تبرمج المواقع العادية او الصغيرة فهي تكون مكونة من قسمين، الموقع نفسه Web Application بالإضافة الى قاعدة البيانات Database، وإذا أردنا تشغيلهم في دوكر فيجب ان نضع كل جزء في Container خاص به، بمعنى Container للموقع، والأخر لقاعدة البيانات، بالطبع يمكن وضعهم بداخل Container واحد ولكن الأفضل تقسميهم بكل الحالات.
لكي نقوم بهذه الخطوات بالأوامر التي قمنا سابقاً، فيجب أولاً تشغيل قاعدة البيانات ونحدد Volume لها حتى يتم تخزين البيانات، ومن ثم معرفة ال IP الخاص بال Container لأنه نحتاجه لكي نضعه في الموقع ويستطيع التخاطب مع قاعدة البيانات، وبعد ذلك تشغيل الموقع وارسال ال IP الخاص بقاعدة البيانات حتى يستطيع التواصل معها، بالإضافة الى Volume Mapping لكي نشارك ملفات الموقع الذي نريد تشغيله (أو وضعها في ال image مباشرة) الصورة التالية توضح تشغيل قاعدة البيانات:
تم تقسيم الأمر من خلال علامة ‘ في ال PowerShell لعدة اسطر للمقروئية فقط، ويمكن كتابة كامل الأمر في سطر واحد بدون الحاجة للعلامات ‘ :
docker run --name database -p 3333:3306 -v db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=P@ssw0rd -d mysql:5.7
بعد تشغيل قاعدة البيانات قمنا بتشغيل الأمر التالي docker inspect database حتى نحصل على ال IP الخاص بذلك ال Container، ومن ثم تمريره للموقع الذي يستقبل البورت وعنوان قاعدة البيانات حتى يستطيع التواصل معها، ويجب أن تبرمج موقعك بحيث يقرأ القيم المرسلة في ال environment variable ويتصل على أساسها، وإذا لم تكن موجودة فيمكن وضع قيم افتراضية حينها.
بعد ذلك سنقوم بتشغيل الموقع، وسوف نقوم بتشغيل موقع WordPress يتصل بهذه القاعدة، وسوف نحتاج ان نمرر عنوان قاعدة البيانات حتى يستطيع الاتصال بها، كما يلي:
الان بهذه الخطوات الثلاثة اشتغل الموقع كما يلي:
ويمكن ان نضع هذه الأوامر في ملف سكربت مثلاً Bach Script وتشغيله مرة واحدة بدلاً من إعادة هذه الخطوات عند تشغيل الموقع على أي سيرفر، ولكن لا نحتاج لذلك لأن دوكر يوفر Docker-Compose لهذه المهمة وهو تشغيل العديد من ال Containers بدلاً من إعادة كتابتها كل مرة، وال Docker-Compose يتعامل مع ملفات بها الأوامر التي سوف يقوم بتشغيلها بصيغة YML.
سوف نقوم الان بحذف الموقع وقاعدة البيانات، وايضاً ستجد في الحذف والايقاف أنك بحاجة لإصدار الأمر لكل منهم على حدة كما في التشغيل:
الصورة التالية تبين إيقاف وحذف البرامج اولاً، ومن ثم حذف قاعدة البيانات:
استخدام ال Docker Compose
بدلاً من القيام بهذه الخطوات الثلاثة لتشغيل الموقع ومعرفة عنوانه الداخلي ومن ثم تشغيل قاعدة البيانات بذلك العنوان، فيمكن أن نستخدم ال Compose File ونضعها في ال yml format وهي نفس البيانات لكن بصيغة Yml، ومن ثم نحفظ الملف docker-compose.yml ونقوم بتشغيل Docker-Compose ونمرر هذا الملف حتى يقوم بتشغيل كل ما فيه.
ويتم تسمية الملف بالاسم docker-compose.yml ، وبعد ذلك يمكن تشغيل الملف بالذهاب لموقع الملف ومن سطر الأوامر يتم تنفيذ الأمر docker-compose up وسيتم التشغيل لهذين ال Containers.
بهذه الطريقة اختصرنا بدل تشغيل ال container الأولى ومن ثم اخذ ال IP لها، وتشغيل الثانية وارسال ال IP للأولى، فنقوم بوضع التعليمات داخل ال docker-compose ولاحظ ان ال container الثانية اخذت اسم ال container الأولى وسيتم عمل resolve لها داخلياً لكي يحصل على ال IP. حيث يتم انشاء شبكة خاصة لهذه البرامج، ويقوم ال DNS Server المدمج بمعرفة ال IP من خلال الاسم، وبالتالي فغالباً عندما تعمل على دوكر وتريد تشغيل أي مشروع مكون من عدة أجزاء فسوف تتعامل مباشرة مع ال docker-compose file ويتم تشغيل هذه البرامج مباشرة.
الشبكة الخاصة التي تم انشائها هي بالاسم data_default وهي تكون باسم المجلد الذي تعمل به، وبعدها يأتي _default. وهذا الاسم سوف يسبق كل من ال volumes وال containers لكي تدل على انها بهذا المشروع.
وميزة الشبكة الخاصة ان كل ال containers بها تستطيع التواصل مع الأخرى من خلال الاسم، ولا تستطيع أي containers أخرى من شبكة أخرى التواصل مع هذه ال containers، الا فقط من تكون بداخل الشبكة.
الأن الموقع أصبح يعمل الان، وسوف نقوم بالتعامل مع هذه الشبكة، وسوف نقوم بطباعة كافة الشبكات المتواجدة:
سوف نقوم بفحص هذه الشبكة من خلال الأمر inspect كما يلي:
وسوف تجد قائمة البرامج بالإضافة الى عنوان كل منهم. وتستطيع في دوكر ان تقوم بانشاء شبكة، إضافة container لهذه الشبكة، أو إزالة container من هذه الشبكة، او مسح الشبكة ككل.
من المهم ملاحظة عندما قمنا بتشغيل البرامج يدوياً فهي انضمت تلقائياً للشبكة bridge، بينما في حالة ال docker compose فهو يقوم بانشاء شبكة خاصة لكل البرامج المتواجدة فيه، وهذا ايضاً من الفروقات المهمة بين التشغيل اليدوي او استخدام ال compose.
سوف نقوم الان بالدخول الى أحد ال containers ولاحظ في الصورة التالية استخدمنا الطريقة التقليدية اولاً، وبعدها قمنا بالخروج والدخول بطريقة أخرى باستخدام docker-compose ولن نعد نحتاج الى استخدام ال –it فهي تلقائية في هذه الحالة:
الان نريد ان نتأكد هناك اتصال بين ال containers وانه يمكن ان تقوم أي منهم بعمل ping للأخرى، وسوف نقوم اولاً بتحميل برنامج ال ping لأنه لا يتواجد في نسخ دوكر:
بعد ذلك سوف نقوم بعمل ال ping ونتصل بال database container:
ونفس الأمر لو قمت بذلك من ال container الأخرى سوف تستطيع التخاطب مع الأولى.
سوف نقوم الأن بتشغيل container جديدة منفصلة ومن ثم نربطها مع هذه الشبكة التي تمت انشاءها مع المشروع، كما يلي:
وهكذا كل من ال containers أصبحت بداخل الشبكة (بالرغم من أن الأخيرة لم تكن ضمن بال compose file).
سوف نقوم الان بعرض كافة ال containers باستخدام docker ps ومن ثم عرض ال containers التي تعمل في هذه ال compose كما يلي:
ويمكن ان نقوم بتشغيل أي من ال container بداخل ال compose او ايقافها باستخدام docker-compose stop name أو docker-compose start name وتحدد ال container الذي تريده إيقافه او تشغيله.
سنقوم الان بإيقاف كل ال containers وذلك من خلال docker-compose stop بدون تحديد أي من الأسماء، كما يلي:
ويمكن تشغيلها مجدداً بالأمر start.
سنقوم الان بحذف هذه ال containers مع ال volumes التي لم تسمى (لم يتم تحديد أي اسم لها) بها كما يلي:
ويمكن ان نقوم بعمل down وسوف يتم حذف الشبكة كما يلي:
الان يمكنك حذف ال volume يدوياً ان اردت، وإذا اردت أن تقوم باسترجاع كل شيء مع بياناتك، فسوف تقوم بعمل Up:
لاحظ لم نقم بتشغيله بالوضع –d ولذلك ظهرت المخرجات.
إذا اردت ان تقوم بحذف ال named volumes فيمكنك استخدام docker-compose down –v وسوف يقوم بإيقاف كل شيء وحذف كل ال volumes المرتبطة بها.
خلاصة
ال Dockerfile يستخدم لتسهيل Automation لبناء ال Images بدلاً من تشغيل Container ومن ثم نسخ الملفات ومن ثم commit، وال Docker-Compose هو تسهيل Automation لإنشاء ال Containers بدلاً من ادخال الأوامر واحداً تلو الأخر.