Skip to main content

اپ لاراول

مقدمه

لاراول یک فریم‌ورک به زبان php برای توسعه‌ی وبسایت است. لاراول در حال حاضر یکی از محبوب‌ترین فریم‌ورک‌های سمت بک‌اند است. در سمت فرانت Vue.js یکی از فریم‌ورک‌های پراستفاده است که می‌تواند در کنار لاراول استفاده شود. در این آموزش قصد داریم داکرایز کردن یک وبسایت که به کمک این دو فریم‌ورک نوشته شده را انجام دهیم.

قبل از نوشتن Dockerfile ما دو فایل دیگر هم آماده می‌کنیم تا هنگام بیلد ایمیج از آن استفاده کنیم؛ یکی تنظیمات وب سرور apache2 و دیگری یک اسکریپت شل برای اجرای دستورات لازم قبل از اجرای برنامه. در نتیجه ۳ مرحله را طی خواهیم کرد:‌

۱- نوشتن کانفیگ وب سرور apache2

۲- نوشتن شل اسکریپت برای اجرای دستورات

۳- نوشتن داکرفایل

نوشتن کانفیگ وب سرور apache2

ابتدا یک فایل با نام vhost.conf درست می‌کنیم (هر نامی می‌توان برای آن انتخاب کرد فقط دقت کنید در داکرفایل هم آن را تغییر دهید). محتویات آن به شکل زیر است:

<VirtualHost *:80>
DocumentRoot /var/www/html/public

<Directory "/var/www/html/public">
AllowOverride all
Require all granted
Options Indexes FollowSymLinks MultiViews ExecCGI

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/index.php$
RewriteRule . /index.php [L]
</Directory>

ErrorLog /dev/stderr
CustomLog /dev/stdout combined
</VirtualHost>

در این فایل یک virtual host را تعریف می‌کنیم که روی پورت 80 گوش می‌کند. در apache2 هر virtual host بیانگر یک سایت است. در خط بعدی محل اصلی serve شدن فایل‌ها یا روت را نوشتیم که /var/www/html/public است. یعنی apache2 در این مسیر به دنبال فایل‌هایی که درخواست می‌شوند می‌گردد. در خط بعدی تعریف یک directory را شروع می‌کنیم تا تنظیمات بیشتری در مورد روت اعمال کنیم. خطوط بعدی تنظیماتی کلی را اعمال می‌کنند. از جمله Require all granted دسترسی همه‌ی آدرس‌ها به سرور را می‌دهد و Options که تعدادی ویژگی را برای این مسیر فعال می‌کند. از خط بعدی کار rewrite کردن مسیرها را شروع می‌کنیم. یعنی مسیر درخواست‌ها را تغییر می‌دهیم؛ زیرا لاراول تمام درخواست‌ها را در index.php جواب می‌دهد و اگر خارج از آن درخواستی بدهیم خطای 404 می‌گیریم. برای این کار ابتدا ماژول rewrite را روشن می‌کنیم. سپس شرطی می‌گذاریم که اگر درخواست به خود /index.php نبود آن را به /index.php بفرستد. حرف L هم در انتها به این معنی است که در صورت درست بودن شرط فوق، این آخرین چیزی است که بررسی می‌شود و سراغ بعدی‌ها نمی‌رود. در این‌جا تعریف Directory به پایان می‌رسد. در دو خط نهایی VirtualHost هم محل نوشته شدن لاگ‌ خطا و دسترسی مشخص شده‌اند.

نوشتن شل اسکریپت

قبل از اجرای برنامه‌ی اصلی معمولا لازم داریم تعدادی دستور اجرا کنیم. این دستورات را در قالب یک فایل شل به نام docker-entrypoint.sh می‌نویسیم و در انتهای داکرفایل آن را اجرا می‌کنیم. دستورات آن به شکل زیر است:

php artisan migrate
php artisan storage:link
php artisan config:cache
php artisan route:cache
apache2-foreground

در اینجا تعدادی دستور به کمک artisan، که CLI مختص لاراول است، اجرا می‌کنیم و در نهایت وب سرور apache2 را راه‌اندازی می‌کنیم. دستورات artisan به ترتیب کارهای زیر را انجام می‌دهند:

  • انتقال اطلاعات ساخت جدول‌ها به دیتابیس یا تغییرات آن
  • ایجاد symbolic link در پوشه‌ی public/storage به پوشه‌ی storage/app/public برای این که بتوان فایل‌های storage/app/public را با کاربران به اشتراک گذاشت
  • کش کردن تنظیمات در یک فایل برای دسترسی سریع‌تر به آن
  • ایجاد یک کش از تمام routeهای نوشته‌شده

در صورت نیاز می‌توانید دستورات دیگری هم به آن اضافه کنید. در نهایت دستور آخر وب‌سرور apache2 را اجرا می‌کند.

نوشتن داکرفایل

در این قسمت بیلد چند مرحله‌ای انجام می‌دهیم. برای مطالعه‌ی بیشتر در این مورد می‌توانید به توضیحات آن در سایت داکر مراجعه کنید. داکرفایل به این شکل است:

FROM php:7.4-apache as laravel_base

RUN apt-get update && apt-get install -y \
git \
zip \
curl \
sudo \
unzip \
libicu-dev \
libbz2-dev \
libpng-dev \
libjpeg-dev \
libmcrypt-dev \
libreadline-dev \
libfreetype6-dev \
g++


RUN docker-php-ext-install \
bz2 \
intl \
iconv \
bcmath \
opcache \
calendar \
pdo_mysql

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
COPY . /var/www/tmp
RUN cd /var/www/tmp && composer install --no-dev

FROM node:14 as node_dependencies
WORKDIR /var/www/html
COPY --from=laravel_base /var/www/tmp /var/www/html
RUN npm install && \
npm run production && \
rm -rf node_modules

FROM laravel_base
RUN a2enmod rewrite
COPY --from=node_dependencies --chown=www-data:www-data /var/www/html/ /var/www/html/
COPY ./vhost.conf /etc/apache2/sites-available/000-default.conf
RUN chmod +x /var/www/html/docker-entrypoint.sh
ENTRYPOINT [ "./docker-entrypoint.sh" ]

در این فایل سه مرحله داریم (سه بار از FROM استفاده شده است). ابتدا فرایند بیلد فایل‌های php، سپس فایل‌های vue.js و در نهایت ادغام این دو و اجرای docker-entrypoint.sh را داریم. در ادامه به توضیح هر کدام می‌پردازیم:

  • در قسمت اول از ایمیج php با تگ 7.4-apache استفاده کردیم. با دو دستور RUN بعدی تعدادی ابزار نصب می‌شوند. سپس از آخرین نسخه‌ی ایمیج composer استفاده می‌کنیم و composer را نصب می‌کنیم. سپس به کمک آن dependencyهای وبسایت را نصب می‌کنیم.

  • در بخش بعدی نسخه‌ی 14 ایمیج node را انتخاب کردیم. بعد از آن فایل‌های موجود در ایمیج قبلی را به اینجا منتقل کرده، نیازمندی‌های پروژه را نصب می‌کنیم و فایل‌های لازم را هم برای فرانت می‌سازیم. در نهایت پوشه‌ی node_modules را پاک می‌کنیم تا حجم ایمیج کمتر شود.

  • بخش آخر از همان ایمیج اول استفاده کرده و ماژول rewrite را در apache2 فعال می‌کنیم. سپس فایل‌های ساخته شده در ایمیج قبلی را به این ایمیج منتقل می‌کنیم. این فایل‌ها دیگر کامل هستند. الان هم vue و هم لاراول آماده‌ی دیپلوی هستند. فایل تنظیمات apache2 را به مکان مناسب کپی می‌کنیم و به  docker-entrypoint.sh دسترسی اجرایی می‌دهیم. در آخر می‌گوییم موقع اجرا این فایل را اجرا کند.

توجه داشته باشید که در این آموزش فریم‌ورک Vue.js به عنوان مثال گفته شده است و دیگر فریم‌ورک‌ها را هم شامل می‌شود.