أدلة
Docker Compose للإنتاج: دليل إعداد متكامل
كلاود|٢١ يناير ٢٠٢٦|4 دقائق قراءة|٤٤٣ مشاهدة

docker-compose.yml لـ Laravel + Nginx + MySQL + Redis — بيئة إنتاج كاملة. نشرح الملف سطر بسطر.
ما هو Docker Compose؟
Docker Compose أداة لتعريف وتشغيل تطبيقات متعددة الحاويات. بدلاً من تشغيل كل حاوية بأمر docker run منفصل، تكتب ملف YAML واحد يصف كل الحاويات وإعداداتها وشبكاتها — ثم تشغّل الكل بأمر واحد.
لماذا Docker Compose للإنتاج؟
- تعريف البنية كاملة في ملف واحد قابل لإدارة الإصدارات
- تشغيل وإيقاف كل الخدمات بأمر واحد
- إعادة تشغيل تلقائية عند السقوط
- إدارة الشبكات والـ Volumes بشكل منظم
بنية ملف docker-compose.yml
version: '3.8'
services:
# تعريف الخدمات هنا
volumes:
# تعريف الـ Volumes هنا
networks:
# تعريف الشبكات هنا
مثال كامل: تطبيق Laravel للإنتاج
# ملف: docker-compose.yml
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
container_name: laravel-app
restart: unless-stopped
working_dir: /var/www/app
volumes:
- app-storage:/var/www/app/storage
- .env:/var/www/app/.env
networks:
- app-network
depends_on:
- db
- redis
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./docker/nginx/ssl:/etc/nginx/ssl
- app-storage:/var/www/app/storage
networks:
- app-network
depends_on:
- app
db:
image: mysql:8.0
container_name: mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql-data:/var/lib/mysql
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/custom.cnf
networks:
- app-network
ports:
- "127.0.0.1:3306:3306"
redis:
image: redis:7-alpine
container_name: redis
restart: unless-stopped
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- redis-data:/data
networks:
- app-network
queue:
build:
context: .
dockerfile: Dockerfile
container_name: laravel-queue
restart: unless-stopped
command: php artisan queue:work --sleep=3 --tries=3 --max-time=3600
volumes:
- app-storage:/var/www/app/storage
- .env:/var/www/app/.env
networks:
- app-network
depends_on:
- db
- redis
scheduler:
build:
context: .
dockerfile: Dockerfile
container_name: laravel-scheduler
restart: unless-stopped
command: >
sh -c "while true; do php artisan schedule:run --verbose --no-interaction; sleep 60; done"
volumes:
- app-storage:/var/www/app/storage
- .env:/var/www/app/.env
networks:
- app-network
depends_on:
- db
- redis
volumes:
mysql-data:
driver: local
redis-data:
driver: local
app-storage:
driver: local
networks:
app-network:
driver: bridge
إعداد nginx للإنتاج
# ملف: docker/nginx/default.conf
server {
listen 80;
server_name example.com;
root /var/www/app/public;
index index.php;
client_max_body_size 100M;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
location ~ /\.(?!well-known) {
deny all;
}
}
إعدادات MySQL المحسّنة
# ملف: docker/mysql/my.cnf
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
max_connections = 100
slow_query_log = 1
long_query_time = 2
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
أوامر التشغيل والإدارة
# تشغيل جميع الخدمات
docker compose up -d
# إيقاف جميع الخدمات
docker compose down
# إعادة بناء الصور
docker compose build --no-cache
# عرض حالة الخدمات
docker compose ps
# عرض السجلات
docker compose logs -f app
docker compose logs -f --tail=100
# تشغيل أمر داخل حاوية
docker compose exec app php artisan migrate
docker compose exec app php artisan tinker
docker compose exec db mysql -u root -p
النشر والتحديث
سكربت النشر
# ملف: deploy.sh
#!/bin/bash
set -e
echo "سحب آخر التحديثات..."
git pull origin main
echo "بناء الصور..."
docker compose build app
echo "تشغيل المهاجرات..."
docker compose exec app php artisan migrate --force
echo "مسح الكاش..."
docker compose exec app php artisan optimize:clear
docker compose exec app php artisan optimize
echo "إعادة تشغيل الخدمات..."
docker compose up -d --no-deps app queue scheduler
echo "النشر اكتمل بنجاح."
تحديث بدون توقف (Zero-Downtime)
# بناء الصورة الجديدة
docker compose build app
# تشغيل حاوية جديدة مع الاحتفاظ بالقديمة
docker compose up -d --no-deps --scale app=2 app
# انتظر حتى تجهز الحاوية الجديدة
sleep 10
# أوقف الحاوية القديمة
docker compose up -d --no-deps --scale app=1 app
المراقبة والصحة
# إضافة Health Check للحاوية
services:
app:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
مراقبة الموارد
# استخدام الموارد لكل حاوية
docker stats
# حجم القرص
docker system df
النسخ الاحتياطي
# نسخ احتياطي لقاعدة البيانات
docker compose exec db mysqldump -u root -p${DB_ROOT_PASSWORD} ${DB_DATABASE} | gzip > backup_$(date +%Y%m%d).sql.gz
# نسخ احتياطي لـ Volumes
docker run --rm -v mysql-data:/data -v $(pwd):/backup alpine tar czf /backup/mysql-volume-backup.tar.gz /data
التشغيل على كلاود
سيرفرات كلاود (cloud.net.sa) توفر بيئة مثالية لـ Docker Compose في الإنتاج. سيرفر VPS بـ 4 أنوية و 8GB ذاكرة يكفي لتشغيل بنية Laravel كاملة مع nginx و MySQL و Redis.
اطلب خادمك السحابي من كلاود وابدأ بنشر تطبيقك بـ docker compose up -d — جاهز في أقل من دقيقة.
ابدأ الآن
جاهز تبني مشروعك؟ اختر خادمك السحابي بالمواصفات اللي يحتاجها تطبيقك، أو راجع الباقات والأسعار.
مشاركة
