پرش به مطلب اصلی

به نظر شما هدف ما از توسعه نرم‌افزار چیست؟
بدون توجه به پاسخی که به این سوال می‌دهید قدم مهمی در چرخه تولید نرم‌افزار وجود دارد: رسیدن نرم‌افزار به دست مشتری!
اما اینکار چطور انجام می‌شود؟
می‌دانیم که کدهای یک نرم‌افزار بعد از نوشته شدن باید تست،‌ بیلد و مستقر شوند. احتمالا حدس می‌زنید که استقرار نرم‌افزارهای بزرگ معمولا با پیچیدگی‌های مختلفی همراه است. اما به طور دقیق چه پیچیدگی‌هایی؟
بیاید با هم بعضی از این پیچیدگی‌ها را بررسی کنیم.

  • اولین مشکل در راه استقرار یک نرم‌افزار، مشخص نبودن روال بیلد شدن و محیط اجرای آن است. معمولا توسعه‌دهنده‌ها تمام ابزارهای مورد نیاز برای تست و بیلد نرم‌افزاری که بر روی آن کار می‌کنند را بر روی دستگاه‌های شخصی خود دارند اما در زمان بیلد نرم‌افزار برای استقرار اصلی و اجرای آن باید چه کاری انجام بدهیم؟

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

  • علاوه بر این، نرم‌افزارهای ما معمولا به تنهایی اجرا نشده و نیاز به ابزارهای جانبی مثل پایگاه‌داده و… دارند. قرار دادن این نرم‌افزارها و ابزارها در کنار هم و اتصال آن‌ها به بقیه نیز چالش دیگری است که با آن روبرو هستیم.

اما چطور باید به این چالش‌ها پاسخ داد؟

ماشین‌های مجازی

در گذشته، راه‌حلی که برای پاسخ به این چالش‌ها ارائه می‌شد ابزاری به اسم Virtual Machine یا ماشین مجازی بود. ماشین‌های مجازی که از حالا به بعد آن‌ها را VM صدا می‌زنیم سعی می‌کردند با تقسیم یک سخت‌افزار فیزیکی به چند سخت‌افزار مجازی و اجرای سیستم‌عامل‌های مجزا بر روی این سخت‌افزارهای مجازی، محیط مورد نیاز یک نرم‌افزار رو به صورت کامل ایجاد و نگه‌داری کنند. برای آشنایی بهتر با تکنولوژی مجازی‌سازی و VMها این ویدیو را تماشا کنید.

کانتینرها

VMها، به خوبی می‌توانستند نیازمندی‌های ما برای استقرار نرم‌افزار را پاسخ دهند اما این ابزارها یک مشکل بزرگ داشتند: سربار زیاد منابع!
شرکت‌های تکنولوژی که علاقه‌ای به نابهینگی نداشته و همواره سعی در کمتر کردن مصرف منابع داشتند، برای حل این مسئله به تکنولوژی کانتینر روی آوردند.

تفاوت کانتینر با VM

VM vs Container

کانتینرها بسته‌هایی هستند که نرم‌افزار ما را به همراه تمام وابستگی‌هایی که دارد در خود نگه داشته و به ما اجازه می‌دهند که آن‌ها را به صورت مجزا از هم، بهینه و بدون هزینه زیاد اجرا کنیم. اما چطور؟ پیش از اینکه به سراغ این تکنولوژی جدید برویم بهتر است برای آشنایی بیشتر با تفاوت کانتینرها و VMها این ویدیو را تماشا کنید.

Docker

برای مدیریت کانتینرها و استفاده از آن‌ها روش‌ها و ابزارهای زیادی وجود دارد. یکی از این روش‌ها که از روش‌های دیگر مرسوم‌تر است، استفاده از Docker است. داکر به ما اجازه می‌دهد ایمیج بسازیم، کانتینرهای مختلف را اجرا کرده و آن‌ها را مدیریت کنیم. برای نصب داکر از آموزش اصلی آن در این لینک کمک بگیرید.

Image

ایمیج‌ها مثل یک نقشه برای اجرای یک کانتینر بوده و هر کانتینر باید از روی یک ایمیج خاص ساخته و اجرا شود. برای ساخت ایمیج‌ها ما باید آن‌ها را بوسیله یک زبان خاص توصیف کرده و با استفاده از آن توصیف ایمیج مورد نظر خود را بسازیم. برای توصیف یک ایمیج زبان‌های مختلفی وجود دارد، با توجه به اینکه ما از داکر برای یادگیری تکنولوژی کانتینر استفاده می‌کنیم، برای ساخت ایمیج نیز از داکرفایل که روش تعریف مورد استفاده داکر است بهره می‌بریم. برای آشنایی با داکرفایل و نحوه نوشتن آن، به این لینک سر زده و پس از ساخت ایمیج خود، با استفاده از این آموزش آن را با استفاده از دستور زیر اجرا کنید:

docker run {image_tag}

پس از یادگیری ساختار کلی داکرفایل می‌توانید برای آشنایی بیشتر با تمام دستورات آن به Dockerfile reference مراجعه کنید.

Moby; Docker Mascot

ورودی و خروجی

معمولا نرم‌افزارهای ما نیاز به ارتباط بر روی شبکه و ذخیره داده‌های فایلی دارند.

Volume

داده‌های درون کانتینرهایی که بوسیله داکر ایجاد می‌شوند، ماندگار نبود و بعد از پاک شدن کانتینر، از بین می‌روند. داکر برای حل این مسئله از Volume استفاده می‌کند. Volume ها به ما اجازه می‌دهند که قسمتی از فایل‌سیستم درون کانتینر را برای استفاده‌های بعدی، بر روی سیستم‌عامل میزبان ذخیره کنیم. برای آشنایی بیشتر با Volumeها و استفاده از آن‌ها به این لینک مراجعه کرده و تمرین آن را انجام دهید.

Network

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

اجرای چندین کانتینر مجزا

گفتیم که یکی از نیازمندی‌های مهم ما در اجرای نرم‌افزارهای بزرگ، اجرای دیتابیس‌ها و ابزارهای جانبی است که نرم‌افزار ما به آن‌ها نیاز دارد. یکی از راه‌های اجرای این ابزارها، استفاده از دستور docker run برای اجرای هر یک از کانتینرهاست. اما استفاده از این روش، به این دلیل که ممکن است دستورات اشتباه را بدون اینکه متوجه شویم وارد کنیم و یا دستورات درست را فراموش کرده یا گم کنیم، در طولانی مدت ما را دچار مشکل می‌کند. داکر برای حل این مسئله به ما اجازه می‌دهد که فایلی به نام Docker Compose بسازیم و تمامی نیازمندی‌های برنامه و ابزارهای جانبی مورد نیاز برای اجرا آن را در این فایل بنویسیم. با داشتن این فایل و نگهداری آن در گیت هر بار که نیاز به اجرای نرم‌افزارمان داشتیم، با دادن این فایل به داکر، می‌توانیم محیط مورد نیازمان را ایجاد و از آن استفاده کنیم. برای یادگیری Docker Compose و روش استفاده از آن می‌توانید این آموزش را دنبال کنید.
پس از این برای شناخت بیشتر این فایل و قابلیت‌های آن می‌توانید به Compose file reference مراجعه کنید.