Loading...

CONTAINER APPS · دراسة حالة

من docker-compose.yml إلى تطبيق مباشر — في اللوحة ومع cdnctl

شرح كامل، قابل للنسخ واللصق، للمطورين الذين يريدون تجربة المنصة بسرعة. نأخذ مشروعًا صغيرًا لكن واقعيًا متعدد الخدمات — API ويب، عامل خلفية، وPostgres + Redis مُدارتان — ونشغّله على CDN.com.tr Managed Containers مباشرة من ملف docker-compose.yml واحد. يُعرض نفس السيناريو بطريقتين: تفاعلي (point-and-click) من لوحة الإدارة، ومن البداية للنهاية مع أداة سطر الأوامر cdnctl. اختر ما تفضّله.

ما ستحصل عليه في النهاية

تطبيقان مُداران (web، worker)، كل منهما مرتبط بإضافة Postgres وRedis مُدارتين، وتطبيق web مباشر على نطاقه الفرعي الخاص https://<uid>.cdn.com.tr — كل ذلك أُنشئ من ملف compose، دون ملفات Dockerfile أو YAML لـKubernetes.

المشروع المثال

تحسب خدمة web الزيارات في Postgres وتخزّن مؤقتًا آخر عدد في Redis؛ أما worker فهي حلقة خلفية بلا منفذ تشارك نفس الإضافات المُدارة. كلتا الصورتين مبنيتان مسبقًا ومدفوعتان إلى سجل يمكن للمنصة سحبه منه (مبنيتان لـlinux/amd64). تحقن المنصة تفاصيل الاتصال تلقائيًا — كودك فقط يقرأ DATABASE_URL وREDIS_URL.

# docker-compose.yml
services:
  web:
    image: mediatriple/compose-demo-web:1.0.0
    ports:
      - "8080:8080"          # container port 8080 is exposed; the host side is ignored
    environment:
      APP_NAME: "Compose Demo"
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://localhost:8080/health"]
    depends_on: [db, cache]

  worker:
    image: mediatriple/compose-demo-worker:1.0.0   # no port -> stays private
    depends_on: [db, cache]

  db:
    image: postgres:16     # -> managed Postgres add-on (DATABASE_URL injected)

  cache:
    image: redis:7         # -> managed Redis add-on (REDIS_URL injected)

كيفية تخطيط الخدمات. تصبح كل خدمة لها صورة مبنية مسبقًا تطبيقًا مُدارًا. الخدمات التي صورتها postgres أو mysql/mariadb أو redis أو nats تصبح إضافات مُدارة وتُربط بكل تطبيق يعتمد عليها (depends_on) — يحصل كل تطبيق مستهلك على نسخته الخاصة من الإضافة، مع حقن بيانات الاعتماد كمتغيرات بيئة (DATABASE_HOST/PORT/NAME/USER، REDIS_URL) وأسرار (DATABASE_PASSWORD، DATABASE_URL). تُرفض خدمة تحتوي على build: (بلا صورة مبنية مسبقًا) — انشر صورة أولاً. بحد أقصى 20 خدمة.

أ · من اللوحة

1 · افتح Container Apps

سجّل الدخول، افتح CDN Accounts، انقر على أيقونة الإعدادات في حسابك واختر تبويب Platforms، ثم Container Apps (اضغط Activate في المرة الأولى). تعرض النظرة العامة حدود باقتك وقائمة تطبيقات فارغة.

نظرة عامة على Container Apps مع حدود باقة مُطبَّقة
نظرة عامة: الحدود المُطبَّقة (تطبيقات / تخزين كائني / Redis / DB)، عدادات الإضافات، وCreate App.

2 · (الصور الخاصة) أضف بيانات اعتماد سجل

إذا كانت صورك خاصة، افتح Create App، وفي صف Private registry credential أضف اسمًا، ورابط السجل (https://index.docker.io/v1/ لـDocker Hub)، واسم المستخدم، ورمز وصول للقراءة فقط، ثم احفظ. يُخزَّن الرمز مشفرًا ولا يُعرض مجددًا أبدًا. الصور العامة لا تحتاج بيانات اعتماد.

نموذج إنشاء تطبيق حاوية مع صف بيانات اعتماد السجل
لوحة Create-App. تبويب Import From Docker Compose بجانب Create؛ بيانات اعتماد السجل تقع فوقه مباشرة.

3 · Import From Docker Compose

انتقل إلى Import From Docker Compose، ثم ارفع أو الصق ملف docker-compose.yml الخاص بك (بحد أقصى 256 كيلوبايت).

نافذة استيراد Docker Compose
الصق ملف compose. تُرفَق بيانات اعتماد السجل المحفوظة للصور الخاصة.
ملف compose ملصق في مربع الاستيراد
ملف compose في مكانه — جاهز للمعاينة.

4 · عاين الخطة

انقر على Preview. تُحلل المنصة الملف وتعرض خطة غير مدمّرة (non-destructive): كل تطبيق ستنشئه، الصورة/المنفذ/عدد النسخ، الإضافات المرتبطة، وأي تحذيرات — دون لمس أي شيء بعد.

خطة معاينة استيراد compose
الخطة: web (منفذ 8080) وworker، كل منهما بإضافة Redis + Postgres. يُشير التحذير إلى أن تعيينات منفذ المضيف (host-port mappings) تُتجاهل — تنشر التطبيقات عبر تدفق النشر/النطاق الخاص بالمنصة.

5 · طبّق، وشاهد النشر

فعّل I have reviewed this plan وانقر على Apply Import. التطبيق إما كل شيء أو لا شيء (all-or-nothing)؛ تُنشأ التطبيقات والإضافات وتوضع عمليات النشر في قائمة الانتظار. خلال دقيقة تنتقل التطبيقات إلى running في قائمة Your apps.

تطبيقا حاوية يعملان بعد الاستيراد
كلا التطبيقين (web وworker) يعملان في قائمة Your apps. افتح تطبيقًا (Manage →) للوصول إلى إضافاته وإجراء Expose on cdn.com.tr.

6 · انشر تطبيق الويب

افتح تطبيق web (Manage →) وانقر على Expose on cdn.com.tr لتوليد نطاق فرعي فوري <uid>.cdn.com.tr (يُتولى HTTPS نيابة عنك). اترك worker خاصًا. هذا كل شيء — مشروع compose الخاص بك مباشر الآن. شاهد النتيجة ↓

ب · من الطرفية (cdnctl)

لكل خطوة أعلاه مكافئ في سطر الأوامر. ثبّت cdnctl، ثم:

1 · سجّل الدخول واعثر على حسابك

cdnctl login --email you@example.com --password '••••••'
cdnctl accounts list                 # copy your account <uuid>

2 · عاين الخطة

نفس الخطة غير المدمّرة كما في اللوحة — تُعيد التطبيقات والإضافات والتحذيرات كـJSON. المعاينة تُعيد فقط مفاتيح env/secret، وليس القيم أبدًا.

cdnctl container compose preview --account <uuid> --file docker-compose.yml

3 · طبّق

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

cdnctl container compose apply --account <uuid> --file docker-compose.yml --yes

الصور الخاصة. أنشئ بيانات اعتماد سجل مرة واحدة (اللوحة ← Private registry credential، أو الواجهة البرمجية)، وأرفقها بالتطبيقات ليتمكن المنصة من السحب — الصور العامة لا تحتاج شيئًا.

4 · راقب، انشر، افحص

cdnctl container apps list   --account <uuid>
cdnctl container apps wait   --account <uuid> --app <app_uuid> --status running --timeout 300
cdnctl container apps expose --account <uuid> --app <app_uuid>   # -> <uid>.cdn.com.tr
cdnctl container apps logs   --account <uuid> --app <app_uuid> --tail 100
cdnctl container apps status --account <uuid> --app <app_uuid>

النتيجة

تطبيق الويب مباشر على نطاقه الفرعي cdn.com.tr — عداد الزيارات محفوظ في إضافة Postgres المُدارة، ومخزَّن مؤقتًا في إضافة Redis المُدارة، وكلاهما يُبلغ عن حالة connected، ويُقدَّم عبر نسخة مُدارة.

تطبيق العرض التوضيحي المنشور يعمل على نطاق فرعي cdn.com.tr
التطبيق قيد التشغيل، المستورد من docker-compose.yml والمُقدَّم على <uid>.cdn.com.tr.

شيء واحد يجب معرفته عن الحالة المشتركة. لأن كل تطبيق يحصل على Postgres/Redis خاصة به، تكتب worker إلى قاعدة بيانات مختلفة عن التي تقرأ منها web. لمشاركة قاعدة بيانات SQL فعليًا، دع تطبيقًا واحدًا يملكها وتصل إليها التطبيقات الأخرى باسم التطبيق عبر الشبكة الخاصة (http://<اسم-التطبيق>:<المنفذ>)، تمامًا مثل خدمة compose. يمكن مشاركة الخلفيات غير المحمية بكلمة مرور (Redis، NATS) بضبط رابطها كمتغير بيئة في كل مستهلك.