How-To Guides

تسلط بر توسعه محلی: راهنمای جامع راه‌اندازی Docker Compose

در چرخه حیات توسعه نرم‌افزار مدرن، سازگاری بین محیط‌های محلی، پیش‌تولید و تولید حیاتی است. در حالی که داکر موتور کانتینرسازی را فراهم می‌کند، Docker Compose ارکستراتوری است که برنامه‌های چندکانتینری را به زندگی می‌آورد. برای توسعه‌دهندگان متوسط و پیشرفته، عبور از جریان‌های کاری تک‌کانتینری به یک تنظیم Compose قوی و تعریف‌شده، نه تنها یک راحتی، بلکه ضرورتی برای مقیاس‌پذیری و همکاری است.

این راهنما شما را در فرآیند معماری یک محیط توسعه محلی شبیه به تولید با استفاده از Docker Compose راهنمایی می‌کند و بر بهترین شیوه‌ها برای تعریف سرویس‌ها، مدیریت حجم‌ها (Volumes) و شبکه تمرکز دارد.

درک معماری

قبل از نوشتن کد، باید سرویس‌ها را تعریف کنیم. یک برنامه وب معمولی ممکن است شامل یک برنامه فرانت‌اند، یک API بک‌اند و یک پایگاه داده باشد. Docker Compose به ما اجازه می‌دهد این وابستگی‌ها را در یک فایل docker-compose.yml تعریف کنیم. این رویکرد اعلانی (Declarative) تضمین می‌کند که هر توسعه‌دهنده‌ای در تیم بتواند کل استک را با یک دستور واحد راه‌اندازی کند و پدیده "روی ماشین من کار می‌کند" را از بین ببرد.

تعریف سرویس‌های شما

بیایید یک سناریوی واقع‌گرایانه بسازیم: یک API Node.js متصل به یک پایگاه داده PostgreSQL و ارائه شده با یک فرانت‌اند React. ما سه سرویس متمایز را در فایل پیکربندی خود تعریف خواهیم کرد. هر سرویس به عنوان یک نقشه برای یک کانتینر عمل می‌کند و تصویر، زمینه ساخت (Build context)، پورت‌ها و متغیرهای محیطی را مشخص می‌کند.

در اینجا یک پیکربندی docker-compose.yml قوی وجود دارد که این وابستگی‌ها را مدیریت می‌کند:

version: '3.8'

services:
  api:
    build:
      context: ./api
      dockerfile: Dockerfile.dev
    container_name: dev-api
    ports:
      - "4000:4000"
    environment:
      - DATABASE_URL=postgresql://user:password@db:5432/mydb
      - NODE_ENV=development
    volumes:
      - ./api:/usr/src/app
      - /usr/src/app/node_modules
    depends_on:
      - db
    networks:
      - dev-net

  db:
    image: postgres:15-alpine
    container_name: dev-db
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=mydb
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - dev-net

  web:
    build:
      context: ./web
      dockerfile: Dockerfile.dev
    container_name: dev-web
    ports:
      - "3000:3000"
    volumes:
      - ./web:/usr/src/app
      - /usr/src/app/node_modules
    depends_on:
      - api
    networks:
      - dev-net

volumes:
  pgdata:

networks:
  dev-net:
    driver: bridge

استراتژی‌های کلیدی پیکربندی

الگوهای حیاتی متعددی در مثال بالا برای تضمین یک تجربه توسعه روان به کار گرفته شده‌اند.

مدیریت حجم‌ها (Volumes)

به استفاده از حجم‌ها در سرویس‌های api و web توجه کنید. با اتصال پوشه کد محلی (./api:/usr/src/app)، قابلیت‌های بارگذاری مجدد داغ (Hot-reloading) را فعال می‌کنیم. وقتی فایلی را به صورت محلی ذخیره می‌کنید، تغییرات بلافاصله در کانتینر منعکس می‌شوند و نیازی به ساخت مجدد نیست. حجم دوم، - /usr/src/app/node_modules، یک حجم نام‌گذاری شده است که پوشه node_modules داخل کانتینر را به طور مؤثر پنهان می‌کند. این کار از مشکلات مجوز محلی جلوگیری کرده و تضمین می‌کند که npm install در زمینه کانتینر به درستی اجرا شود.

جداسازی شبکه

ما یک شبکه پل (Bridge) سفارشی (dev-net) تعریف می‌کنیم تا به جای تکیه بر شبکه پیش‌فرض. این کار جداسازی بهتری فراهم می‌کند و به سرویس‌ها اجازه می‌دهد از طریق نام‌های DNS یکدیگر را کشف کنند (برای مثال، API می‌تواند با استفاده از db به عنوان نام میزبان به پایگاه داده دسترسی پیدا کند). این رفتار شبکه‌ای را شبیه‌تر به تولید می‌کند.

ترتیب وابستگی‌ها

استفاده از depends_on تضمین می‌کند که پایگاه داده و API قبل از کلاینت وب شروع به کار کنند. اگرچه Compose به طور پیش‌فرض منتظر آماده بودن پایگاه داده برای پذیرش اتصالات نمی‌ماند، اما شروع کانتینرها را به ترتیب صحیح تضمین می‌کند. برای آمادگی تولید، معمولاً باید بررسی‌های سلامت (Health checks) را پیاده‌سازی کنید، اما برای توسعه محلی، این ترتیب‌بندی ساده اغلب کافی است.

راه‌اندازی محیط شما

پس از قرار دادن فایل docker-compose.yml، راه‌اندازی استک شما ساده است. ترمینال خود را در دایرکتوری ریشه پروژه باز کنید و دستور زیر را اجرا کنید:

docker-compose up --build

پرچم --build تضمین می‌کند که Dockerfileهای شما در صورت تغییرات، مجدداً ساخته شوند. برای اجرای این دستور در پس‌زمینه (حالت Detached)، -d را به دستور اضافه کنید.

نتیجه‌گیری

راه‌اندازی Docker Compose برای توسعه محلی سرمایه‌گذاری است که سود آن را در بهره‌وری تیم و قابلیت اطمینان استقرار می‌پردازد. با تعریف زیرساخت به عنوان کد، شما محیطی تکرارپذیر ایجاد می‌کنید که ویژگی‌های خاص سیستم‌عامل را انتزاع می‌کند. همان‌طور که با Compose راحت‌تر می‌شوید، می‌تانید این تنظیم را برای شامل کردن لایه‌های کش مانند Redis، صف‌های پیام مانند RabbitMQ یا معکوس‌کننده‌های پروکسی مانند Nginx گسترش دهید، که همه از یک فایل پیکربندی واحد مدیریت می‌شوند.

ساده شروع کنید، اغلب تکرار کنید و اجازه دهید Docker Compe کارهای سنگین را انجام دهد تا شما بتوانید بر روی نوشتن نرم‌افزار عالی تمرکز کنید.

Share: