Docker Compose برای Laravel — MySQL، Redis و Nginx با هم
یک container Laravel کافی نیست — DB، cache و web server جدا هستند. Docker Compose چند service را در یک فایل تعریف و با docker compose up بالا میآورد. پایه: معرفی Docker.
compose.yaml نمونه
services:
app:
build:
context: .
dockerfile: docker/php/Dockerfile
volumes:
- .:/var/www
depends_on:
- mysql
- redis
networks:
- laravel
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- .:/var/www
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
networks:
- laravel
mysql:
image: mysql:8.0
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: secret
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- laravel
redis:
image: redis:alpine
ports:
- "6379:6379"
networks:
- laravel
networks:
laravel:
volumes:
mysql_data:
.env برای Docker
DB_HOST=mysql
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=secret
REDIS_HOST=redis
CACHE_STORE=redis
QUEUE_CONNECTION=redis
hostname = نام service در compose — نه localhost از داخل app container.
دستورات روزانه
docker compose up -d
docker compose exec app php artisan migrate
docker compose exec app composer install
docker compose logs -f nginx
docker compose down
depends_on و healthcheck
mysql:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
retries: 10
migrate بعد از ready بودن DB — کمتر race condition.
Queue worker در Compose
queue:
build: .
command: php artisan queue:work --sleep=3
depends_on:
- mysql
- redis
volumes:
- .:/var/www
Node/Vite اختیاری
node:
image: node:20-alpine
working_dir: /var/www
volumes:
- .:/var/www
command: npm run dev -- --host
اشتباهات
- DB_HOST=127.0.0.1 داخل app container
- بدون named volume — داده MySQL با down -v پاک
- production compose همان dev بدون hardening
جمعبندی
Compose dev stack کامل. Nginx config: مقاله Nginx. SSL production: Let us Encrypt.