
مقدمه کانتینری کردن (Containerize) یک اپلیکیشن به فرآیند سازگاری اپلیکیشن و اجزای آن برای اجرا در محیطهای سبکی به نام کانتینر گفته میشود. این محیطها ایزوله و قابل حذف/بازسازی هستند و میتوان از آنها برای توسعه، تست و استقرار (Deploy) اپلیکیشنها در محیط پروداکشن استفاده کرد.
در این راهنما، از Docker Compose برای کانتینری کردن یک اپلیکیشن لاراول (Laravel) جهت توسعه استفاده میکنیم. پس از اتمام کار، شما یک اپلیکیشن دموی لاراول خواهید داشت که روی سه کانتینر سرویس جداگانه اجرا میشود:
- یک سرویس
appکه PHP 8.2-FPM را اجرا میکند. - یک سرویس
dbکه MySQL 8.0 را اجرا میکند. - یک سرویس
nginxکه از سرویسappبرای پردازش کدهای PHP استفاده کرده و سپس اپلیکیشن لاراول را به کاربر نهایی ارائه میدهد.
برای ایجاد یک فرآیند توسعه روان و تسهیل دیباگ اپلیکیشن، فایلهای اپلیکیشن را با استفاده از Volume های مشترک همگامسازی میکنیم. همچنین نحوه استفاده از دستورات docker compose exec برای اجرای Composer و Artisan در کانتینر app را بررسی خواهیم کرد.
پیشنیازها
- دسترسی به یک سرور اوبونتو 24.04 به عنوان یک کاربر غیر روت (non-root) با دسترسی sudo. اگر از یک سرور ریموت استفاده میکنید، داشتن فایروال فعال توصیه میشود. برای راهاندازی این موارد، لطفاً به راهنمای راهاندازی اولیه سرور اوبونتو در پارمین کلود مراجعه کنید.
- داکر (Docker) روی سرور شما نصب باشد.
- Docker Compose روی سرور شما نصب باشد.
مرحله ۱ — دریافت اپلیکیشن دمو
برای شروع، اپلیکیشن دموی لاراول را از مخزن گیتهاب آن دریافت میکنیم. ما به شاخه tutorial-01 علاقهمندیم که حاوی اپلیکیشن پایه لاراول است.
برای دریافت کدهای اپلیکیشن سازگار با این آموزش، نسخه tutorial-1.0.1 را به دایرکتوری خانه خود دانلود کنید:
برای باز کردن فایل زیپ به دستور unzip نیاز داریم. در صورت نصب نبودن، آن را نصب کنید:
اکنون محتویات اپلیکیشن را استخراج کرده و نام دایرکتوری را برای دسترسی آسانتر تغییر دهید:
به دایرکتوری travellist-demo بروید:
مرحله ۲ — تنظیم فایل .env اپلیکیشن
فایلهای پیکربندی لاراول در دایرکتوری به نام config در مسیر ریشه اپلیکیشن قرار دارند. علاوه بر این، از یک فایل .env برای تنظیم پیکربندیهای وابسته به محیط (مانند اعتبارنامههای دیتابیس و کلیدهای امنیتی) استفاده میشود.
هشدار: فایل پیکربندی محیط (Environment) حاوی اطلاعات حساسی درباره سرور شما از جمله اطلاعات دیتابیس و کلیدهای امنیتی است. به همین دلیل، هرگز این فایل را به صورت عمومی به اشتراک نگذارید.
مقادیر موجود در فایل .env بر مقادیر تنظیم شده در فایلهای پیکربندی معمولی در دایرکتوری config اولویت دارند.
اکنون یک فایل .env جدید ایجاد میکنیم. لاراول با یک فایل .env.example ارائه میشود که میتوانیم برای ساخت فایل خود از آن کپی بگیریم:
این فایل را با ویرایشگر متن خود باز کنید:
فایل .env فعلی تنظیماتی برای استفاده از دیتابیس محلی MySQL با آدرس 127.0.0.1 دارد. باید متغیر DB_HOST را به گونهای تغییر دهیم که به سرویس دیتابیس که در محیط داکر ما ایجاد خواهد شد اشاره کند. در این راهنما، نام سرویس دیتابیس را db میگذاریم. مقدار DB_HOST را به db تغییر دهید:
.env
در صورت تمایل میتوانید نام دیتابیس، نام کاربری و رمز عبور را نیز تغییر دهید. این متغیرها در مرحله بعد برای پیکربندی فایل docker-compose.yml استفاده میشوند. پس از پایان ویرایش، فایل را ذخیره کرده و ببندید.
مرحله ۳ — تنظیم Dockerfile اپلیکیشن
اگرچه سرویسهای MySQL و Nginx ما بر اساس ایمیجهای پیشفرض موجود در Docker Hub (که از طریق میرور پارمین کلود دریافت میشوند) اجرا میشوند، اما همچنان باید یک ایمیج سفارشی برای کانتینر اپلیکیشن بسازیم.
ایمیج ما بر پایه ایمیج رسمی php:8.2-fpm خواهد بود. در کنار این محیط PHP-FPM، چند ماژول اضافی PHP و ابزار مدیریت وابستگیها یعنی Composer را نصب میکنیم.
همچنین یک کاربر سیستم جدید ایجاد میکنیم تا بتوانیم دستورات artisan و composer را در حین توسعه اجرا کنیم. تنظیم uid باعث میشود کاربر داخل کانتینر همان شناسه کاربری (uid) کاربر شما در سیستم میزبان را داشته باشد. به این ترتیب، هر فایلی که توسط این دستورات ایجاد میشود با دسترسیهای صحیح در سیستم میزبان نیز بازتاب پیدا میکند.
یک Dockerfile جدید ایجاد کنید:
محتوای زیر را در آن کپی کنید:
Dockerfile
فایل را ذخیره کنید. این Dockerfile با تعریف ایمیج پایه شروع میشود، پکیجهای سیستم و اکستنشنهای PHP را نصب میکند، سپس Composer را از ایمیج رسمی آن کپی میکند و در نهایت یک کاربر سیستم با استفاده از آرگومانهای پاس داده شده ایجاد میکند.
مرحله ۴ — تنظیم پیکربندی Nginx و فایلهای دیتابیس
هنگام ایجاد محیطهای توسعه با Docker Compose، اغلب لازم است فایلهای پیکربندی یا راهاندازی را با کانتینرهای سرویس به اشتراک بگذاریم.
برای تنظیم Nginx، یک فایل به نام travellist.conf ایجاد میکنیم. دایرکتوری مربوطه را بسازید:
فایل پیکربندی را باز کنید:
تنظیمات زیر را در آن قرار دهید:
docker-compose/nginx/travellist.conf
این فایل Nginx را برای گوش دادن به پورت 80 و استفاده از index.php تنظیم میکند. فایل را ذخیره و ببندید.
برای راهاندازی دیتابیس MySQL، یک فایل دامپ (Dump) به اشتراک میگذاریم که هنگام راهاندازی کانتینر وارد (Import) میشود. دایرکتوری مربوطه را بسازید:
یک فایل .sql ایجاد کنید:
کد زیر را در آن قرار دهید:
docker-compose/mysql/db_init.sql
این کد یک جدول به نام places ایجاد کرده و آن را با دادههای نمونه پر میکند. فایل را ذخیره و ببندید.
مرحله ۵ — ایجاد محیط چندکانتینری با Docker Compose
Docker Compose به شما اجازه میدهد محیطهای چندکانتینری ایجاد کنید. در این بخش فایل docker-compose.yml را میسازیم. این فایل در ریشه اپلیکیشن قرار میگیرد.
سه سرویس app، db و nginx را تعریف خواهیم کرد. فایلهای اپلیکیشن از طریق Bind Mounts در سرویسهای app و nginx همگامسازی میشوند که برای توسعه بسیار مفید است.
فایل docker-compose.yml را ایجاد کنید:
محتوای زیر را در آن قرار دهید (دقت کنید که ایمیجها از میرور پارمین کلود دریافت میشوند):
docker-compose.yml
فایل را ذخیره کنید. (نسخههای جدید Docker Compose نیازی به تعیین version در ابتدای فایل ندارند).
مرحله ۶ — اجرای اپلیکیشن با Docker Compose
اکنون از دستورات Docker Compose برای ساخت ایمیج اپلیکیشن و اجرای سرویسها استفاده میکنیم.
ایمیج app را بسازید:
این دستور ممکن است چند دقیقه طول بکشد. پس از تکمیل، محیط را در حالت پسزمینه اجرا کنید:
برای نمایش وضعیت سرویسهای فعال:
خروجی باید نشان دهد که سه کانتینر travellist-app، travellist-db و travellist-nginx در حال اجرا (Up) هستند.
اکنون باید وابستگیهای لاراول را با Composer نصب کنیم:
سپس کلید اپلیکیشن لاراول را تولید کنید:
خروجی Application key set successfully. را نشان میدهد.
اکنون میتوانید مرورگر خود را باز کرده و از طریق پورت 8000 به سرور دسترسی پیدا کنید:
http://server_domain_or_IP:8000
اگر این دمو را روی سیستم محلی (Local) خود اجرا میکنید، از آدرس http://localhost:8000 استفاده کنید. شما باید صفحه اصلی اپلیکیشن دموی Travellist را مشاهده کنید.
برای مشاهده لاگهای سرویس Nginx میتوانید از دستور زیر استفاده کنید:
اگر میخواهید محیط Docker Compose را متوقف کنید اما وضعیت کانتینرها را حفظ کنید:
برای از سرگیری سرویسها:
برای خاموش کردن کامل محیط و حذف کانتینرها، شبکهها و Volume ها:
نتیجهگیری در این راهنما، ما یک محیط داکر با سه کانتینر را با استفاده از Docker Compose برای تعریف زیرساخت در یک فایل YAML راهاندازی کردیم. از این به بعد، میتوانید روی اپلیکیشن لاراول خود کار کنید بدون اینکه نیاز به نصب و راهاندازی یک وبسرور محلی برای توسعه و تست داشته باشید. علاوه بر این، شما با یک محیط قابل حذف و بازسازی کار میکنید که میتواند به راحتی در هنگام توسعه اپلیکیشن و همچنین انتقال به محیط پروداکشن مفید باشد.



