در چرخه حیات توسعه نرمافزار مدرن، سازگاری بین محیطهای محلی، پیشتولید و تولید حیاتی است. در حالی که داکر موتور کانتینرسازی را فراهم میکند، 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 کارهای سنگین را انجام دهد تا شما بتوانید بر روی نوشتن نرمافزار عالی تمرکز کنید.