Loading...

آموزش / استقرار

استقرار یک اپلیکیشن چندسرویسی با Docker Compose

یک docker-compose.yml با یک سرویس web، یک worker و یک دیتابیس دارید؟ cdn.com.tr آن را به اپلیکیشن‌ها و افزونه‌های کانتینری مدیریت‌شده تبدیل می‌کند — ابتدا نقشه را پیش‌نمایش کنید، سپس با یک دستور اعمالش کنید. نه کلاستری برای اجرا، نه دیتابیسی برای مراقبت.

۸ دقیقه مطالعه متوسط Updated

استقرار یک اپلیکیشن چندسرویسی با Docker Compose

به چه چیزی نیاز دارید

به اپلیکیشنی نیاز دارید که با یک docker-compose.yml توصیف شده باشد — معمولاً یک سرویس web، شاید یک worker پس‌زمینه، و سرویس‌های پشتیبان مانند یک دیتابیس و Redis — و یک حساب cdn.com.tr. شما نه یک کلاستر Kubernetes اجرا می‌کنید، نه یک سرور دیتابیس مدیریت می‌کنید و نه TLS را دستی سیم‌کشی می‌کنید. cdn.com.tr فایل compose شما را می‌خواند و هر بخش را به یک قطعه مدیریت‌شده نگاشت می‌کند: سرویس‌های اپلیکیشن به اپلیکیشن‌های کانتینری تبدیل می‌شوند، و سرویس‌های حالت‌دار مانند Postgres، MySQL یا Redis به افزونه‌های مدیریت‌شده‌ای تبدیل می‌شوند که پشتیبان‌گیری شده و به‌صورت متغیرهای محیطی به اپلیکیشن‌های شما تزریق می‌شوند.

چگونه فایل compose شما نگاشت می‌شود

ایده ساده است: هر چیزی که به ترافیک سرویس می‌دهد یا کد اجرا می‌کند به یک اپلیکیشن کانتینری تبدیل می‌شود، و هر چیزی که داده ذخیره می‌کند به یک افزونه مدیریت‌شده. یک سرویس 'web' به اپلیکیشنی با دامنه تبدیل می‌شود؛ یک 'worker' به اپلیکیشنی بدون پورت عمومی؛ یک 'db' که از یک image مربوط به Postgres یا MySQL استفاده می‌کند به یک دیتابیس مدیریت‌شده؛ و یک سرویس 'redis' به Redis مدیریت‌شده. سرویس‌های شما همچنان با نام با یکدیگر صحبت می‌کنند، و جزئیات اتصال افزونه‌های مدیریت‌شده به‌طور خودکار در اختیار اپلیکیشن‌های شما قرار می‌گیرد — بنابراین کانتینر پرریسک و خودمیزبان دیتابیس را حذف می‌کنید و اجازه می‌دهید پلتفرم آن را اجرا کند.

یک نمونه فایل compose

این یک اپلیکیشن کوچک چندسرویسی است: یک API وب، یک worker پس‌زمینه، یک دیتابیس Postgres و Redis. آن را به‌عنوان docker-compose.yml در مخزن خود commit کنید.

docker-compose.yml

services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      DATABASE_URL: postgres://app:secret@db:5432/app
      REDIS_URL: redis://redis:6379
    depends_on: [db, redis]

  worker:
    build: .
    command: ["python", "worker.py"]
    depends_on: [db, redis]

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: app

  redis:
    image: redis:7

ابتدا نقشه را پیش‌نمایش کنید

پیش از تغییر هر چیزی، از cdn.com.tr بپرسید چه چیزی خواهد ساخت. پیش‌نمایش فایل compose شما را می‌خواند و نقشه را نشان می‌دهد: کدام سرویس‌ها به اپلیکیشن‌های کانتینری تبدیل می‌شوند، کدام به افزونه‌های مدیریت‌شده، و چگونه به هم متصل می‌شوند. هنوز چیزی ساخته نمی‌شود — فقط می‌بینید چه اتفاقی خواهد افتاد.

cdnctl — پیش‌نمایش
cdnctl login
cdnctl accounts use <account_uuid>

cdnctl container compose preview --file docker-compose.yml
# web, worker  -> اپلیکیشن‌های کانتینری
# db           -> دیتابیس مدیریت‌شده (postgres)
# redis        -> Redis مدیریت‌شده

اعمالش کنید

از نقشه راضی هستید؟ اعمالش کنید. cdn.com.tr اپلیکیشن‌های کانتینری و افزونه‌ها را می‌سازد، رشته‌های اتصال را به اپلیکیشن‌های شما سیم‌کشی می‌کند و همه‌چیز را راه می‌اندازد. می‌توانید این کار را از پنل هم انجام دهید — فایل compose را وارد کنید، نقشه را مرور کنید و تأیید کنید — اما یک دستور واحد آن را در CI یا یک اسکریپت شما نگه می‌دارد.

cdnctl — اعمال
cdnctl container compose apply --file docker-compose.yml --yes

# سپس، هر زمان:
cdnctl container apps list
cdnctl container apps logs --app <web_app_uuid> --tail 100

دامنه، HTTPS و edge

دامنه خود را به اپلیکیشن web اشاره دهید و cdn.com.tr گواهی SSL را به‌طور خودکار صادر و تمدید می‌کند. اکنون سرویس‌های شما به‌عنوان اپلیکیشن‌های مدیریت‌شده پشت edge شبکه CDN اجرا می‌شوند، با یک WAF در جلو و هجوم‌های ترافیک که در edge جذب می‌شوند؛ دیتابیس و Redis مدیریت و پشتیبان‌گیری می‌شوند. برای ارسال یک به‌روزرسانی، image خود را دوباره بسازید و دوباره اعمال کنید — یک بیلد خراب باعث می‌شود نسخه قبلی همچنان سرویس دهد. یک استقرار تولیدی چندسرویسی به دست می‌آورید بدون اینکه کلاستری یا دیتابیسی را زیر آن اداره کنید.

موارد مناسب

اپلیکیشن‌های web + worker + صف

اپلیکیشن‌هایی با یک لایه web، workerهای پس‌زمینه و یک دیتابیس به‌تمیزی به اپلیکیشن‌ها به‌علاوه افزونه‌های مدیریت‌شده نگاشت می‌شوند.

انتقال یک stack موجود

همین حالا یک docker-compose.yml کارآمد دارید؟ آن را همان‌طور که هست وارد کنید، به‌جای بازسازی استقرار خود از صفر.

تغییرات پیش‌نمایش سپس اعمال

پیش‌نمایش دقیقاً نشان می‌دهد چه چیزی تغییر خواهد کرد پیش از اجرای هر چیزی — برای استفاده از CI یا یک اسکریپت امن است.

پرسش‌های پرتکرار استقرار Docker Compose

آیا docker-compose را همان‌طور که هست روی یک VM اجرا می‌کند؟

خیر — فایل compose شما را به منابع مدیریت‌شده تبدیل می‌کند: سرویس‌ها به اپلیکیشن‌های کانتینری و سرویس‌های حالت‌دار به افزونه‌های مدیریت‌شده تبدیل می‌شوند. این یعنی نه VMای برای وصله‌کردن و دیتابیسی که برای شما پشتیبان‌گیری و اداره می‌شود، در حالی که اپلیکیشن شما همان شکل را حفظ می‌کند.

چه بر سر سرویس‌های دیتابیس و Redis من می‌آید؟

یک سرویس Postgres، MySQL یا Redis به یک افزونه مدیریت‌شده تبدیل می‌شود. کانتینر موجود در فایل compose شما همان‌طور که هست اجرا نمی‌شود؛ در عوض افزونه مدیریت‌شده جزئیات اتصال را به‌صورت متغیرهای محیطی در اختیار اپلیکیشن‌های شما قرار می‌دهد.

آیا می‌توانم پیش از اعمال ببینم چه اتفاقی خواهد افتاد؟

بله. 'cdnctl container compose preview' نقشه کامل را نشان می‌دهد — کدام سرویس‌ها به اپلیکیشن، کدام به افزونه، و چگونه به هم متصل می‌شوند — بدون ساختن هیچ چیز. تنها زمانی اعمال کنید که نقشه درست به نظر برسد.