توسعه و اجرای پروژه های لاراول با داکر و داکر کمپوز

توسعه و اجرای پروژه های لاراول با داکر و داکر کمپوز

احتمالا درباره مزیت استفاده از داکر (Docker) برای توسعه پروژه های برنامه نویسی و اجرای اونها در سرور شنیده‌اید. به همین خاطر شما هم ممکن است خواسته باشید پروژه های لاراول (Laravel) خود را با استفاده از داکر و داکر کمپوز (Docker Compose) توسعه دهید. در این مقاله بصورت مختصر کار هایی که باید برای اجرای یک پروژه بر پایه لاراول با داکر انجام دهیم را توضیح داده‌ام.استفاده از Docker و Docker Compose برای پروژه های لاراولبرای اجرای پروژه با استفاده از داکر، از ابزار داکر کمپوز (Docker Compose) استفاده می‌کنیم. محیط اجرای مورد نظر دارای ویژگی های زیر است:یک Container برای NGINX بعنوان وب سرور محیط اجرایک Container برای MySQL بعنوان دیتابیس (Database) پروژهیک Container برای Redis بعنوان دیتابیس کش (Cache) و Queueیک Container برای PHP نسخه 7.4 با امکانات پایه و آخرین نسخه از Composerیک Container بر اساس ایمیج PHP بعنوان Worker برای اجرای Job های Queue شدهیک Container بر اساس ایمیج PHP بعنوان اجرا کننده Scheduled Task ها (Cron Job ها)برای مجهز کردن پروژه به Docker Compose و محیط اجرای ذکر شده، باید تعدادی فایل به پروژه لارول مورد نظر اضافه کرد. در تصویر زیر می‌توانید فایل هایی که باید اضافه شوند را ببینید.فایل های مورد نیاز محیط اجرافایل هایی که در تصویر بالا می‌بینید باید با همین ساختار در پوشه لاراول قرار بگیرند؛ یعنی مثلا پوشه docker و فایل docker-compose.yml باید در کنار فایل env. پروژه لاراول قرار بگیرند.توجه کنید که از فایل های بالا تنها فایل env. متعلق به خود لاراول است و احتمالا آنرا قبلا از روی env.example. ساخته باشید.نیازی به ساختن پوشه های mysql و logs (که به رنگ زرد هایلایت شده‌اند) نیست و این پوشه ها توسط داکر ایجاد می‌شوند.فایل و پوشه های هایلایت شده به رنگ زرد توسط گیت ignore می‌شوند.در این بخش، محتوای فایل های ذکر شده به ترتیب حروف الفبا گنجانده شده است../.envAPP_NAME=MyApp

APP_EXPOSED_PORT=8080
DB_EXPOSED_PORT=33060
REDIS_EXPOSED_PORT=6379

DB_DATABASE=app
DB_PASSWORD=secret
…همونطور که قبلا اشاره شد فایل env. را احتمالا قبلا از روی فایل env.example. ساخته باشید. در بالا فقط متغیر های مورد نیاز محیط اجرای داکر ذکر شده و کاری با بقیه متغیر ها که مربوط به پروژه است نداریم.متغیر APP_NAME متعلق به پروژه (لاراول) است، اما ما هم از آن برای نامگذاری Container ها استفاده می‌کنیم. مطمئن شوید که اسم مناسبی برای APP_NAME انتخاب کرده‌اید. هیچ پروژه دیگری در کامپیوتر شما نباید عینا همین نام را داشته باشد وگرنه با خطای داکر مواجه می‌شوید.پورت های دلخواه اما غیرتکراری برای APP_EXPOSED_PORT (پورت NGINX)، DB_EXPOSED_PORT (پورت MySQL)، REDIS_EXPOSED_PORT (پورت Redis) ست کنید. توجه کنید این سه متغیر اختیاری هستند و آنها را به env. اضافه نکنید یا مقداری برایشان ست نکنید، داکر پورت های رندومی برای آنها در نظر می‌گیرد.دو متغیر DB_DATABASE و DB_PASSWORD هم که متعلق به پروژه (لاراول) است، اما مورد استفاده محیط اجرای ما هم قرار می‌گیرد و به ترتیب نام دیتابیس پروژه و پسورد کاربر root دیتابیس MySQL خواهد بود. این دو متغیر هم اختیاری هستند و در صورت اضافه یا مقداردهی نشدن به ترتیب برابر app و secret خواهند بود../docker/.gitignoremysql
nginx/logsاین فایل برای ignore کردن پوشه های mysql و logs از Git استفاده می‌شود. پوشه های ذکر شده توسط داکر ساخته خواهند شد و چون محتوای آنها وابسته به محیط (Local ،Production و …) و دارای اطلاعات حساس هستند بهتر است ignore شوند../docker/nginx/nginx.confserver {
listen 80 default_server;
listen [::]:80 default_server;

server_name localhost;

root /app/public;
index index.php;

error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;

location / {
try_files $uri $uri/ /index.php?$args;
}

location ~ .php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}در این فایل کانفیگ NGINX برای اجرای پروژه های Laravel را می‌بینید../docker/php/DockerfileFROM php:7.4-fpm

# Install system dependencies
RUN apt-get update && apt-get install -y
curl
libicu-dev
libpng-dev
libonig-dev
libxml2-dev
git
zip
unzip

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN pecl install redis
RUN docker-php-ext-enable redis
RUN docker-php-ext-configure intl
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd intl

# Get latest Composer
COPY –from=composer:latest /usr/bin/composer /usr/bin/composer

# Set working directory
WORKDIR /appاین فایل برای ساخت Image داکر PHP است که از توسعه Image رسمی PHP نسخه 7.4 و افزودن امکانات مورد نیاز ما بدست می‌آید. ابتدا امکانات مورد نیاز و کاربردی همچون curl و git و … به ایمیج پایه اضافه می‌شود. در ادامه افزونه (Extension) های مورد نیاز پروژه های معمول لاراول از جمله Redis (برای ارتباط با دیتابیس ردیس)، intl (برای کار با تقویم فارسی و تبدیل تاریخ شمسی به میلادی و …)، pdo_mysql (برای ارتباط با دیتابیس MySQL) و … به PHP اضافه می‌شود و در نهایت آخرین نسخه از Composer (راهنمای استفاده از Composer) هم نصب می‌شود../docker-compose.ymlversion: ‘3’

services:
nginx:
image: nginx:1.19.3-alpine
restart: always
working_dir: /app
volumes:
– ./:/app/
– ./docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
– ./docker/nginx/logs/:/var/log/nginx/
ports:
– ${APP_EXPOSED_PORT:-0}:80
depends_on:
– php

php:
build: ./docker/php
image: ${APP_NAME:-app}_php
working_dir: /app
volumes:
– ./:/app/
– ~/.ssh/:/root/.ssh/
depends_on:
– mysql
– redis

cron:
image: ${APP_NAME:-app}_php
restart: always
working_dir: /app
command: [ &quotphp&quot, &quotartisan&quot, &quotschedule:run&quot, &quot–verbose&quot, &quot–no-interaction&quot ]
volumes:
– ./:/app/
depends_on:
– php

worker:
image: ${APP_NAME:-app}_php
restart: always
working_dir: /app
command: [ &quotphp&quot, &quotartisan&quot, &quot-vvv&quot, &quotqueue:work&quot, &quotredis&quot, &quot–sleep=1&quot, &quot–daemon&quot, &quot–tries=3&quot ]
volumes:
– ./:/app
depends_on:
– php

mysql:
image: mysql:5.7.32
restart: always
environment:
– MYSQL_DATABASE=${DB_DATABASE:-app}
– MYSQL_ROOT_PASSWORD=${DB_PASSWORD:-secret}
ports:
– ${DB_EXPOSED_PORT:-0}:3306
volumes:
– ./docker/mysql:/var/lib/mysql

redis:
image: redis:6.0.9-alpine3.12
restart: always
ports:
– ${REDIS_EXPOSED_PORT:-0}:6379برای اجرای پروژه، تنها ابزار Docker و Docker Compose را روی کامپیوتر نصب کنید و دستور زیر را در پوشه پروژه اجرا کنید.docker-compose up -d محیط اجرای معرفی شده هم می‌تواند برای توسعه در محیط لوکال و هم برای اجرا پروژه در سرور Production (برای اپلیکیشن های کوچک) مورد استفاده قرار بگیرد.برای مختصر نگه داشتن آموزش، توضیحات اضافه را به این بخش منتقل کرده‌ام.پوشه mysql بعد از اجرای پروژه با docker-compose ساخته می‌شود و فایل های مربوط به MySQL که حاوی تمام اطلاعات دیتابیس پروژه است در آن ذخیره می‌شود. به همین خاطر با اجرای مجدد اطلاعات دیتابیس از بین نمی‌رود. با کپی کردن این پوشه به جای امن می‌توانید از دیتابیس بکاپ بگیرید گرچه روش های پیشرفته‌تری هم هست!جهت سهولت ایجاد محیط اجرا، هیچ کاربر جدیدی برای دسترسی به MySQL تعریف نشده و با استفاده از کاربر پیشفرض root، پسورد DB_PASSWORD و پورت DB_EXPOSED_PORT می‌توانید به دیتابیس MySQL دسترسی پیدا کنید.معمولا نیازی به ذخیره (Persist) اطلاعات کش شده روی هارد نیست و به همین خاطر در محیط اجرای معرفی شده هیچ پلنی برای نگه‌داری اطلاعات کش شده Redis وجود ندارد و با اجرای مجدد پروژه تمام اطلاعات موجود در Redis پاک خواهد شد.در فایل docker-compose.yml از آخرین نسخه از Docker Image های زمان نوشتن این مقاله استفاده شده است. در این محیط اجرا از نسخه (تگ) های دقیق به جای latest استفاده شده است چرا که شخصا ترجیح می‌دهم بدون تست از نسخه (تگ) های جدید استفاده نکنم. این کانتینر از Docker Image ساخته شده برای کانتینر php ساخته می‌شود و دستور اجرا Queue را اجرا می‌کند. برای بهره بردن از این Container باید مقدار QUEUE_CONNECTION مربوط به پروژه را به redis تغییر دهید.این Container که شباهت زیادی به کانتینر worker دارد برای اجرای Task های Scheduled شده به کار می‌رود. این Container درواقع نقش برنامه Crontab را در سیستم عامل های Unix-based بازی می‌کند.در حالت پیشفرض تنها یک Container بعنوان worker ایجاد می‌شود تا Job های Queue شده را اجرا کند و اگر این محیط اجرا را در سرور Production استفاده می‌کنید، احتمالا این مساله مشکل ساز خواهد شد. اما جای نگرانی نیست و با دستور زیر می‌توانید تعداد بیشتری (مثلا ۵) از این Container را داشته باشید تا جاب های بیشتری بطور همزمان اجرا شود.docker-compose scale worker=5نکات بسیاری برای ساخت یک محیط اجرا با استفاده از Docker و Docker Compose باید مورد توجه قرار بگیرد که بعضی از آنها در این مقاله ذکر شدند. با توجه به فراوانی ابزار های مورد نیاز و حتی روش های استفاده از آنها، محیط اجرای معرفی شده تنها برای نیاز های معمول و پروژه های ساده در نظر گرفته شده است.امید است با دیدگاه های سازنده شما این مقاله کامل تر شود…

Author: admin

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *