اوبنتوداکرسرورلینوکس

آموزش نصب و راه‌اندازی لاراول با Docker Compose در اوبونتو 24.04

مقدمه کانتینری کردن (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 را به دایرکتوری خانه خود دانلود کنید:

bash
cd ~
curl -L https://github.com/parmincloud/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip

برای باز کردن فایل زیپ به دستور unzip نیاز داریم. در صورت نصب نبودن، آن را نصب کنید:

bash
sudo apt update
sudo apt install unzip

اکنون محتویات اپلیکیشن را استخراج کرده و نام دایرکتوری را برای دسترسی آسان‌تر تغییر دهید:

bash
unzip travellist.zip
mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo

به دایرکتوری travellist-demo بروید:

bash
cd travellist-demo

مرحله ۲ — تنظیم فایل .env اپلیکیشن

فایل‌های پیکربندی لاراول در دایرکتوری به نام config در مسیر ریشه اپلیکیشن قرار دارند. علاوه بر این، از یک فایل .env برای تنظیم پیکربندی‌های وابسته به محیط (مانند اعتبارنامه‌های دیتابیس و کلیدهای امنیتی) استفاده می‌شود.

هشدار: فایل پیکربندی محیط (Environment) حاوی اطلاعات حساسی درباره سرور شما از جمله اطلاعات دیتابیس و کلیدهای امنیتی است. به همین دلیل، هرگز این فایل را به صورت عمومی به اشتراک نگذارید.

مقادیر موجود در فایل .env بر مقادیر تنظیم شده در فایل‌های پیکربندی معمولی در دایرکتوری config اولویت دارند.

اکنون یک فایل .env جدید ایجاد می‌کنیم. لاراول با یک فایل .env.example ارائه می‌شود که می‌توانیم برای ساخت فایل خود از آن کپی بگیریم:

bash
cp .env.example .env

این فایل را با ویرایشگر متن خود باز کنید:

bash
nano .env

فایل .env فعلی تنظیماتی برای استفاده از دیتابیس محلی MySQL با آدرس 127.0.0.1 دارد. باید متغیر DB_HOST را به گونه‌ای تغییر دهیم که به سرویس دیتابیس که در محیط داکر ما ایجاد خواهد شد اشاره کند. در این راهنما، نام سرویس دیتابیس را db می‌گذاریم. مقدار DB_HOST را به db تغییر دهید:

.env

env
APP_NAME=Travellist
APP_ENV=dev
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost:8000
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password

در صورت تمایل می‌توانید نام دیتابیس، نام کاربری و رمز عبور را نیز تغییر دهید. این متغیرها در مرحله بعد برای پیکربندی فایل docker-compose.yml استفاده می‌شوند. پس از پایان ویرایش، فایل را ذخیره کرده و ببندید.


مرحله ۳ — تنظیم Dockerfile اپلیکیشن

اگرچه سرویس‌های MySQL و Nginx ما بر اساس ایمیج‌های پیش‌فرض موجود در Docker Hub (که از طریق میرور پارمین کلود دریافت می‌شوند) اجرا می‌شوند، اما همچنان باید یک ایمیج سفارشی برای کانتینر اپلیکیشن بسازیم.

ایمیج ما بر پایه ایمیج رسمی php:8.2-fpm خواهد بود. در کنار این محیط PHP-FPM، چند ماژول اضافی PHP و ابزار مدیریت وابستگی‌ها یعنی Composer را نصب می‌کنیم.

همچنین یک کاربر سیستم جدید ایجاد می‌کنیم تا بتوانیم دستورات artisan و composer را در حین توسعه اجرا کنیم. تنظیم uid باعث می‌شود کاربر داخل کانتینر همان شناسه کاربری (uid) کاربر شما در سیستم میزبان را داشته باشد. به این ترتیب، هر فایلی که توسط این دستورات ایجاد می‌شود با دسترسی‌های صحیح در سیستم میزبان نیز بازتاب پیدا می‌کند.

یک Dockerfile جدید ایجاد کنید:

bash
nano Dockerfile

محتوای زیر را در آن کپی کنید:

Dockerfile

dockerfile
FROM hub.cr.parmincloud.ir/php:8.2-fpm
# Arguments defined in docker-compose.yml
ARG user
ARG uid
# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# Get latest Composer
COPY –from=hub.cr.parmincloud.ir/composer:latest /usr/bin/composer /usr/bin/composer
# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user
# Set working directory
WORKDIR /var/www
USER $user

فایل را ذخیره کنید. این Dockerfile با تعریف ایمیج پایه شروع می‌شود، پکیج‌های سیستم و اکستنشن‌های PHP را نصب می‌کند، سپس Composer را از ایمیج رسمی آن کپی می‌کند و در نهایت یک کاربر سیستم با استفاده از آرگومان‌های پاس داده شده ایجاد می‌کند.


مرحله ۴ — تنظیم پیکربندی Nginx و فایل‌های دیتابیس

هنگام ایجاد محیط‌های توسعه با Docker Compose، اغلب لازم است فایل‌های پیکربندی یا راه‌اندازی را با کانتینرهای سرویس به اشتراک بگذاریم.

برای تنظیم Nginx، یک فایل به نام travellist.conf ایجاد می‌کنیم. دایرکتوری مربوطه را بسازید:

bash
mkdir -p docker-compose/nginx

فایل پیکربندی را باز کنید:

bash
nano docker-compose/nginx/travellist.conf

تنظیمات زیر را در آن قرار دهید:

docker-compose/nginx/travellist.conf

nginx
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/public;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}

این فایل Nginx را برای گوش دادن به پورت 80 و استفاده از index.php تنظیم می‌کند. فایل را ذخیره و ببندید.

برای راه‌اندازی دیتابیس MySQL، یک فایل دامپ (Dump) به اشتراک می‌گذاریم که هنگام راه‌اندازی کانتینر وارد (Import) می‌شود. دایرکتوری مربوطه را بسازید:

bash
mkdir docker-compose/mysql

یک فایل .sql ایجاد کنید:

bash
nano docker-compose/mysql/init_db.sql

کد زیر را در آن قرار دهید:

docker-compose/mysql/db_init.sql

sql
DROP TABLE IF EXISTS `places`;
CREATE TABLE `places` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`visited` tinyint(1) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `places` (name, visited) VALUES (‘Berlin’,0),(‘Budapest’,0),(‘Cincinnati’,1),(‘Denver’,0),(‘Helsinki’,0),(‘Lisbon’,0),(‘Moscow’,1),(‘Nairobi’,0),(‘Oslo’,1),(‘Rio’,0),(‘Tokyo’,0);

این کد یک جدول به نام places ایجاد کرده و آن را با داده‌های نمونه پر می‌کند. فایل را ذخیره و ببندید.


مرحله ۵ — ایجاد محیط چندکانتینری با Docker Compose

Docker Compose به شما اجازه می‌دهد محیط‌های چندکانتینری ایجاد کنید. در این بخش فایل docker-compose.yml را می‌سازیم. این فایل در ریشه اپلیکیشن قرار می‌گیرد.

سه سرویس app، db و nginx را تعریف خواهیم کرد. فایل‌های اپلیکیشن از طریق Bind Mounts در سرویس‌های app و nginx همگام‌سازی می‌شوند که برای توسعه بسیار مفید است.

فایل docker-compose.yml را ایجاد کنید:

bash
nano docker-compose.yml

محتوای زیر را در آن قرار دهید (دقت کنید که ایمیج‌ها از میرور پارمین کلود دریافت می‌شوند):

docker-compose.yml

yaml
services:
app:
build:
args:
user: sammy
uid: 1000
context: ./
dockerfile: Dockerfile
image: travellist
container_name: travellist-app
restart: unless-stopped
working_dir: /var/www/
volumes:
– ./:/var/www
networks:
– travellist
db:
image: hub.cr.parmincloud.ir/mysql:8.0
container_name: travellist-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
– ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
– travellist
nginx:
image: hub.cr.parmincloud.ir/nginx:alpine
container_name: travellist-nginx
restart: unless-stopped
ports:
– 8000:80
volumes:
– ./:/var/www
– ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
– travellist
networks:
travellist:
driver: bridge

فایل را ذخیره کنید. (نسخه‌های جدید Docker Compose نیازی به تعیین version در ابتدای فایل ندارند).


مرحله ۶ — اجرای اپلیکیشن با Docker Compose

اکنون از دستورات Docker Compose برای ساخت ایمیج اپلیکیشن و اجرای سرویس‌ها استفاده می‌کنیم.

ایمیج app را بسازید:

bash
docker compose build app

این دستور ممکن است چند دقیقه طول بکشد. پس از تکمیل، محیط را در حالت پس‌زمینه اجرا کنید:

bash
docker compose up -d

برای نمایش وضعیت سرویس‌های فعال:

bash
docker compose ps

خروجی باید نشان دهد که سه کانتینر travellist-app، travellist-db و travellist-nginx در حال اجرا (Up) هستند.

اکنون باید وابستگی‌های لاراول را با Composer نصب کنیم:

bash
docker compose exec app composer install

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

bash
docker compose exec app php artisan key:generate

خروجی Application key set successfully. را نشان می‌دهد.

اکنون می‌توانید مرورگر خود را باز کرده و از طریق پورت 8000 به سرور دسترسی پیدا کنید:

http://server_domain_or_IP:8000

اگر این دمو را روی سیستم محلی (Local) خود اجرا می‌کنید، از آدرس http://localhost:8000 استفاده کنید. شما باید صفحه اصلی اپلیکیشن دموی Travellist را مشاهده کنید.

برای مشاهده لاگ‌های سرویس Nginx می‌توانید از دستور زیر استفاده کنید:

bash
docker compose logs nginx

اگر می‌خواهید محیط Docker Compose را متوقف کنید اما وضعیت کانتینرها را حفظ کنید:

bash
docker compose pause

برای از سرگیری سرویس‌ها:

bash
docker compose unpause

برای خاموش کردن کامل محیط و حذف کانتینرها، شبکه‌ها و Volume ها:

bash
docker compose down

نتیجه‌گیری در این راهنما، ما یک محیط داکر با سه کانتینر را با استفاده از Docker Compose برای تعریف زیرساخت در یک فایل YAML راه‌اندازی کردیم. از این به بعد، می‌توانید روی اپلیکیشن لاراول خود کار کنید بدون اینکه نیاز به نصب و راه‌اندازی یک وب‌سرور محلی برای توسعه و تست داشته باشید. علاوه بر این، شما با یک محیط قابل حذف و بازسازی کار می‌کنید که می‌تواند به راحتی در هنگام توسعه اپلیکیشن و همچنین انتقال به محیط پروداکشن مفید باشد.

از همراهی شما با پارمین کلود سپاسگزاریم.

نوشته های مشابه

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

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

دکمه بازگشت به بالا