این راهنما توسط دیدگاه تهیه شده و هدف آن ارائه یک آموزش کامل، کاربردی و در عین حال ساده برای راهاندازی فریمورک Laravel با استفاده از Docker Compose روی Ubuntu 22.04 است. اگر میخواهید محیط توسعهای استاندارد، قابل تکرار و نزدیک به محیط production داشته باشید، جای درستی آمدهاید.
مقدمه
کانتینرسازی یا Containerization یعنی اجرای یک برنامه بههمراه تمام وابستگیهایش داخل محیطهای ایزولهای به نام کانتینر. نتیجه؟
-
محیط توسعه همه اعضای تیم یکی میشود
-
دیگر خبری از «روی سیستم من کار میکنه» نیست
-
توسعه، تست و دیپلوی سادهتر و قابل پیشبینیتر میشود
در این آموزش، با استفاده از Docker Compose یک پروژه Laravel را در قالب سه سرویس جداگانه اجرا میکنیم:
-
app: شامل PHP 7.4 (PHP-FPM)
-
db: دیتابیس MySQL 8
-
nginx: وبسرور برای ارائه اپلیکیشن
فایلهای پروژه بین سیستم شما و کانتینرها سینک میشوند تا توسعه راحت و سریع باشد.
پیشنیازها
قبل از شروع، مطمئن شوید موارد زیر را دارید:
-
Ubuntu 22.04 (لوکال یا سرور)
-
دسترسی sudo
-
Docker نصبشده
-
Docker Compose نصبشده
پیشنهاد دیدگاه: اگر روی سرور کار میکنید، حتما فایروال فعال باشد.
مرحله ۱: دریافت پروژه نمونه Laravel
ابتدا یک پروژه دمو Laravel را از GitHub دریافت میکنیم:
cd ~
curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zipنصب unzip و استخراج فایلها:
sudo apt update
sudo apt install unzip
unzip travellist.zip
mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo
cd travellist-demoمرحله ۲: تنظیم فایل .env
فایل .env محل تنظیمات وابسته به محیط است و نباید عمومی شود.
ساخت فایل:
cp .env.example .env
nano .envتنظیمات دیتابیس را به شکل زیر تغییر دهید:
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=passwordدر اینجا db همان نام سرویس دیتابیس در Docker Compose است.
مرحله ۳: ساخت Dockerfile برای Laravel
برای اجرای Laravel به یک ایمیج اختصاصی PHP نیاز داریم.
ایجاد فایل Dockerfile:
nano Dockerfileمحتوا:
FROM php:7.4-fpm
ARG user
ARG uid
RUN apt-get update && apt-get install -y \
git curl zip unzip libpng-dev libonig-dev libxml2-dev
RUN docker-php-ext-install pdo_mysql mbstring bcmath gd
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && chown -R $user:$user /home/$user
WORKDIR /var/www
USER $userاین Dockerfile:
-
PHP-FPM را اجرا میکند
-
اکستنشنهای لازم Laravel را نصب میکند
-
Composer را اضافه میکند
-
مشکل permission را از ریشه حل میکند
مرحله ۴: تنظیم Nginx و دیتابیس
تنظیم Nginx
mkdir -p docker-compose/nginx
nano docker-compose/nginx/travellist.confکانفیگ:
server {
listen 80;
root /var/www/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}تنظیم دیتابیس اولیه
mkdir docker-compose/mysql
nano docker-compose/mysql/init_db.sql(ایجاد جدول نمونه places برای تست اپلیکیشن)
مرحله ۵: ساخت docker-compose.yml
nano docker-compose.ymlساختار نهایی:
version: "3.9"
services:
app:
build:
context: .
dockerfile: Dockerfile
args:
user: sammy
uid: 1000
volumes:
- ./:/var/www
networks:
- travellist
db:
image: mysql:8.0
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
- travellist
nginx:
image: nginx:alpine
ports:
- "8000:80"
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d
networks:
- travellist
networks:
travellist:
driver: bridgeمرحله ۶: اجرای پروژه
docker compose build app
docker compose up -d
docker compose psسپس در مرورگر:
http://localhost:8000اگر صفحه Laravel را دیدید، همهچیز درست است.
نصب وابستگیها و کلید Laravel
docker compose exec app composer install
docker compose exec app php artisan key:generateرفع مشکل Permission در Laravel
docker compose exec app chown -R sammy:sammy storage bootstrap/cache
docker compose exec app chmod -R 775 storage bootstrap/cacheاین مرحله بسیار مهم است و جلوی خطاهای رایج Laravel را میگیرد.
استفاده از docker-compose.override.yml
برای جدا کردن محیط توسعه و production، از override استفاده کنید.
-
توسعه: bind mount + debug
-
production: image آماده + volume
این روش، تمیزترین و حرفهایترین ساختار ممکن است.
جمعبندی دیدگاه
با این ساختار:
-
محیط شما استاندارد و قابل تکرار است
-
توسعه و دیپلوی سریعتر میشود
-
مشکلات permission و dependency حذف میشوند
-
آماده مقیاسپذیری هستید
این دقیقاً همان روشی است که دیدگاه برای پروژههای حرفهای Laravel پیشنهاد میدهد.
موفق باشید 🚀

