مقدمة

إن التطبيقات الحديثة على الشبكة نادرا ما تكون عملية واحدة واحدة، بل هي تتألف من خدمات تعاون متعددة: مقدمة، وقاعدة بيانات، وقائمة على الرسائل، وقائمة على أساس التنبيه، وقائمة على أساس التعبئة، وقائمة على أساس التعددية، ودليل عمل واحد، ودليل على مدى الحياة لكل حاوية، وربطها الشبكي، وأجهزة الاعتماد عليها، تصبح سريعة عرضة للخطأ وتستهلك الوقت.

الشروط المسبقة

قبل الغوص، ضمان أن تكون لديك ما يلي على نظامك:

  • Docker Engine] (version 20.10 or newer) -- ]Install Docker]
  • Docker Compose] (V2 is now integrated into Docker CLI; verify with ]Install Docker Compose]
  • Basic familiarity] with terminal commands and YAML syntax.

على الإختيار، لديك اسم ميداني يشير إلى خادمك إذا كنت تخطط لمتابعة قسم تشكيلة SSL.

Understanding Docker Compose in Depth

(ج) إن مركب دوكر ليس مجرد ملف " مهر " بسيط، بل هو أداة توضيحية تتيح لك تحديد الخدمات والشبكات والأحجام والمتغيرات البيئية، وسياسات استئناف العمل، وعمليات الفحص الصحي في ملف واحد يسمى .

الخدمات

وكل صورة حاوية وموانئها وأحجامها وبيئتها ومعاليها محددة في إطار مفتاح ، ويمكن أن تتواصل الخدمات مع بعضها البعض عن طريق شبكة جسر مخصصة تخلقها الشركة تلقائيا، وهذا يعني أنكم لا تحتاجون أبدا إلى فتح موانئ للتواصل فيما بين الخدمات - بل تحتاج إلى عرض الموانئ على العالم الخارجي.

الشبكات

وبحسب التقصير، تخلق الشركة شبكة واحدة لجميع الخدمات، مما يتيح لها اكتشاف خدمات قائمة على النظم الوطنية لسواتل الملاحة باستخدام اسم الخدمة كإسم المضيف، مثلا، يمكن أن تصل خدمات أخرى إلى خدمة تحمل اسم ، ببساطة بوصفها ويمكن أيضا تحديد شبكات العرف للعزلة - مثلا، وضع الوكيل العكسي على شبكة داخلية للتشغيل العام، وحفظ حاويات قواعد البيانات في شبكة داخلية.

networks:
 frontend:
 backend:
services:
 nginx:
 networks:
 - frontend
 app:
 networks:
 - frontend
 - backend
 db:
 networks:
 - backend

المجلدات

فالأعداد هي الآلية المفضلة لاستمرار البيانات التي تنتجها حاويات دوكر، وفي المجموع، يمكنك أن تعلن عن مجلدات اسمها على أعلى مستوى وتضعها في الخدمات، وهذا أمر أساسي لقواعد البيانات، وشحن الملفات، وأي خدمة حكومية.

volumes:
 db_data:
services:
 postgres:
 image: postgres:16
 volumes:
 - db_data:/var/lib/postgresql/data

جيم - التغيرات البيئية

(ب) التكوين الخارجي باستخدام متغيرات البيئة، يمكنك أن تضغط عليها في ملف شركة كبس من أجل التنمية، ولكن من أجل الإنتاج، يجب أن تستخدم ملفات أو أسرار دوكر، وتجمع تلقائياً ملف يقع في الدليل نفسه إذا لم تحدد .

services:
 api:
 image: my-api:latest
 env_file:
 - ./api.env
 environment:
 - NODE_ENV=production

"تضليل "نجريكس كـ "مُتعاكس مُتقدّم

(نجينكس) يلمع كبديل عكسي بسبب ارتفاع أدائه، وانخفاض بصمة الذاكرة، وتركيب خاصية غنية، وفي هيكل متعدد الحاويات، يجلس نجنس على الحافة، ويقبل طلبات العملاء، ويحيلها إلى الخدمة المناسبة بناء على طلب من معهد البحوث والبحوث، أو رؤساء الهيئات، أو حتى محتوى الجسم، ويمكنه أيضا معالجة مسألة إنهاء الخدمة في القطاع الخاص، والاختبار، والحد من المعدل، والموازنة بين الحمل.

التصريف العكسي الأساسي مع المنافذ المتعددة

وهنا تشكيلة أكثر اكتمالا تبين كيفية تقسيم حركة المرور بين طلبين مختلفين، بما في ذلك معالجة الأصول الثابتة وشبكة ويب سوكيتس:

upstream app1_upstream {
 server app1:8000;
}

upstream app2_upstream {
 server app2:8001;
}

server {
 listen 80;
 server_name example.com;
 return 301 https://$server_name$request_uri;
}

server {
 listen 443 ssl http2;
 server_name example.com;

 ssl_certificate /etc/nginx/certs/fullchain.pem;
 ssl_certificate_key /etc/nginx/certs/privkey.pem;

 # Security headers
 add_header X-Frame-Options "SAMEORIGIN" always;
 add_header X-Content-Type-Options "nosniff" always;
 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

 # App 1 – main web frontend
 location / {
 proxy_pass http://app1_upstream;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto $scheme;
 }

 # App 2 – admin dashboard
 location /admin/ {
 proxy_pass http://app2_upstream/;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 }

 # WebSocket support (e.g., for live updates)
 location /ws/ {
 proxy_pass http://app1_upstream;
 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade";
 }

 # Static assets – serve directly for better performance
 location /static/ {
 alias /var/www/static/;
 expires 30d;
 add_header Cache-Control "public, immutable";
 }
}

لاحظوا استخدام قطع ]، مما يسمح لكم بتحديد مجموعة من الخواديم لموازنة الحمولة، وحتى مع خادم واحد، باستخدام مجموعة من المجرى المائي، يجعل من السهل إضافة المزيد من النسخ لاحقا دون لمس كتلة الخواديم.

SSL/TLS مع دعونا مشفرة

For production, serving HTTPS is non-negotiable. You can automate certificate renewal using Certbot or acme.sh] inside a sidecar container. A common pattern is to mount the certificates as volumes into the Nginx container.

services:
 nginx:
 image: nginx:alpine
 volumes:
 - ./nginx.conf:/etc/nginx/conf.d/default.conf
 - ./certs:/etc/nginx/certs:ro
 - ./static:/var/www/static:ro
 ports:
 - "80:80"
 - "443:443"
 depends_on:
 - app1
 - app2

وللتجديد التلقائي، يمكنك إضافة حاوية مرافقة مثل أو التي تدير وظيفة مؤقتة وتعيد تحميل نجنس عندما تعاد تجديد الشهادات.

الموازنة بين القرض والفحص الصحي

وعندما تقدم خدمات إلى نسخ متعددة، يمكن لنجيكس أن يوزع الطلبات باستخدام مركب مستديرة، أو أقل الاتصالات، أو IP hash.

upstream api_servers {
 least_conn;
 server api:80 max_fails=3 fail_timeout=30s;
}

ولكشف الحاويات غير الصحية، يمكن تشكيل نجينكس بـ (يتطلب ذلك استخدام الشبكة الوطنية للتبادل الالكتروني للبيانات (NGINX Plus) أو استخدام ) من النسخة المفتوحة المصدر مع تداول صغير) والخيار الأبسط هو الاعتماد على عمليات الفحص الصحية التي يقوم بها دوكر وتسجيل الحاويات التي تمر.

بناء كومة دوكر - مخرج عالمي حقيقي

فلنجمع بين كل شيء في ملف عملي للمجموعات من أجل تطبيق على شبكة الإنترنت يتألف من مدخل للرقم، وقاعدة بيانات للرد، وقاعدة بيانات لنموذج " ساو باولو " ، و " ريديس كيتش " ، وستخدم حاوية نجينكس ملفات ثابتة وطلبات تطبيقات بديلة.

version: "3.9"

services:
 nginx:
 image: nginx:alpine
 container_name: reverse-proxy
 restart: unless-stopped
 volumes:
 - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
 - ./frontend/build:/var/www/frontend:ro
 - ./certs:/etc/nginx/certs:ro
 ports:
 - "80:80"
 - "443:443"
 depends_on:
 - api
 - frontend
 networks:
 - public

 frontend:
 image: my-frontend:latest
 # In production, frontend is built into static files and served by Nginx
 # This container may run a dev server, but Nginx will bypass it for static files
 container_name: frontend-dev
 ports:
 - "3000:3000"
 networks:
 - public
 # healthcheck: ...

 api:
 image: my-api:latest
 container_name: api-server
 restart: unless-stopped
 env_file:
 - ./api/.env.production
 depends_on:
 postgres:
 condition: service_healthy
 redis:
 condition: service_started
 networks:
 - public
 - internal
 healthcheck:
 test: ["CMD", "curl", "-f", "http://localhost:4000/health"]
 interval: 30s
 timeout: 10s
 retries: 3

 postgres:
 image: postgres:16-alpine
 container_name: database
 restart: unless-stopped
 environment:
 POSTGRES_USER: app_user
 POSTGRES_DB: app_db
 POSTGRES_PASSWORD_FILE: /run/secrets/db_password
 volumes:
 - pgdata:/var/lib/postgresql/data
 secrets:
 - db_password
 networks:
 - internal
 healthcheck:
 test: ["CMD-SHELL", "pg_isready -U app_user"]
 interval: 10s
 timeout: 5s
 retries: 5

 redis:
 image: redis:7-alpine
 container_name: cache
 restart: unless-stopped
 volumes:
 - redisdata:/data
 networks:
 - internal
 healthcheck:
 test: ["CMD", "redis-cli", "ping"]
 interval: 10s
 timeout: 3s

volumes:
 pgdata:
 redisdata:

networks:
 public:
 internal:
 internal: true

secrets:
 db_password:
 file: ./secrets/db_password.txt

النقاط الرئيسية في هذا الملف:

  • Network isolation]: تُعرَّف شبكة بأنها ، أي الخدمات المرتبطة بها فقط يمكن أن تتواصل، ولا يمكن الوصول إلى قاعدة البيانات والمخبأ خارج نطاق ولاية دوكر.
  • Secrets]: بيانات حساسة مثل كلمات السر تخزن كأسرار دوكر، وتتكون كملفات داخل الحاوية، وهذا يتفادى تسريبها في متغيرات بيئية يمكن أن تتعرض لها عبر .
  • Health checks]: Services declare health checks so that can wait for the condition . Nginx will start only after the API is healthy.
  • Static assets]: تم تركيب ناتج البناء الأمامي مباشرة إلى نجنس، مما يسمح لنجنس بخدمة الملفات الثابتة دون ضرب خادم الخزينة الأمامية، وهذا يحسن الأداء ويفصل الشواغل.

نشر الطلب - خطوة خطوة

ومع إعداد ملف المركبة وتشكيلة نجيكس، ينطوي النشر على عدد قليل من الأوامر البسيطة، أولا، ضمان وجود جميع ملفات التشكيلات:

project/
├── docker-compose.yml
├── nginx/
│ └── nginx.conf
├── api/
│ └── .env.production
├── frontend/
│ └── build/
├── certs/
│ └── (fullchain.pem, privkey.pem)
└── secrets/
 └── db_password.txt

ثم تشغيل:

docker compose pull # pull latest images
docker compose up -d # start all services in background
docker compose ps # verify services are running
docker compose logs -f # tail logs for all services

بمجرد أن يكتمل كل شيء، ختبر الطلب من خلال زيارة مجالك، تحقق من سجلات نجيكس لتأكيد الطلبات يتم تقريبها بشكل صحيح، إذا كنت بحاجة إلى تحديث متغيرات التشكيل أو البيئة، حرر الملفات ذات الصلة، وبدء التشغيل:

docker compose up -d --no-deps --build nginx # rebuild only nginx if config changed

For zero-downtime deployments, consider using blue-green] or ]rolling updates with Compose’s feature and Nginx upstream health checks.

الجدول الزمني ودرجة الأداء

Docker Compose makes it trivial to scale stateless services like the API:

docker compose up -d --scale api=3

والآن، تجري ثلاث نسخ من حاوية البوليسترال، وسيوزع نجينكس تلقائيا الطلبات فيما بينها، لزيادة تعزيز الأداء:

  • Enable Gzip compression] in Nginx for text-based responses.
  • Set proper cache headers] for static assets (as shown in the example).
  • Usese a CDN] for global delivery of static files.
  • Tune Nginx worker processes] to match CPU cores:
  • Increase connection limits]:

لـ قواعد البيانات، تأكدي من أن لديكِ إتصال في مكتبكِ وفكري في استخدام "بيغ بونسر" كحاوية سيارات جانبية

المسائل المشتركة

حتى مع تركيبة جيدة، الأمور يمكن أن تسوء هنا تعثرات متكررة وكيفية إصلاحها:

  • Container cannot reach another service by name]: check that both services are on the same Docker network. Use to test.
  • Nginx returns 502 Bad Gateway]: قد لا تكون الحاوية فوق المجرى جارية أو لا تستمع إلى الميناء المتوقع، التحقق من ذلك .] وضمان أيضاً أن يشمل البروتوكول والموانئ الصحيحان.
  • Permission errors with volumes]: Files mounted into containers inherit the host’s ownership. Use user namespaces or set the ]] directive in Nginx and the service container.
  • SSL certificate not reneweding]: If using certbot standalone, ensure ports 80 and 443 are not blocked by Nginx during renewal. Use a webroot method or certbot with docker to avoid conflicts.
  • Environmentتغييرات غير محشوة ]: التحقق من ملف في الموقع الصحيح أو استخدام التوجيه على النحو الصحيح، ويمكنك طباعة المجني عليه داخل الحاوية مع .

أفضل الممارسات الأمنية

ويتطلب تشغيل تطبيقات متعددة الحاويات في الإنتاج توخي اليقظة:

  • لا تدير الحاويات كجذر ] ما لم يكن ضرورياً، استخدم التوجيه أو تحديد ] في دوكرفيل.
  • Keep images up to date] with regular vulnerability scanning. Use official base images and bin versions.
  • Restrict network exposure]: Only expose the reverse proxy ports to the internet. All other services should be on internal networks.
  • استخدام الأسرار ] لكلمات السر، مفاتيح API، والودكا.
  • Enable Docker Content Trust] to verify image signatures.
  • Regularly log and audit] container activity using or a centralised logging solution like ELK stack.
  • Apply resource limits] in your Compose file to prevent a single container from hunger others:
services:
 api:
 deploy:
 resources:
 limits:
 cpus: '0.50'
 memory: 256M
 reservations:
 cpus: '0.25'
 memory: 128M

هذه الحدود محترمة عندما تستخدم حزام دوكر؛ بالنسبة للشركة البسيط، يتم إنفاذها مع [على الرغم من أنه من الأفضل استخدام السوار أو K8s لتركيب الإنتاج.

خاتمة

Docker[compose and Nginx together form a powerful, scalable, and maintainable platform for deploying multi-consometainer web applications. By defining your stack in a single YAML file, you achieve environment parity from development to production. Nginx, as a reverse proxy, provides a central point for SSL termination, traffic routing, load balancing, and caching.