Docker برای Laravel — از صفر تا اجرای پروژه در container
مقدمه Docker برای Laravel: image و container، Dockerfile برای PHP 8.3، mount پروژه و اجرای artisan — و اینکه کی سراغ Sail یا Docker Compose بروید.
«روی سیستم من کار میکرد» با Docker کمتر تکرار میشود — همان PHP، extension و نسخه برای همه. این مقاله مقدمه است: مفاهیم پایه Docker، ساخت یک image ساده برای Laravel و اجرای پروژه در یک container. اگر دنبال راهاندازی کامل پروژه با MySQL، Redis و Nginx هستید، مستقیم سراغ نصب لاراول با Docker Compose بروید.
تفاوت image و container
- Image — قالب ثابت و فقطخواندنی که از روی Dockerfile ساخته میشود (PHP، اکستنشنها، ابزارها)
- Container — نمونه در حال اجرای یک image؛ میتوانید چند container از یک image داشته باشید
- Volume / mount — اتصال پوشهای از سیستم شما به داخل container، تا تغییر کد بدون build دوباره دیده شود
Docker، Sail یا Docker Compose — کدام؟
- یک container (همین مقاله): برای یادگیری Docker و اجرای سریع پروژه با SQLite پیشفرض Laravel 12.
- Laravel Sail: Compose آماده و رسمی Laravel با دستورهای کوتاه؛ سریعترین راه برای کار روزمره.
- Docker Compose دستی: وقتی MySQL، Redis، Nginx و queue worker میخواهید و کنترل کامل روی سرویسها لازم دارید — راهنمای گامبهگامش در مقاله Docker Compose آمده است.
نصب Docker
Windows: Docker Desktop + WSL2. Linux: docker.io یا Docker CE. بعد از نصب:
docker --version
docker run hello-world
Dockerfile پایه Laravel برای توسعه
این فایل را با نام Dockerfile در ریشه پروژه Laravel بگذارید:
FROM php:8.3-cli
RUN apt-get update && apt-get install -y \
git unzip libzip-dev libpng-dev \
&& docker-php-ext-install pdo_mysql zip gd \
&& rm -rf /var/lib/apt/lists/*
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www
CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"]
کد پروژه داخل image کپی نمیشود؛ در مرحله بعد با mount به container وصل میشود. --host=0.0.0.0 لازم است تا سرور از بیرون container در دسترس باشد. Laravel 12 به PHP 8.2 یا بالاتر نیاز دارد.
build و run
docker build -t my-laravel .
docker run --rm -v ${PWD}:/var/www my-laravel composer install
docker run -p 8000:8000 -v ${PWD}:/var/www my-laravel
-v پوشه پروژه را روی /var/www mount میکند؛ هر تغییری در کد بدون build دوباره دیده میشود. چون mount کل /var/www را میپوشاند، vendor باید در خود پوشه پروژه باشد — برای همین composer install را یکبار داخل container اجرا میکنیم. ${PWD} در PowerShell و bash کار میکند؛ در cmd ویندوز بهجایش %cd% بنویسید. حالا http://localhost:8000 را باز کنید.
اجرای artisan در container
docker run --rm -v ${PWD}:/var/www my-laravel php artisan migrate
با SQLite پیشفرض Laravel 12 این دستور بدون سرور دیتابیس جدا کار میکند. برای MySQL و Redis باید چند container کنار هم اجرا شوند — کاری که Docker Compose انجام میدهد.
.dockerignore
node_modules
vendor
.git
.env
storage/logs/*
bootstrap/cache/*
این فایل وقتی مهم میشود که کد را داخل image کپی میکنید (مثلاً برای production)؛ context کوچکتر یعنی build سریعتر و نرفتن .env به داخل image.
Laravel Sail
راه رسمی Laravel — Docker Compose از پیش تنظیم. با composer require laravel/sail --dev و php artisan sail:install نصب میشود و با ./vendor/bin/sail up بالا میآید. اگر از صفر یاد میگیرید، Dockerfile دستی درک عمیقتری میدهد؛ Sail سرعت کار روزمره را.
اشتباهات
- ذخیره .env در image
- mount کردن پروژه روی imageی که vendor داخلش نصب شده — mount آن را میپوشاند و خطای «vendor/autoload.php not found» میگیرید
- اجرای
artisan serveبدون--host=0.0.0.0و باز نشدن صفحه از مرورگر - استفاده از
artisan serveدر production — آنجا PHP-FPM و Nginx لازم است (کانفیگ Nginx) - اجرای container با کاربر root بدون دلیل در production
جمعبندی
حالا مفهوم image، container و mount را میدانید و پروژه Laravel را در یک container اجرا کردهاید. گام بعد: نصب لاراول با Docker Compose همراه با MySQL، Redis و Nginx. برای انتشار روی سرور: Deploy روی Ubuntu.