Docker compose چیه و چرا بهش نیاز داریم؟

۰۳ مهر ۱۳۹۸
What is docker compose

Docker Compose گرداننده و یا راهنمای کانتینر داکر است. معنی این جمله چیه؟

خب اگر دیده باشید توی گروه های موسیقی یک رهبر ارکستر وجود داره که وظیفش هدایت گروه تحت نظرشه و اونه که مشخص میکنه چگونه یک گروه باید در حین اجرا رفتار کنه، صدای کم یا زیاد، ریتم و غیره .

این دقیقا همون کاریه که Docker compose انجام میده، ولی توی این مورد ما رهبر ارکستر هستیم! در حقیقت این ماییم که تعیین میکنیم کانتینر یا کانتینرها چگونه با استفاده از یک فایل رفتار کنند. تمام داستان نوشتن یک فایل با فرمت Yaml است (Yaml Ain’t Markup Language) . شبیه به چیزی که در فایلهای Dockerfile داریم با ساز و کاری متفاوت. یک قالب encode شده داده ها ی قابل خواندن توسط انسان. که خواندن و فهمیدن کاری که compose انجام میده را راحت تر میکند.

 

برای اینکه این موضوع که docker compose چطور کار میکند را بهتر متوجه شوید یک مثال ملموس و قابل درک اینه که فرض کنید یک برنامه ای دارید که به زبان جاوا یا PHP  و با دیتابیس MySQL، قرار هست در بستر اینترنت قابل رویت باشد که به این معنیه که نیاز به یک پراکسی نیز در جلو آن وجود دارد (وب سروری مثل Nginx یا Apache را در نظر بگیرید.)

خب پس تا به اینجا ما یک اپلیکیشنی داریم که از این موارد استفاده میکند.

Language : PHP or Java

Database : MySQL

Webserver: Nginx or Apache

ما بقی موارد مثل سیستم کش یا دیتابیس های NoSQL را ما در نظر نمیگیریم . برنامه ای حداقلی که اینگونه توسعه داده شده است.

خب سناریو کاملا مشخص است. شما یا فردی در شرکت زیرساخت را مهیا میکند و تمام نرم افزارها را نصب و پیکربندی میکند. ابتدا زبان مورد نظر باید در سرور نصب باشد. PHP نسخه ۷٫۳ مثلا، دیتابیس MySQL نسخه ۵.۷ و وب سرور مورد نظر. هرکدام ازین موارد نیاز به پیکربندی و تنظیمات مجزا نیز دارد که باید انجام شود. خب خیلی هم عالی!

یک نفر مسئول توسعه زیرساخت تمام موارد را به دقت انجام میدهد و سرور آماده بهره برداری است! حالا فرض کنید نیاز هست که این برنامه در سه سرور مجزا قرار داده شود فرض کنید سه عدد سرور جدا برای Development, Approval , Production دارید و برای هر سرور دقیقا تمام این موارد باید تکرار شود. یا فرض کنید قرار هست نسخه PHP شما در سرور از ۷٫۳ به ۷٫۴ ارتقا داده شود. خب نیاز هست که این کارهای خسته کننده توسط یک نفر آشنا به این موارد انجام شود. تعداد برنامه ها و سرورها که زیاد شود چه؟ خب کارهای تکراری و خسته کننده.

اگر این کارها را قرار باشد روی سرورهای کلود و با استفاده از ماشین های مجازی انجام شوند نیز دردی دوا نمیکند چون ممکن است کمی در تکراری بودن کارها کمک کنند که این هم کمی در صحت آن شک وجود دارد ولی منابع بسیار زیادی را از شما میگیرد و همچنین هزینه توسعه را بالا میبرد. حالا فرض کنید برای هر پروژه روی شرکت بخواهید این کارها را تکرار کنید. یعنی ساخت ماشین های مجازی و نصب سیستم عامل ها و بقیه ماجرا. مشکل عمده ای که وجود دارد تخصیص منابع که باید به این ماشین ها داده شود است حالا به این هم اضافه کنید که زمان شما بسیار محدود است و در دنیایی زندگی میکنیم که پروژه ها را باید به صورت اجایل طراحی و تحویل دهیم.

مشکل دیگر اینکه به شدت وابسته به فرد است و خب خطاهای انسانی ممکن است در طول این پروسه زیاد باشد. خب کمی با مشکل آشنا شدیم حالا چگونه میتوانیم مشکل را حل کنیم؟

اینجا docker compose به کمک ما می آید.

 

what is docker

 

Compse File

تمام داستان نوشتن یک فایل به نام docker-compose.yaml است که در روت پروژه قرار میگیرد و توی این فایل ما توصیف میکنیم که چی میخایم و چجوری میخایم 😀

من یک دیتابیس میخواهم با این ویژگی ها، و همینطور به آقای PHP نسخه ۷٫۴ هم برای اجرا نیازه، یک عدد Nodejs ورژن ۱۰ و مثلا شاید کمی Redis. یعنی تمام این تکنولوژی ها در یک فایل (فعلا شما در نظر بگیرید یک فایل وجود دارد به این نام بعدا میتوانیم این فایل را با نام های مختلف ذخیره کنیم و نحوه اجرای آن فرق دارد) لیست میشوند و نحوه تنظیمات آنها نیز بیان میشود. نکته زیبایی که وجود دارد این است که در این فایل میتوانید نحوه رفتار کانتینر داکر خود را در حین خطا تعیین کنید یعنی مثلا اگر دیتابیس MySQL به خطا خورد به هر دلیلی، داکر ریستارتش کن یا یک کانتینتر جدید اجرا کن میتوانید تمام این اپلیکیشن ها را در یک محیط ایزوله در شبکه های گوناگون قرار دهید و یا اینکه داده های کانتینر در چه Volume ای ذخیره شود (مسیر دیسک) .

اجازه دهید یک مثال ببینیم :‌

 

متغیرهای محیطی که با تگ environment مشخص میشوند برای هر کانتینری تفاوت دارد و شما باید بر اساس کانتینری که استفاده میکنید این متغیرها را مقداردهی کنید. تمام این موارد در سایت https://hub.docker.com/ وجود دارد و وقتی به صفحه ایمیج مد نظرتان بروید این موارد را خواهید دید.

در خط اول ورژن docker-compose  را مشخص میکنید. سرویس ها را مشخص میکنید که تمام سرویس های استفاده شده توسط شما را شناسایی میکند.

در این مثال از دو سرویس ساده استفاده کرده ایم. یک دیتابیس که نام آن را  db و دیگری وردپرس که نام آن را wordpress قرار دادیم. این اسامی دلخواه بوده و هر اسمی مایل باشید میتوانید بر روی آنها قرار دهید. در سرویس db مشخص کرده ایم داده های موجود برروی کانتینر به مسیر /home/ali/backup/mysql_data بایند باشند. هر داده ای در مسیر گفته شده در سمت راست در کانتینر قرار گیرد بلافاصله در مسیر گفته شده در سمت چپ نیز قرار میگیرد. باید این کار را انجام دهید چون اکر دیتای خود را بایند نکنید بعد از خاموش شدن کانتینر بلافاصله تمام دیتای شما از بین خواهد رفت. چون کانتینرها اگر خاموش شوند ناپایدار هستند و اگر به آنها نگویید موردی را ذخیره نمیکنند.

در خط بعد reastart:always را قرار داده ایم که به این معنی است که اگر خطا خورد یا کانتینتر استاپ شد بلافاصله آن را ریستارت کن. متغیرهای محیطی که مشخص هستند چه مواردی هستند و تعریف آنها واضح است.

فقط در کانتینر وردپرس وقتی مشخص میکنید که به چه کانتینری وابسته است ( depend_on ) باید نام کانتینر خود را که در قبل از این کانتینر تعریف کرده اید عنوان کنیدو حواستان باشد باید قبل از این کانتینر تعریف شده باشد وگرنه خطای عدم شناسایی کانتینر برمیگرداند.

حال شما با داشتن این فایل و قرار دادن آن در هر سرور و مسیری قادر خواهید بود اپلیکیشن خود را به درستی و بدون کوچکترین کار اضافه و همچنین کار یک نیروی انسانی دیگر اجرا کنید

با استفاده از دستور docker-composer up -d  فایل اجرا و کانتینرها ساخته خواهند شد.

به جای ساختن ماشین های مجازی متفاوت و کنترل آنها شما فقط با این فایل کار خواهید کرد. مابقی کار را داکر برای شما انجام میدهد 🙂

 

 

 

3
برچسب ها :
نویسنده مطلب علی فلاحتی

3 دیدگاه

  • alireza
    ۰۳ مهر ۱۳۹۸

    بسیار کاربردی بود ممنون

  • کوروش شریفی
    ۰۷ مهر ۱۳۹۸

    ممنون, فقط این نکته رو در نظر داشته باشید که volume ها فایل های موجود در هاست رو در داخل داکر نیز در دسترس قرار می دن.

    • falahati
      ۰۷ مهر ۱۳۹۸

      بله دقیقا. بایند دو طرفه هست این موضوع. ممنون از تاکید خوبتون

لینک های مفید