اپ لاراول
مقدمه
لاراول یک فریمورک به زبان 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 به عنوان مثال گفته شده است و دیگر فریمورکها را هم شامل میشود.