مقاله

Docker برای Laravel — از صفر تا اجرای پروژه در container

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.

Dockerize پروژه

اشتراک‌گذاری