داکر برای برنامه‌نویس‌ها: قسمت سیزدهم - آشنایی با اجزای فایل docker-compose.yaml

مقدمهدر قسمت قبل با داکر کامپوز آشنا شدیم و یه سرویس کوچولو باهاش راه انداختیم. تو این قست کمی دقیق‌تر اجزای یه فایل docker-compose.yaml رو بررسی می‌کنیم و یه اپ‌ جنگو با دیتابیس پستگرس بالا میاریم. کد این قسمت رو در این ریپو در گیتهاب می‌تونید ببینید.برای همراهی با این مطلب لازمه که تجربه‌ی کار با داکر و کانتینرها رو داشته باشین و هم‌چنین آشنایی ابتدایی با داکر کامپوز داشته باشین. اگر این طور نیست خوبه که آموزش‌های قبلی رو ببینید.ساختار کلی فایل اولین چیزی که توی docker-compose.yaml می‌نویسیم ورژن است. ورژن‌های مختلف داکر کامپوز ویژگی‌های مختلفی را پشتیبانی می‌کنن. ما در اینجا جدیدترین نسخه رو نوشتیم:version: &quot3.9&quotبعد از اون services رو داریم که اصل کار ماست.version: &quot3.9&quot services:داخل این بخش هر چی سرویس داریم رو می‌نویسیم. مثلا یک اپ بک اند داریم و یک دیتابیس. در نتیجه دو تا سرویس داخل services باید بنویسیم. version: &quot3.9&quot services: web: db: برای مشخص کردن هر سرویس اول یه اسم می‌نویسیم. تو مثال بالا یه سرویس به نام web داریم که همون اپ جنگو هست و یه سرویس db برای دیتابیس. حالا داخل هر سرویس قراره مشخصاتش رو بنویسیم و هر کدوم رو پر کنیم. نوشتن سرویس webمن به web یک ایمیج دادم با عبارت image. اسم و تگ ایمیج رو اینجا باید بنویسیم. بعدش تعدادی پورت با ports نوشتم. ترتیب عبارات در فایل yaml تفاوتی ایجاد نمی‌کنه. version: &quot3.9&quot services: web: image: django-blog:1 environment: - DB_NAME=postgres - DB_USER=postgres - DB_PASSWORD=postgres - DB_HOST=db - DB_PORT=5432 ports: - &quot8000:8000&quot depends_on: - dbدقت کنید که ports یک لیست می‌گیره و مثل وقتی هست که با docker run آپشن p- رو می‌زدیم؛ یعنی اول پورت روی سیستم میزبان و دوم پورت کانتینر. اگر بخوایم متغیر محیطی داشته باشیم اون رو با environment می‌نویسیم. تو این مثال مشخصات اتصال به دیتابیس رو دادم. همون طور که معلومه به شکل لیست داده میشه. تو هر مورد به ترتیب اسم متغیر، علامت = و مقدارش میاد. متغیرهای محیطی رو این شکلی هم میشه نوشت: environment: DB_NAME: postgres DB_USER: postgres DB_PASSWORD: postgres DB_HOST: db DB_PORT: 5432 اگر یه فایل از قبل دارید که این متغیرها از قبل توش نوشته شده می‌تونید با env_file بنویسید و بعد مسیر فایل رو بدید:env_file: - web-variables.envهمونطور که می‌بینید یک لیست هست و میشه چندتا فایل هم داد. اگه شما سورس کدی دارین و دارین توسعه‌اش میدین می‌تونین خودتون هر دفعه با دستور docker build بیلدش کنین و اسم ایمیج رو توی image بهش بدین. اما میشه بیلد رو به کمک داکر کامپوز انجام داد. یعنی یک قسمت به نام build به سرویس اضافه کنیم و به این شکل در میاد سرویس web:version: &quot3.9&quot services: web: build: ./ environment: - DB_NAME=postgres - DB_USER=postgres - DB_PASSWORD=postgres - DB_HOST=db - DB_PORT=5432 ports: - &quot8000:8000&quot depends_on: - dbجلوی build مسیر ساخت ایمیج رو میدیم. همونجور که موقع زدن docker build می‌دادیم. حالا هر وقت کدمون تغییری کنه میشه در روت پروژه دستور docker-compose build رو زد تا بیلد انجام بشه. دیگه image رو لازم نیست بنویسم. اگه بنویسم اسم و تگ ایمیجی که ساخته میشه رو می‌ذاره همون چیزی که من جلوی image نوشتم.یه نکته باقی مونده. اونم اینه که برنامه‌ی جنگوی من برای شروع نیاز داره که دیتابیس آماده باشه. برای این که وابستگی رو بیان کنیم توی سرویس web از depends_on استفاده می‌کنیم و یه لیست میدیم از سرویس‌هایی که این سرویس بهشون وابسته است. اینجا web فقط به db وابسته بود.نوشتن سرویس dbحالا سرویس دیگه‌مون که db هست رو می‌نویسیم:version: &quot3.9&quot services: web: image: django-blog:1 environment: - DB_NAME=postgres - DB_USER=postgres - DB_PASSWORD=postgres - DB_HOST=db - DB_PORT=5432 ports: - &quot8000:8000&quot depends_on: - db db: image: postgres volumes: - ./data/db:/var/lib/postgresql/data environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgresایمیجش postgres هست چون می‌خوام از این دیتابیس استفاده کنم. در این سرویس می‌خوام اطلاعاتم باقی بمونه و با هر بار از خاموش و روشن کردن کانتینر از بین نره. به همین دلیل از volume استفاده کردیم. داخلش یه لیست قرار می‌گیره و مثل آپشن v- در docker run اول مسیر تو سیستم خودمون رو میدیم بعدش مسیر داخل کانتینر. اینجا می‌خوام اطلاعات دیتابیس که در مسیر var/lib/postgresql/data/ درون کانتینر هست رو توی پوشه‌ی data/db داخل پروژه‌ی خودم نگه دارم. بقیه‌ی چیزهایی که نوشتم رو قبلا دیدیم. اجرای سرویس‌هاالان دیگه آماده‌ایم. تو همون پوشه دستور docker-compose up رو می‌زنیم: به نظر میاد همه چی خوبه. حالا برای اطمینان از کارکردش با curl یک درخواست بهش می‌فرستم که یک user جدید بسازم:می‌بینید در جواب کد ۲۰۱ داده شده و همه چی خوب کار می‌کنه.جمع‌بندیما در این قسمت دیدیم چجوری یه فایل داکر کامپوز برای اپ جنگو با دیتابیس بنویسیم. با بعضی از تنظیماتی که میشد روی سرویس‌ها انجام داد هم آشنا شدیم. برای دیدن مرجع کامل داکر کامپوز به این لینک در سایت داکر مراجعه کنید.اميدوارم این مطلب براتون مفید بوده باشه. اگه سوال یا نظری دارین این پایین بگین.قسمت قبلی