‫في هذا القسم ، غطينا الكثير عن Swarm. Swarm و Stacks و Secrets هي نوع من ثلاثية من الميزات الرائعة
‫التي يمكن أن تجعل الأمور أسهل بكثير في الإنتاج بالنسبة لنا.
‫أريد أن أوضح لك كيف سيكون الأمر إذا أخذت ملفات Compose الخاصة بك بالفعل ، ونظمتها
‫بطريقتين ، وهذا ما أطلق
‫عليه أساسًا العيش في الحلم.
‫اتضح أنه يمكنك بالفعل استخدام ملف واحد للقيام بالعديد من الأشياء ، ولكن في بعض الأحيان
‫يزداد تعقيدك وستحتاج إلى ملفات Compose متعددة.
‫أريد أن أجري بسرعة حقيقية.
‫ليس عليك فعل ذلك بنفسك إذا كنت لا تريد ذلك. سأقوم فقط بعرض مثال لكيفية
‫عمل ملفات التأليف هذه معًا لبناء بيئتك كما تذهب.
‫في هذا السيناريو ، سنستخدم Docker Compose لبيئتنا التنموية المحلية.
‫سنستخدم عامل إرساء تكوين وملف لبيئة CI الخاصة بنا لإجراء اختبار التكامل.
‫ثم عندما نكون في مرحلة الإنتاج ، سنستخدم هذه الملفات لنشر مكدس عامل الإرساء
‫لنشر بيئة الإنتاج فعليًا باستخدام مكدس. لذا ، أنا على جهازي المحلي وسنستخدم المثال السابق
‫لسيناريو دروبال ، مع خادم قاعدة بيانات وواجهة ويب أمامية.
‫لدينا ملف Dockerfile الذي استخدمناه في مهامنا السابقة. نحن نعيد بناء تكوين دروبال مخصص ، ولكنه
‫بسيط ، باستخدام نموذج.
‫ثم سيكون لدينا ملف الإنشاء الافتراضي هذا.
‫هذا يسمى تجاوز
‫، ما نحن على وشك القيام به. التجاوز هو المكان الذي أمتلك فيه ملف Docker Compose القياسي
‫، ويقوم بتعيين الإعدادات الافتراضية نفسها في جميع بيئاتي.
‫بعد ذلك ، لدي ملف التجاوز الذي يكون افتراضيًا ، Docker Compose ، إذا تم تسميته بهذا الاسم الدقيق ،
‫فسيكون عامل الإرساء يؤلف. تجاوز. yml ، فسيتم إحضار هذا تلقائيًا عندما أقوم بتكوين عامل الشحن.
‫سترى أنه في هذا السيناريو ، نفترض تطويرًا محليًا لأننا نريد حقًا أن تكون الأوامر المكتوبة
‫يدويًا التي سنكتبها أسهل محليًا.
‫عادةً في بيئة CI الخاصة بك ، يكون كل شيء آليًا لذلك لا نهتم حقًا إذا كانت هذه الأوامر
‫أطول قليلاً.
‫لكننا نريد حقًا أن يكون عامل الإرساء سهل التركيب محليًا.
‫الشيء الرائع هو أن Docker Compose سيقرأ هذا الملف تلقائيًا
‫وسيقوم بتطبيق هذا فوق أو تجاوز أي إعدادات في ملف Docker Compose yml.
‫وهنا ، لاحظ أنه ليس
‫لدي اسم الصورة ، لأنه تم تحديده هنا بالفعل. في ملف التجاوز هذا ، ألغيت بالقول
‫إنني أريد إنشاء الصورة محليًا باستخدام Dockerfile في هذا الدليل الحالي.
‫اريد انشاء منفذ 8080 للتنمية المحلية. وأنا أقوم بإعداد بعض وحدات التخزين ، وستلاحظ حتى أنني أعطيتك
‫مثالًا هنا على ربط ربط ، حيث قد أقوم بعمل سمة مخصصة. وأريد تثبيت موضوعي على مضيفي في الحاوية
‫كما فعلنا في الأقسام السابقة ، حتى أتمكن من تغييره محليًا ثم رؤيته على
‫الفور على الخادم.
‫وبالمناسبة ، في هذا المثال ، لا أعرف في الواقع كيفية تطوير السمات في دروبال.
‫لست متأكدًا تمامًا من أنني إذا قمت بتغيير ملف هناك ، فسوف ينعكس تلقائيًا.
‫أردت فقط عرض مثال على كيفية قيامك بالتطوير على الويب ، وعادةً ما تكون هذه هي الطريقة التي ستفعل
‫بها ذلك دون الحاجة إلى التوقف وبدء الإنشاء في كل مرة. في الأسفل هنا ، تحت postgres ، لدينا متغير
‫البيئة والإعدادات السرية مثل السابق. لدينا وحدات التخزين المحددة ، وسترى في الأسفل
‫، لدي بالفعل السر
‫المستند إلى الملف لأنه عندما نقوم بالتطوير المحلي ، يتعين علينا استخدام السر المستند إلى
‫الملف.
‫تصبح الأمور ممتعة بعض الشيء عندما أنظر إلى هذا المنتج أو ملفات الاختبار. الطريقة التي سيعمل بها
‫هذا هي ، تذكر أن ملف. تجاوز. yml تلقائيًا بواسطة سطر أوامر
‫Docker Compose. في prod أو الاختبار
‫، سأضطر إلى تحديدها يدويًا.
‫لذا للاختبار ، علينا استخدام الأمر f.
‫إذا كنت تتذكر من الأقسام السابقة ، فإن الحرف -f هو عندما نقوم بإنشاء عامل ميناء أننا نريد
‫تحديد ملف مخصص. سأريكم ذلك بعد دقيقة.
‫ثم في الإنتاج ، نظرًا لأننا في الواقع لن يكون لدينا سطر أوامر Docker Compose
‫على خادم الإنتاج ، ما سنفعله هنا هو أننا سنستخدم أمر تكوين تكوين عامل ميناء.
‫سيقوم الأمر config في الواقع بعمل إخراج عن طريق الضغط معًا أو دمج إخراج ملفات التكوين
‫المتعددة.
‫لذلك سيكون هذا رائعًا حقًا.
‫سريع حقيقي ، ملف الاختبار يحتوي فقط على دروبال و postgres.
‫تخيل لو كان هذا هو حل Jenkins CI أو Codeship CI الخاص بك ، حيث أريده أن يبني الصورة في
‫كل مرة ألزم فيها الكود الخاص بي ، وأريد تسميته بهذا ، وأريد أن يكون على هذا
‫المنفذ لأغراض الاختبار. ثم سأستخدم كلمة مرور مزيفة. لكنني لست بحاجة إلى تحديد أي من وحدات التخزين
‫لأنني لن أحاول فعلاً الاحتفاظ ببيانات وحدة التخزين المسماة لأنه مرة أخرى ، إنها مجرد منصة CI.
‫بمجرد اجتيازه الاختبارات أو فشل الاختبارات ، سيتخلص من كل شيء.
‫ثم في هذا السيناريو ، قد ترى أنني حصلت بالفعل على نموذج سيناريو البيانات هذا حيث
‫ربما في حل CI الخاص بك ، لديك ببساطة قواعد بيانات موجودة هناك تأتي إما من مستودع Git مخصص
‫أو ربما يتم تنزيلها عبر FTP. أو يحدث شيء ما أثناء تهيئة CI الخاص بك
‫حيث يقوم بالفعل بتنزيل ملف قاعدة بيانات. وبدلاً من الاضطرار إلى إنشاء قاعدة بياناتنا في كل مرة
‫نقوم فيها باختبار CI ، سنقوم فقط بتركيب دليل عينة البيانات هذا في المكان الذي من المفترض أن تكون فيه بيانات postgres.
‫وبهذه الطريقة ، يمكننا أن نضمن أن لدينا نفس بيانات العينة في كل مرة نقوم فيها بإجراء اختبار CI.
‫لن أخوض في ذلك أكثر من ذلك. أردت فقط أن أوضح أن هذا قد يكون
‫كيف سيكون ملف CI مختلفًا.
‫ثم في الإنتاج ، لدينا كل مخاوف الإنتاج العادية. نحن نحدد أحجامًا لبياناتنا
‫المحددة. نحن نحدد سرنا. ولاحظ في الأسفل ، السر الخارجي لدينا.
‫لأننا سنضع السر بالفعل عبر سطر الأوامر كما فعلنا في المهمة
‫السابقة.
‫النقطة هنا هي أن جميع هذه التكوينات الثلاثة مختلفة بطريقة ما ، لكنها
‫كلها مرتبطة بالتكوين الأساسي ، أو التكوين الأساسي ، الذي يحدد فقط الخدمتين وصورهما.
‫يمكنك أن ترى هنا. هذا تذكير بالشكل الذي تبدو عليه.
‫لنخرج من هذا ونقوم بتشغيل أمرين.
‫إذا بحثت في هذا الدليل ، فسترى أن لدي الملف الأساسي ثم ملفات التجاوز الثلاثة.
‫مرة أخرى ، تذكر أن التجاوز. yml هو الافتراضي.
‫إذا قمت بتكوين عامل ميناء ، فإن ما سيفعله هنا في الواقع هو استخدام عامل الإرساء. yml أولاً ، ثم يتم تراكب
‫التجاوز. yml واحد في الأعلى. أريد وضع a -d حتى نتمكن
‫من إلقاء نظرة سريعة بعد أن بدأ. سأقوم بفحص عامل ميناء على صورة دروبال.
‫وما أردت أن أريكم أنه موجود هنا ، فقد تم إدراج جميع الحوامل.
‫لذلك نحن نعلم أنه استغرق ملف التجاوز لأن ملف التجاوز كان حيث حددنا كل عمليات التحميل
‫هذه.
‫لذلك نحن نعلم أنها التقطت ذلك.
‫من الواضح أنه إذا لم يلتقط الصورة الأساسية ، فلن يعرف حتى الصور التي يجب استخدامها
‫، لذلك سيكون في الواقع يشتكي إلينا ويقول إن ملف Compose غير مكتمل.
‫هذا واحد يعمل.
‫دعونا نقوم بعمل نزول سريع حقيقي.
‫إذا كنا سنقوم بالفعل بتنفيذ الأمر الذي نحتاجه لحل CI الخاص بنا ، فإن ما يتعين علينا القيام
‫به في حل CI الخاص بنا هو التأكد من أن Docker Compose كان موجودًا ومثبتًا ومتاحًا حتى نتمكن من تنفيذ
‫أوامر إنشاء عامل الإرساء. ثم يمكننا تحديد -f ، ومن ثم يكون
‫ترتيب f هو الملف الأساسي الذي يجب أن يكون أولًا دائمًا.
‫لذلك يقوم عامل النقل بتكوين yml ، ثم اختبار عامل النقل.
‫إذا فعلنا هذا بأعلى في النهاية و a -d ، ثم ذهبت وفتشت نفس دروبال ، ستلاحظ
‫أنه لا توجد حوامل ربط.
‫إنها مفقودة تمامًا لأننا لم نحددها في ملف الاختبار.
‫لم نكن بحاجة في الواقع إلى دروبال لحفظ المعلومات لأنه كان سيتم التخلص
‫منها في نهاية تشغيل CI.
‫ثم ثالثًا ، لدينا تكوين الإنتاج.
‫سيكون تكوين الإنتاج مختلفًا بعض الشيء.
‫سأقوم بضرب السهم لأعلى ، وبعد ذلك سأقوم بالضغط. بدلاً من الأمر الأعلى ، ما أريد
‫القيام به هنا هو config.
‫إذا ألقيت نظرة سريعة على المساعدة الحقيقية للتكوين ، فستجد خيارين فقط ولا أحد من هذين
‫الخيارين مناسب حقًا في هذا الموقف.
‫ما نريد القيام به هو مجرد تشغيل config بنفسه. ما سيفعله في الواقع هو إلقاء نظرة
‫على كلا الملفين ودفعهما معًا في ملف Compose واحد مكافئ.
‫إذن ما يمكننا فعله هنا هو تشغيل هذا الأمر في مكان ما في حل CI الخاص بنا. ثم قم بإخراجها إلى ملف
‫، ربما بعلمك ، شيء من هذا القبيل. سيكون ملف الإخراج هذا هو الملف الذي سنستخدمه
‫رسميًا في الإنتاج لإنشاء مكدسنا أو تحديثه.
‫ومع ذلك ، أريد أن أطرح القليل من التحذير هنا.
‫هذه كلها أشياء جديدة نسبيًا.
‫نحن نعلم أن Secrets و Swarm Stacks جديدان نسبيًا.
‫هم فقط شهرين من العمر.
‫اعتبارًا من هذا التسجيل.
‫إذن هناك حواف خشنة.
‫لقد قمنا للتو بتشغيل أمر التكوين هذا ، وستلاحظ في الواقع أن الأسرار لم تكن مدرجة هناك.
‫هذا خطأ حاليا.
‫أنا أعمل بالفعل مع فريق Docker لمعرفة ما إذا كنا لا نستطيع سحق هذا الخطأ.
‫لذا بحلول الوقت الذي تقرأ فيه هذا ، ربما يكون قد تم إصلاحه بالفعل.
‫تأكد من فحص ناتج خط التكوين هذا قبل البدء في النشر
‫في الإنتاج.
‫ثانيًا ، يعد خيار Compose Extends ، الذي لم أناقشه هنا ، طريقة أخرى لتجاوز ملفات Compose
‫هذه حيث تستخدم بالفعل ملف التجاوز وتقوم بالفعل بتعريف قسم الامتدادات هناك.
‫إنه إعلاني أكثر قليلاً ، لذلك من السهل فهمه. سأقدم رابطًا في المراجع
‫لهذا القسم. فقط اعلم أن خيار Extends لا يعمل حتى الآن في أكوام Swarms.
‫لم أذكرها هنا لأنها لا تمنحك حقًا دورة حياة التطبيق الكاملة التي كنا نأملها
‫، لكنني أتوقع منهم في وقت ما أن يفعلوا شيئًا حيال ذلك.
‫مثل إضافته إلى Swarm أو إنشاء سير عمل أفضل. لأن هذه هي الفكرة التي نحاول الوصول إليها
‫باستخدام كل هذه الأدوات ، وهي أن تكون لدينا دورة حياة كاملة وسهلة من التطوير حتى الاختبار
‫، إلى الإنتاج ، مع نفس مجموعة التكوينات ، في نفس مجموعة الصور .
‫آمل أن يكون هذا قد جعلك تفكر في كيفية إنشاء تطبيقاتك بهذه الطريقة ، وكيف يمكنك توسيع
‫ملفات Compose الخاصة بك لسيناريوهات معقدة.
‫لأن لا شيء يضع ابتسامة على وجهي بشكل أسرع مع Docker مما يحدث عندما أرى شخصًا يقوم بتشغيل أمر
‫سطر واحد للقيام بشيء كان يتطلب في السابق عدة نصوص لتنفيذه.