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 في المرة الأولى). تعرض النظرة العامة حدود باقتك وقائمة تطبيقات فارغة.
2 · (الصور الخاصة) أضف بيانات اعتماد سجل
إذا كانت صورك خاصة، افتح Create App، وفي صف Private registry credential أضف اسمًا، ورابط السجل (https://index.docker.io/v1/ لـDocker Hub)، واسم المستخدم، ورمز وصول للقراءة فقط، ثم احفظ. يُخزَّن الرمز مشفرًا ولا يُعرض مجددًا أبدًا. الصور العامة لا تحتاج بيانات اعتماد.
3 · Import From Docker Compose
انتقل إلى Import From Docker Compose، ثم ارفع أو الصق ملف docker-compose.yml الخاص بك (بحد أقصى 256 كيلوبايت).
4 · عاين الخطة
انقر على Preview. تُحلل المنصة الملف وتعرض خطة غير مدمّرة (non-destructive): كل تطبيق ستنشئه، الصورة/المنفذ/عدد النسخ، الإضافات المرتبطة، وأي تحذيرات — دون لمس أي شيء بعد.
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، ويُقدَّم عبر نسخة مُدارة.
docker-compose.yml والمُقدَّم على <uid>.cdn.com.tr.شيء واحد يجب معرفته عن الحالة المشتركة. لأن كل تطبيق يحصل على Postgres/Redis خاصة به، تكتب worker إلى قاعدة بيانات مختلفة عن التي تقرأ منها web. لمشاركة قاعدة بيانات SQL فعليًا، دع تطبيقًا واحدًا يملكها وتصل إليها التطبيقات الأخرى باسم التطبيق عبر الشبكة الخاصة (http://<اسم-التطبيق>:<المنفذ>)، تمامًا مثل خدمة compose. يمكن مشاركة الخلفيات غير المحمية بكلمة مرور (Redis، NATS) بضبط رابطها كمتغير بيئة في كل مستهلك.