كلاود
أدلة

Docker Compose للإنتاج: دليل إعداد متكامل

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

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 — جاهز في أقل من دقيقة.


ابدأ الآن

جاهز تبني مشروعك؟ اختر خادمك السحابي بالمواصفات اللي يحتاجها تطبيقك، أو راجع الباقات والأسعار.

مشاركة