العودة إلى المدونة

نشر Laravel و Nginx و MySQL باستخدام Docker Compose

نشر Laravel و Nginx و MySQL باستخدام Docker Compose

مقدمة

يعد التكامل المستمر (CI) والنشر المستمر (CD) من أكثر المواضيع شيوعاً في تطوير البرمجيات حالياً. ولتحقيق جانب CI/CD في بنية البرمجيات، يستخدم المطورون الحاويات. الحاويات هي بيئات خفيفة الوزن، وافتراضية، ومحمولة، ومحددة بالبرمجيات. في الحاويات، يمكن للبرنامج العمل بمعزل عن البرامج الأخرى التي تعمل على الجهاز المضيف الفعلي. ينصب تركيز هذا البرنامج التعليمي على استخدام منصة الحاويات Docker لنشر وتشغيل تطبيقات الويب. يساعد Docker في تبسيط عملية إعداد حزمة خادم الويب. في هذا البرنامج التعليمي، سنستخدم حزمة LEMP لخدمة تطبيق Laravel.

تجمع حزمة LEMP بين Linux كنظام تشغيل، وNginx كخادم ويب، وMySQL كقاعدة بيانات، ولغة PHP للبرمجة النصية والمعالجة الديناميكية. يمكنك متابعة البرنامج التعليمي الخاص بنا حول كيفية تثبيت وتكوين حزمة LEMP على Ubuntu. يعد Laravel أحد أفضل أطر عمل PHP لتطوير تطبيقات الويب.

يوفر Docker أداة تسمى Docker Compose لتحديد عملية إعداد حاوية docker. يتيح Docker Compose للمطورين تحديد البنية التحتية لتطبيقاتهم، وخدماتهم، ومساحات التخزين (volumes)، والشبكات، وأي تبعيات في ملف واحد يسمى ملف docker-compose. ويمكنه إدارة حاويات Docker المتعددة من خلال أوامره مثل docker container create و docker container run وما إلى ذلك.

في هذا البرنامج التعليمي، ستتعلم كيفية نشر تطبيق ويب Laravel باستخدام Nginx و MySQL داخل حاوية Docker. سيتم تحديد التكوينات للحزمة بأكملها داخل ملف docker-compose، بالإضافة إلى ملفات التكوين الأخرى لـ PHP و MySQL و Nginx. فلنبدأ!

أولاً وقبل كل شيء

الخطوة 1: تنزيل Laravel وتثبيت التبعيات

الخطوة الأولى هي الحصول على كود Laravel من مستودع (repo). في السيناريوهات الفعلية، قد يكون لديك كود Laravel الخاص بك في مستودع ما، أي إما على GitHub أو Bit Bucket أو Gitlab، إلخ. ومع ذلك، من أجل هذا البرنامج التعليمي، سنقوم باستنساخ أحدث إصدار من مستودع Laravel الرسمي على GitHub. يأتي المستودع مع ملف composer، وهو مدير تبعيات على مستوى التطبيق لـ PHP. نظراً لأننا نريد تشغيل كل شيء داخل حاوية Docker، فسنقوم بتثبيت التبعيات باستخدام صورة Docker لـ composer. سيساعدنا هذا أيضاً في تجنب الاضطرار إلى تثبيت composer عالمياً على الجهاز المضيف الفعلي. بعد ذلك، قم بتشغيل الطرفية (terminal) الخاصة بك.

انتقل إلى الدليل الرئيسي الخاص بك:

أدخل الأمر التالي لاستنساخ المستودع في دليل يسمى laravel-web. أنت حر في تسميته كما تشاء. في وقت كتابة هذا المستودع، عندما نقوم بتشغيل هذا الأمر، فإنه يسحب الإصدار 8 من Laravel. عند تشغيل الأمر، ربما ستجد إصداراً جديداً:

ثم، انتقل إلى الدليل الذي قمت باستنساخ المستودع فيه للتو:

أدخل الأمر التالي لربط الأدلة التي يحتاجها تطبيق laravel الخاص بك باستخدام صورة Docker لـ composer:

تقوم العلامتان -v و –rm في الأمر docker run بإنشاء حاوية مؤقتة سيتم ربطها بالدليل الحالي قبل إزالتها. ينسخ الأمر محتويات ~/laravel-web إلى الحاوية ويضمن نسخ مجلد vendor الذي تم إنشاؤه بواسطة composer مرة أخرى إلى الدليل الحالي.

الآن، تحتاج إلى تغيير ملكية دليل laravel-web إلى المستخدم غير الجذر (non-root). سيسمح لك ذلك بالعمل مع كود تطبيقك كمستخدم غير جذر وتشغيل العمليات داخل الحاوية في الخطوات اللاحقة. أدخل الأمر التالي لتغيير الملكية:

كود تطبيقك أصبح الآن في مكانه الصحيح. الدليل مملوك لمستخدم غير جذر، لذا يمكنك المتابعة في تحديد خدمات التطبيق في ملف docker-composer.

الخطوة 2: إنشاء ملف Docker Compose

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

في هذه الخطوة، ستقوم بتحديد ملف Docker Compose مع تكوينات لخادم الويب وقاعدة البيانات وخدمات التطبيق اللازمة لنشر تطبيق Laravel.

ملفات Docker Compose هي ملفات YAML يتم حفظها بامتداد .yml. يرجى ملاحظة أن المسافة البادئة المناسبة ضرورية لملف Docker Compose صالح. أدخل الأمر التالي لإنشاء الملف وفتحه باستخدام nano لتحريره:

بعد ذلك، ستقوم بتحديد ثلاث خدمات في هذا الملف: app و webserver و db. يحدد قسم db بيانات اعتماد قاعدة البيانات لتطبيقك، لذا تأكد من اختيار mysql_root_password قوي واستبداله في هذا القسم. انسخ الكود التالي والصقه:

فيما يلي شرح لتعريفات الخدمات من الكود أعلاه:

  • app: يحدد تطبيق Laravel ويقوم بتشغيل صورة Docker مخصصة، cloudsigma.com/php، والتي سنقوم بتحديدها في الخطوة 4. كما أنه يحدد working_dir في الحاوية إلى /var/www/html.
  • webserver: يقوم بسحب nginx:alpine صورة من Docker ويكشف عن المنافذ 80 و 443.
  • db: يقوم بسحب صورة mysql:5.7.32 من Docker ويحدد بعض متغيرات البيئة. وتشمل هذه قاعدة بيانات تسمى laravel_web للتطبيق وكلمة مرور الجذر لقاعدة البيانات. يمكنك إعادة تسمية قاعدة البيانات باسم من اختيارك. تذكر استبدال خاصية MYSQL_ROOT_PASSWORD بكلمة مرور قوية. تقوم هذه الخدمة أيضًا بتعيين المنفذ 3306 على المضيف إلى المنفذ 3306 على الحاوية.

تحدد الخاصية container_name في كل خدمة اسمًا للحاوية المقابلة للخدمة. إذا لم تقم بتحديد هذه الخاصية، فإن Docker يختار اسمًا عشوائيًا لكل حاوية.

تحدد الخاصية networks شبكة جسرية (bridge network) تسمى app-network والتي تسهل الاتصال بين الحاويات. يتم التحكم في الشبكة الجسرية بواسطة جسر برمجيات يسمح فقط بالاتصال بين الحاويات الموجودة على نفس جسر الشبكة. يقوم متحكم برمجيات الجسر بتثبيت برامج تشغيل تمنع الحاويات الموجودة على شبكات جسرية مختلفة من الاتصال ببعضها البعض مباشرة. يضمن هذا مستوى عالٍ من الأمان حيث يمكن للخدمات ذات الصلة فقط الاتصال مباشرة. قد تختار تحديد خدمات وشبكات متعددة تتصل بالوظائف ذات الصلة.

الخطوة 3: كيفية حفظ البيانات بشكل دائم

سيقوم تطبيق الويب الخاص بك بمعالجة البيانات وتقديمها للمستخدمين. في هذه الخطوة، سنرشدك خلال تحديد مجلدات التخزين (volumes) ونقاط ربط المسار (bind mounts) لتعريفات الخدمة الخاصة بك لحفظ بيانات التطبيق بشكل دائم. يقدم Docker ميزات رائعة مثل ربط المسارات (bind mounts) و مجلدات التخزين (volumes) لحفظ البيانات بشكل دائم وحفظ ملفات تكوين التطبيق. سنستخدمها في إعداد تطبيق Laravel الخاص بنا مع Docker.

تُفضل مجلدات التخزين (Volumes) لأسباب مختلفة بما في ذلك تقديم نسخ احتياطية وحفظ البيانات بشكل دائم بعد دورة حياة الحاوية. تشير نقاط ربط المسار (Bind Mounts) عادةً إلى دليل فعلي على الجهاز المضيف. عندما تقوم بإنشاء مجلد تخزين (volume)، يتم إنشاء دليل جديد داخل دليل تخزين Docker الذي يديره Docker. عندما تقوم بإنشاء ربط مسار (bind mount)، يتم تركيب ملف أو دليل داخل الجهاز المضيف في حاوية (يُشار إليه بمساره المطلق). هذا أمر بالغ الأهمية لتطبيق الويب الخاص بنا لأنه عندما تجري تغييرات على الكود على الجهاز المضيف، ستكون متاحة على الفور للحاوية.

كن حذرًا عند استخدام ربط المسارات (bind mounts). يمكن للعمليات التي تعمل داخل حاوية Docker إجراء تغييرات على نظام ملفات المضيف والتأثير على العمليات غير التابعة لـ Docker التي تعمل على النظام المضيف. في حين أن نقاط تركيب Docker هي ميزة قوية، كن على دراية بهذه الآثار الأمنية.

بعد قول هذا، دعنا نرى كيف يمكننا استخدام هاتين الميزتين في إعدادنا. أولاً، سنحدد مجلد تخزين (volume) لحفظ قاعدة بيانات MySQL بشكل دائم. في ملف Docker Compose الذي أنشأناه، تحت خدمة db، أضف خاصية volumes كما هو موضح أدناه:

كما هو محدد، سيقوم مجلد التخزين dbdata بحفظ محتويات /var/lib/mysql بشكل دائم. وهو يسهل عمليات النسخ الاحتياطي ويسمح بإعادة تشغيل الخدمة دون فقدان البيانات. بعد ذلك، يجب عليك إضافة تعريف مجلدات التخزين (volumes) في نهاية ملف Docker Compose لجعله متاحًا عبر الخدمات. أدخل مقتطف الكود التالي في أسفل الملف:

للاتصال بقاعدة بيانات MySQL، يجب عليك تقديم بيانات الاعتماد. للقيام بذلك، حدد ربط مسار (bind mount) عن طريق إضافة مقتطف الكود الموضح التالي إلى خدمة db تحت خاصية volumes:

يربط الكود ~/laravel-web/mysql/my.cnf بـ /etc/mysql/my.cnf في الحاوية. الملف المربوط هو ملفات تكوين MySQL التي سننشئها في الخطوة 7.

تحتاج الحاوية إلى استخدام خادم Nginx لخدمة كود التطبيق الخاص بك. لذلك، سنحدد ربطين للمسار (أحدهما لملف تكوين Nginx، والآخر لكود التطبيق)، تحت خدمة webserver لهذا الغرض. أضف مقتطف الكود التالي لتعريف مجلدات التخزين (volumes) تحت خدمة webserver:

يربط هذا السطر – ./:/var/www/html كود التطبيق في دليل ~/laravel-web بالدليل /var/www/html داخل الحاوية. بالنسبة لربط التثبيت الثاني (bind mount)، سيتم إنشاء ملف تكوين لـ Nginx في ~/laravel-web/nginx/conf.d/. وسيتم تثبيته في /etc/nginx/conf.d/ داخل الحاوية. وبالتالي، يمكنك تحديث ملف التكوين على الجهاز المضيف حسب الحاجة. سنقوم بإنشاء ملف تكوين Nginx في الخطوة 6.

لكي تنعكس التغييرات في الكود تلقائيًا في الحاوية، نقوم بربط تثبيت كود التطبيق بالحاوية. هذا يسرع عملية النشر. لذلك، أضف مقتطف الكود المظلل التالي إلى خدمة التطبيق (app service):

يربط السطر الثاني ملف تكوين php، والذي سنقوم بإنشائه في الخطوة 5 داخل ملف ~/laravel-web/php/laravel.ini بـ /usr/local/etc/php/conf.d/laravel.ini داخل الحاوية.

يجب أن يبدو ملف Docker Compose الكامل الآن كما يلي:

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

الخطوة 4: إنشاء ملف Dockerfile

يحتوي Dockerfile على تعليمات يمكن لـ Docker استخدامها لإنشاء صور Docker مخصصة. يمكنه أيضًا تثبيت البرامج المطلوبة وتكوين الإعدادات اللازمة لتطبيقك. وهي تحدد البيئة داخل الحاوية التي ستستضيف كود تطبيقك. يمكنك دفع الصور التي تقوم بإنشائها إلى docker hub لمشاركتها أو وضعها في سجلات خاصة أخرى.

سنقوم بإنشاء ملف Dockerfile يحدد التعليمات لبناء صورة تطبيق Laravel. استخدم nano لإنشاء ملف Dockerfile في دليل ~/laravel-web:

في المحرر المفتوح، أضف الكود التالي:

يقوم ملف Dockerfile أولاً بإنشاء صورة بناءً على php:7.4-fpm صورة Docker. هذه صورة مبنية على Debian مع تثبيت تطبيق PHP FastCGI (PHP-FPM) . لكي يعمل Laravel بشكل صحيح، فإنه يتطلب توفر امتدادات php أخرى مثل mcrypt و pdo_mysql و mbstring و imagick، والتي يقوم السكربت بتثبيتها. ثم يقوم بتثبيت composer مدير حزم php. ستستخدمه الحاوية لتثبيت اعتماديات php الخاصة بـ Laravel.

يمكنك استخدام التوجيه RUN لتعريف أوامر مثل التثبيت والتحديث وتكوين الإعدادات داخل الحاوية. كما أنه يعين أذونات المستخدم. يحدد التوجيه WORKDIR دليل العمل، وهو /var/www/html في هذه الحالة. يقوم السكربت بتشغيل الأمر CHOWN لتعيين أذونات دليل /var/www/html للمستخدم www-data.

قبل بناء الصورة نهائيًا، يجب كشف منفذ للسماح بالوصول إلى التطبيق الذي يعمل داخل الحاوية. يكشف الأمر EXPOSE عن منفذ، 9000، لخادم php-fpm. الأمر الأخير الذي سيتم تشغيله هو التوجيه CMD. حيث يقوم بتشغيل php-fpm لبدء تشغيل الخادم.

يمكنك الآن الضغط على Ctrl + O لحفظ الملف. ثم اضغط على Ctrl + X للخروج من المحرر.

الخطوة 5: تكوين PHP

في هذه الخطوة، سنقوم بتكوين خدمة php لمعالجة الطلبات الواردة من Nginx. ستقوم بإنشاء ملف laravel.ini داخل دليل php. سيحتوي هذا الملف على تكوينات PHP. هذا هو الملف الذي قمت بربطه بـ /usr/local/etc/php/conf.d/laravel.ini في الحاوية في الخطوة 3. تتجاوز التكوينات الموجودة في هذا الملف ملف php.ini الافتراضي الذي يقرأه PHP عادةً عند بدء تشغيله. أدخل الأمر التالي لإنشاء دليل php:

قم بإنشاء وفتح ملف laravel.ini داخل دليل php عن طريق إدخال الأمر التالي:

ملف php.ini الافتراضي يحتوي على حد أقصى للرفع تم تعيينه على 2M. كمثال، سنوضح لك كيفية ضبط وتعيين تكوينات php عن طريق تغيير قيمة حد الرفع المسموح به، في حال كنت ترغب في رفع ملفات أكبر حجمًا. أدخل أسطر الكود التالية داخل الملف:

يحدد هذا حد الرفع ويمكنك رفع ملفات بحجم إجمالي لا يتجاوز 80 ميجابايت. يمكنك إضافة تكوينات php أخرى داخل ملف laravel.ini لتجاوز تكوينات php الافتراضية. الآن، احفظ الملف وأغلقه.

الخطوة 6: تكوين Nginx

في هذه الخطوة، سنقوم بتكوين Nginx لاستخدام خدمة php التي قمنا بتعريفها سابقًا. ستستخدم الخدمة PHP-FPM كـ خادم FastCGI لتقديم محتوى ديناميكي. خادم FastCGI هو برنامج يتيح للبرامج التفاعلية الواجهة مع خادم الويب.

كما قمنا بتعريفه في ملف docker-compose في الخطوة 3، سنقوم بإنشاء ملف تكوين Nginx المسمى app.conf داخل دليل ~/laravel-web/nginx/conf.d/. أولاً، أدخل الأمر التالي لإنشاء الدليل:

بعد ذلك، قم بإنشاء وفتح ملف app.conf باستخدام nano عن طريق إدخال الأمر التالي:

أضف كود تكوين Nginx التالي إلى الملف:

يقرأ Nginx ملفات التكوين التي تسمى كتل الخادم (server blocks) لمعرفة الدليل الذي يجب تقديمه لزائر الموقع بناءً على عنوان URL. لمعرفة المزيد، اقرأ عن إعداد كتل الخادم في الدرس التعليمي الخاص بـ تثبيت Nginx على Ubuntu 18.04. تخدم التوجيهات المحددة الأغراض التالية:

  • listen – يحدد المنفذ الذي سيستمع عليه الخادم للطلبات الواردة، وهو عادةً المنفذ 80.
  • error_log & access_log – يحدد الملفات لكتابة سجلات التطبيق.
  • root – يحدد مسار جذر الويب (webroot)، وهو الدليل الذي سيخدم أي طلب يتم تقديمه إلى الخادم من الإنترنت.

في كتلة الموقع (location block) الخاصة بـ php، يحدد التوجيه fastcgi_pass أن خدمة التطبيق (app service) تستمع على مقبس TCP على المنفذ 9000 (والذي تم تحديده في Dockerfile). يوجه هذا خادم PHP-FPM للاستماع عبر الشبكة وليس على مقبس Unix. في حين أن مقبس Unix قد يكون له ميزة طفيفة في السرعة مقارنة بمقبس TCP، إلا أنه يفتقر إلى بروتوكول الشبكة وبالتالي يتخطى مكدس الشبكة.

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

يمكنك الآن الضغط على Ctrl + O لحفظ الملف، ثم الضغط على Ctrl + X للخروج من المحرر. ستنعكس التغييرات التي تم إجراؤها في دليل nginx/conf.d/ تلقائيًا في حاوية خادم الويب بفضل الربط المباشر (bind mount) الذي أضفته في ملف Docker Compose في الخطوة 3.

الخطوة 7: تكوين MySQL

بعد أن قمنا بتكوين Nginx للعمل مع PHP، يمكننا الآن تكوين MySQL لتخزين وتقديم البيانات الديناميكية إلى PHP. لقد قمنا بالفعل بإعداد ملف Docker Compose لتثبيت الامتدادات اللازمة للاتصال بين PHP و MySQL. سنقوم بإنشاء ملف تكوين MySQL المسمى my.cnf داخل مجلد mysql، والذي سيتم ربطه بـ /etc/mysql/my.cnf كما حددنا في قسم خدمة db في Docker Compose في الخطوة 3.

يمكن إجراء إعدادات وتغييرات تكوين MySQL على ملف my.cnf وقتما تشاء. ويجب أن تنعكس داخل الحاوية على الفور. أولاً، قم بإنشاء الدليل عن طريق إدخال الأمر التالي:

بعد ذلك، قم بإنشاء وفتح nano عن طريق إدخال الأمر التالي:

أدخل مقتطف الكود التالي لتمكين سجل الاستعلامات وتحديد موقع ملف سجل الاستعلامات:

من خلال تحديد خاصية general_log كـ 1، فإنك تسمح بالسجلات العامة. تحدد خاصية general_log_file موقع ملف السجلات. اضغط على Ctrl + O لحفظ الملف، ثم اضغط على Ctrl + X للخروج من المحرر.

الخطوة 8: تعيين متغيرات بيئة Laravel

حتى هذه النقطة، تم اكتمال جميع الخدمات وإعدادات التكوين. وبالتالي، يمكننا نشر حاوياتنا. ومع ذلك، هناك خطوة مهمة يجب إنجازها قبل أن يكون تطبيق الويب الخاص بنا قابلاً للاستخدام فعليًا - متغيرات البيئة. يتوقع إطار عمل Laravel ملفًا يسمى .env يستخدمه لتحديد بيئته. بشكل افتراضي، يأتي Laravel مع ملف .env.example الذي يمكنك نسخه إلى .env، ثم تعديل المتغيرات بتفاصيلك الفعلية. أدخل الأمر التالي لنسخ الملف:

بمجرد نسخه، افتح الملف باستخدام nano لتعديله:

إليك لقطة شاشة لما قد يبدو عليه الملف:

screenshot of what the file

في الملف، الخطوة التالية هي تعديل المتغيرات تحت كتلة DB_CONNECTION كما قمت بتعيينها في التكوينات السابقة التي قمنا بها حتى الآن. قم بالتحديث على النحو التالي:

  • DB_HOST هو db حاوية قاعدة البيانات.
  • DB_DATABASE هو laravel_web.
  • DB_USERNAME هو اسم المستخدم لقاعدة البيانات. اختر اسمًا من اختيارك، ولكن من أجل هذا البرنامج التعليمي، دعنا نذهب مع laraveldocker.
  • DB_PASSWORD هي كلمة مرور قوية سيستخدمها المستخدم أعلاه لتسجيل الدخول إلى قاعدة البيانات، لذا اختر كلمة مرور قوية. في الخطوة 10، سنقوم بإنشاء هذا المستخدم بكلمة المرور التي تختارها هنا.

مع تحديث القيم، يجب أن تبدو DB_CONNECTION الخاصة بك الآن كما يلي:

DB_CONNECTION

احفظ الملف وأغلقه.

الخطوة 9: تشغيل حاويات Docker

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

عند تشغيل أمر docker-compose up للمرة الأولى، فإنه يقوم بتنزيل جميع صور Docker اللازمة. إذا كنت تقوم بإعداد البنية التحتية على جهاز الكمبيوتر المحلي الخاص بك، فقد يستغرق الأمر بعض الوقت للاكتمال. بمجرد تنزيل الصور، يقوم Compose بإنشاء الحاويات. يوجه العلم -d برنامج Docker لتشغيل الحاويات في الخلفية. إذا اكتملت العملية بنجاح، يجب أن تكون قادرًا على رؤية شيء كهذا في الطرفية الخاصة بك:

terminal

أدخل الأمر التالي في الطرفية الخاصة بك لسرد جميع الحاويات قيد التشغيل:

يجب أن يعرض شيئًا مثل لقطة الشاشة أدناه، مع تفاصيل حول حاويات app و webserver و db:

screenshot details

  • CONTAINER ID – معرف فريد لكل حاوية.
  • NAMES – اسم الخدمة المرتبط بكل حاوية، كما هو محدد في ملف Docker Compose. (يمكنك استخدام إما معرف الحاوية أو اسمها للوصول إلى الحاوية).
  • IMAGE – اسم الصورة لكل حاوية.
  • STATUS – يعرض معلومات حول حالة الحاوية (قد تكون متوقفة، أو قيد التشغيل، أو قيد إعادة التشغيل).
  • PORTS – يعرض المنافذ التي تكشفها الحاوية.

يوفر Docker Compose أمرًا يسمى exec يمكنك استخدامه لتشغيل أوامر الطرفية أو الوصول إلى سطر الأوامر داخل الحاوية. نريد أولاً تشغيل بعض الأوامر داخل حاوية app، وهي الحاوية التي تقوم بتشغيل تطبيق Laravel.

يوفر Docker أمرًا للوصول إلى سطر الأوامر الخاص بالحاوية. صيغته هي كما يلي: docker-compose exec container_name bash. للوصول إلى سطر الأوامر الخاص بحاوية app، أدخل الأمر التالي:

بمجرد الدخول إلى سطر أوامر الحاوية، يمكنك تشغيل بعض أوامر تكوين Laravel Artisan . أدخل الأمر التالي لإنشاء مفتاح laravel وحفظه في ملف .env:

مع تعيين مفتاح البيئة، يمكنك تشغيل الأمر التالي لتخزين إعدادات التكوين مؤقتًا:

يتم تخزين التكوينات في الملف /var/www/html/bootstrap/cache/config.php داخل الحاوية. يمكنك الضغط على Ctrl + D للخروج من طرفية الحاوية.

لتأكيد أنه تم نشر تطبيق Laravel وأنه قيد التشغيل، قم بزيارة عنوان IP العام لخادمك’ (http://your_server_public_ip). يجب أن تشاهد صفحة الترحيب لتثبيت Laravel الجديد:

laravel screenshot

الخطوة 10: تكوين مستخدم MySQL

في هذه الخطوة، سنقوم بإنشاء مستخدم قاعدة بيانات لقاعدة بيانات MySQL المسماة laravel_web والتي حددناها في ملف docker-compose. عندما قمت بتشغيل أمر بناء الحاوية في Step 9، تم تثبيت MySQL، ولكنه أنشأ فقط حساب مسؤول root الافتراضي، والذي تصادف أن لديه صلاحيات غير محدودة على قاعدة البيانات. لتجنب استخدام مستخدم root، سنقوم بإنشاء مستخدم مخصص، laraveldocker، لاستخدامه في التطبيق. هذا هو المستخدم الذي حددته في متغيرات البيئة في Step 8. قم بالوصول إلى سطر الأوامر داخل الطرفية عن طريق إدخال الأمر التالي:

بمجرد الدخول إلى الحاوية، قم بتسجيل الدخول إلى MySQL عن طريق إدخال الأمر التالي:

في موجه كلمة المرور، أدخل كلمة المرور التي قمت بتعيينها في خدمة db في ملف docker-compose في Step 2.

بمجرد تسجيل الدخول إلى موجه MySQL، تحقق مما إذا كان بإمكانك رؤية قاعدة البيانات التي حددتها في ملف docker-compose عن طريق إدخال أمر SQL التالي:

يجب أن تشاهد قاعدة بيانات laravel_web، أو أي اسم آخر حددته لإعدادك:

Laravel

بعد ذلك، نقوم بإنشاء مستخدم وكلمة مرور لقاعدة بيانات laravel_web. يجب أن تكون هذه هي نفس التفاصيل التي حددتها في ملف .env في Step 8. أدخل الأمر التالي لإنشاء المستخدم وكلمة المرور، ومنح جميع الصلاحيات لهذا المستخدم:

لكي تدخل التغييرات حيز التنفيذ فورًا، أدخل الأمر التالي لتحديث الصلاحيات:

بذلك يكتمل تكوين مستخدم MySQL. اخرج من موجه MySQL بكتابة exit والضغط على enter. وأخيرًا، اخرج من حاوية db بالضغط على Ctrl + D.

الخطوة 11: اختبار الاتصال بين كود تطبيق Laravel وقاعدة بيانات MySQL

حتى هذه الخطوة، سار كل شيء على ما يرام. ومع ذلك، نريد التأكد من أن كود Laravel في حاوية app يمكنه الاتصال بقاعدة بيانات MySQL في حاوية db. أولاً، قم بالوصول إلى طرفية حاوية app عن طريق إدخال الأمر التالي:

التالي هو تشغيل أمر laravel migration الذي يقوم بإنشاء الجداول:

يجب أن تشاهد عملية الترحيل في الطرفية الخاصة بك بينما يقوم Laravel بإنشاء الجداول الافتراضية:

migration process

بعد ذلك، سنختبر ما إذا كان بإمكاننا الوصول إلى قاعدة البيانات من Laravel. يأتي Laravel مع Tinker افتراضيًا، مما يسمح لك بالتفاعل مع التطبيق بأكمله من سطر الأوامر، بما في ذلك الوصول إلى قاعدة البيانات، وتشغيل المهام، و eloquent ORM، والمزيد. يمكننا استخدام Tinker لعرض البيانات في جدول migrations. أدخل الأمر التالي للوصول إلى Tinker:

بمجرد الدخول إلى موجه Tinker، يمكنك سرد الجداول التي تم إنشاؤها بواسطة أمر migrate عن طريق إدخال ما يلي:

توضح لقطة الشاشة أدناه المخرجات، وهي الجداول الموجودة حاليًا في قاعدة بيانات laravel_web:

laravel_web database

يمكنك استرداد البيانات في جدول عن طريق تحديد اسم الجدول. على سبيل المثال، يمكنك استرداد البيانات في جدول migrations عن طريق إدخال الأمر التالي:

يخرج الأمر ما يلي:

comman output

من المخرجات أعلاه، تم تكوين تطبيق Laravel الخاص بك بشكل جيد ويمكنه الاتصال بقاعدة البيانات. يمكنك تجربة المزيد من الأوامر مثل إنشاء النماذج (models)، وتشغيل المهام، والمزيد. يمكنك الخروج من موجه Tinker بالضغط على Ctrl + D.

الخاتمة

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

إذا كنت ترغب في التعرف أكثر على الحاويات، فقم بإلقاء نظرة على البرنامج التعليمي الذي يوضح لك كيفية تنظيف موارد Docker – الصور والحاويات ومساحات التخزين (volumes) و نظرة عامة مفصلة على أداة Kubernetes.

يمكنك أيضًا زيارة مدونتنا لمعرفة المزيد حول Docker والتكامل المستمر والنشر المستمر (Continuous Integration and Continuous Deployment).

نتمنى لك حوسبة سعيدة!

author

Pranay Kapgate

المؤلف · CloudSigma

Preslav Dobrev هو مصمم إبداعي في CloudSigma، يركز على هوية أعمال متسقة باستخدام قنوات التسويق التقليدية والمبتكرة. هو بارع في دمج الرؤية الفنية مع التسويق الاستراتيجي لخلق سرد قصصي مؤثر للعلامة التجارية.

التعليقات

لا توجد تعليقات بعد. كن أول من يعلق.