Docker Compose به ابزاری ضروری برای توسعهدهندگان و مهندسان DevOps تبدیل شده است. در حالی که اپلیکیشنهای تککانتینری برای تست مفید هستند، پروژههای دنیای واقعی تقریباً همیشه به خدمات متعددی مانند سرورهای وب، پایگاههای داده، لایههای کش و صفهای پیام تکیه میکنند. Docker Compose تعریف و اجرای اپلیکیشنهای چندکانتینری را با استفاده از یک فایل YAML واحد برای پیکربندی خدمات، شبکهها و حجمهای شما ساده میکند. این راهنما شما را در مراحل اساسی راهاندازی و مدیریت پروژههای خود با استفاده از Docker Compose همراهی خواهد کرد.
درک ساختار docker-compose.yml
قلب هر پروژه Docker Compose فایل docker-compose.yml است. این فایل معماری اپلیکیشن شما را تعریف میکند. در هسته خود، از سه کلید اصلی سطح بالا تشکیل شده است: version (هرچند در نسخههای جدیدتر کمتر حیاتی است)، services و به صورت اختیاری volumes و networks.
هر سرویس در بلوک services نماینده یک کانتینر است. شما تصویر (image)، پورتهای باز، متغیرهای محیطی و وابستگیهای آن را تعریف میکنید. برای مثال، یک اپلیکیشن وب ساده با یک پایگاه داده ممکن است به این شکل باشد:
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
environment:
- DATABASE_URL=postgresql://db:5432
db:
image: postgres:14
volumes:
- db-data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=secretpassword
volumes:
db-data:
راهاندازی محیط شما
قبل از ورود به پیکربندیهای پیچیده، اطمینان حاصل کنید که نصب Docker شما بهروز است. Docker Compose اکنون به عنوان یک پلاگین مستقل توزیع میشود، بنابراین نیازی به نصب جداگانه ندارید. با اجرای docker compose version در ترمینال خود، تنظیمات خود را تأیید کنید. اگر دستور با موفقیت انجام شود، آماده ادامه هستید.
یک پوشه جدید برای پروژه خود ایجاد کنید و آن را به عنوان یک پروژه Compose راهاندازی کنید. اگرچه دستور خاصی برای "init" در Compose وجود ندارد، اما نگه داشتن docker-compose.yml و Dockerfile در همان پوشه ریشه یک بهترین روش برای حفظ مسیرهای نسبی است.
مدیریت چرخه حیات
پس از پیکربندی فایل YAML شما، میتوانید چرخه حیات اپلیکیشن خود را با چند دستور ساده کنترل کنید. برای شروع تمام خدمات تعریف شده در حالت جداگانه (detached)، از دستور زیر استفاده کنید:
docker compose up -d
در غیر این صورت، اگر میخواهید لاگها را برای عیبیابی در پیشزمینه ببینید، docker compose up را اجرا کنید. برای توقف کانتینرها، از docker compose down استفاده کنید که همچنین شبکهها و هر حجم نامشخصی که توسط دستور up ایجاد شده است را حذف میکند. اگر میخواهید دادهها پایدار بمانند، اطمینان حاصل کنید که حجمهای نامگذاری شده را در فایل YAML خود تعریف کردهاید، همانطور که در مثال بالا نشان داده شد.
پیکربندیهای پیشرفته: شبکهها و رازها
برای محیطهای شبیه به تولید، امنیت و جداسازی از اهمیت بالایی برخوردار است. Docker Compose به شما امکان میدهد شبکههای پل سفارشی ایجاد کنید تا دادههای حساس را جداسازی کنید. به طور پیشفرض، همه خدمات به یک شبکه واحد متصل هستند، اما میتوانید شبکههای خاصی را تعریف کنید:
networks:
frontend:
backend:
services:
web:
networks:
- frontend
db:
networks:
- backend
علاوه بر این، از سفتکد کردن (hardcoding) رازها در فایلهای YAML خود خودداری کنید. به جای آن، از فایلهای متغیر محیطی (.env) یا رازهای Docker استفاده کنید. میتوانید با استفاده از سینتکس ${VARIABLE_NAME} در فایل Compose خود به متغیرها ارجاع دهید، که مقادیر را از محیط محلی شما یا یک فایل .env قرار داده شده در پوشه پروژه دریافت میکند.
اشتباهات رایج و عیبیابی
یکی از رایجترین مشکلات از تعارض پورتها ناشی میشود. اگر پورتی در دستگاه میزبان در حال استفاده باشد، Compose در شروع کانتینر شکست میخورد. از docker ps برای بررسی فرآیندهای متعارض استفاده کنید. یک مشکل رایج دیگر، پیکربندی نادرست ماونت حجمها است. اطمینان حاصل کنید که مسیر مشخص شده در میزبان وجود دارد و دسترسیهای صحیح برای کاربر کانتینر را دارد.
همچنین، به وابستگیهای سرویسها توجه دقیق داشته باشید. در حالی که Compose میتواند سرویسها را به صورت موازی شروع کند، منطق اپلیکیشن شما باید اتصالهای پایگاه داده را به طور ظریف مدیریت کند، زیرا پایگاه داده ممکن است بلافاصله پس از شروع کاملاً آماده نباشد. در نظر بگیرید از دستور healthcheck در تعریف سرویس خود استفاده کنید تا نشان دهد چه زمانی یک سرویس واقعاً آماده است.
نتیجهگیری
Docker Compose توسعه و استقرار اپلیکیشنهای چندکانتینری را سادهتر میکند و پیچیدگی مدیریت خدمات متصل به هم را کاهش میدهد. با تسلط بر ساختار فایل docker-compose.yml، درک دستورات چرخه حیات و پیادهسازی بهترین روشها برای امنیت و شبکهبندی، میتوانید با آسودگی اپلیکیشنهای محکم و مقیاسپذیر بسازید. با تنظیمات ساده شروع کنید و به تدریج ویژگیهایی مانند شبکههای سفارشی و حجمهای پایدار را به پروژه خود اضافه کنید. قدرت Compose را برای خودکارسازی جریان کاری خود در آغوش بگیرید و بر آنچه مهمتر است تمرکز کنید: نوشتن کدهای عالی.