این راهنما توسط دیدگاه تهیه شده و هدف آن ارائه یک آموزش کامل، کاربردی و در عین حال ساده برای راهاندازی فریمورک Laravel با استفاده از Docker Compose روی Ubuntu 22.04 است. اگر میخواهید محیط توسعهای استاندارد، قابل تکرار و نزدیک به محیط production داشته باشید، جای درستی آمدهاید.
مقدمه
کانتینرسازی یا Containerization یعنی اجرای یک برنامه بههمراه تمام وابستگیهایش داخل محیطهای ایزولهای به نام کانتینر. نتیجه؟
برای آشنایی با سایر فریمورکهای محبوب PHP نیز میتوانید این مقاله را ببینید.
-
محیط توسعه همه اعضای تیم یکی میشود
-
دیگر خبری از «روی سیستم من کار میکنه» نیست
-
توسعه، تست و دیپلوی سادهتر و قابل پیشبینیتر میشود
در این آموزش، با استفاده از Docker Compose یک پروژه Laravel را در قالب سه سرویس جداگانه اجرا میکنیم:
-
app: شامل PHP 7.4 (PHP-FPM)
-
db: دیتابیس MySQL 8
-
nginx: وبسرور برای ارائه اپلیکیشن
فایلهای پروژه بین سیستم شما و کانتینرها سینک میشوند تا توسعه راحت و سریع باشد.
پیشنیازها
قبل از شروع، مطمئن شوید موارد زیر را دارید:
برای راهنمای کاملتر نصب Docker، آموزش نصب Docker روی اوبونتو را نیز مطالعه کنید.
-
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 پیشنهاد میدهد.
موفق باشید 🚀
برای راهاندازی سایر پروژههای محبوب با Docker Compose نیز میتوانید نصب وردپرس با Docker Compose را ببینید.
