سیس ادمین سادهی ساده
داکر برای برنامهنویسها: قسمت سیزدهم - آشنایی با اجزای فایل docker-compose.yaml
مقدمه
در قسمت قبل با داکر کامپوز آشنا شدیم و یه سرویس کوچولو باهاش راه انداختیم. تو این قست کمی دقیقتر اجزای یه فایل docker-compose.yaml رو بررسی میکنیم و یه اپ جنگو با دیتابیس پستگرس بالا میاریم. کد این قسمت رو در این ریپو در گیتهاب میتونید ببینید.
برای همراهی با این مطلب لازمه که تجربهی کار با داکر و کانتینرها رو داشته باشین و همچنین آشنایی ابتدایی با داکر کامپوز داشته باشین. اگر این طور نیست خوبه که آموزشهای قبلی رو ببینید.
ساختار کلی فایل
اولین چیزی که توی docker-compose.yaml مینویسیم ورژن است. ورژنهای مختلف داکر کامپوز ویژگیهای مختلفی را پشتیبانی میکنن. ما در اینجا جدیدترین نسخه رو نوشتیم:
version: "3.9"
بعد از اون services رو داریم که اصل کار ماست.
version: "3.9"
services:
داخل این بخش هر چی سرویس داریم رو مینویسیم. مثلا یک اپ بک اند داریم و یک دیتابیس. در نتیجه دو تا سرویس داخل services باید بنویسیم.
version: "3.9"
services:
web:
db:
برای مشخص کردن هر سرویس اول یه اسم مینویسیم. تو مثال بالا یه سرویس به نام web داریم که همون اپ جنگو هست و یه سرویس db برای دیتابیس. حالا داخل هر سرویس قراره مشخصاتش رو بنویسیم و هر کدوم رو پر کنیم.
نوشتن سرویس web
من به web یک ایمیج دادم با عبارت image. اسم و تگ ایمیج رو اینجا باید بنویسیم. بعدش تعدادی پورت با ports نوشتم. ترتیب عبارات در فایل yaml تفاوتی ایجاد نمیکنه.
version: "3.9"
services:
web:
image: django-blog:1
environment:
- DB_NAME=postgres
- DB_USER=postgres
- DB_PASSWORD=postgres
- DB_HOST=db
- DB_PORT=5432
ports:
- "8000:8000"
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: "3.9"
services:
web:
build: ./
environment:
- DB_NAME=postgres
- DB_USER=postgres
- DB_PASSWORD=postgres
- DB_HOST=db
- DB_PORT=5432
ports:
- "8000:8000"
depends_on:
- db
جلوی build مسیر ساخت ایمیج رو میدیم. همونجور که موقع زدن docker build میدادیم. حالا هر وقت کدمون تغییری کنه میشه در روت پروژه دستور docker-compose build رو زد تا بیلد انجام بشه. دیگه image رو لازم نیست بنویسم. اگه بنویسم اسم و تگ ایمیجی که ساخته میشه رو میذاره همون چیزی که من جلوی image نوشتم.
یه نکته باقی مونده. اونم اینه که برنامهی جنگوی من برای شروع نیاز داره که دیتابیس آماده باشه. برای این که وابستگی رو بیان کنیم توی سرویس web از depends_on استفاده میکنیم و یه لیست میدیم از سرویسهایی که این سرویس بهشون وابسته است. اینجا web فقط به db وابسته بود.
نوشتن سرویس db
حالا سرویس دیگهمون که db هست رو مینویسیم:
version: "3.9"
services:
web:
image: django-blog:1
environment:
- DB_NAME=postgres
- DB_USER=postgres
- DB_PASSWORD=postgres
- DB_HOST=db
- DB_PORT=5432
ports:
- "8000:8000"
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 جدید بسازم:
میبینید در جواب کد ۲۰۱ داده شده و همه چی خوب کار میکنه.
جمعبندی
ما در این قسمت دیدیم چجوری یه فایل داکر کامپوز برای اپ جنگو با دیتابیس بنویسیم. با بعضی از تنظیماتی که میشد روی سرویسها انجام داد هم آشنا شدیم. برای دیدن مرجع کامل داکر کامپوز به این لینک در سایت داکر مراجعه کنید.
اميدوارم این مطلب براتون مفید بوده باشه. اگه سوال یا نظری دارین این پایین بگین.
مطلبی دیگر از این انتشارات
چرا کوبرنتیز این شکلی طراحی شده؟ - قسمت دوم
مطلبی دیگر از این انتشارات
داکر برای برنامهنویسها: قسمت پنجم - ارتباط با کانتینر
مطلبی دیگر از این انتشارات
داکر برای برنامهنویسها: قسمت سوم - دستورات ابتدایی در داکر