آشنایی با مفهوم کانتینر
دولوپرها همواره با این مشکل مواجه هستند که مثلاً اپلیکیشنی را روی سیستم خود کدنویسی، دیباگ، تست و اجرا کرده و از صحت عملکرد آن اطمینان حاصل میکنند اما همین که آن را به محیط یا پلتفرم دیگری همچون یک سرور دیپلوی میکنند، باگها و مشکلات عجیبوغریب بسیاری را تجربه میکنند و اینجا است که Container خودنمایی میکند. به عبارت دیگر، کانتینر این اطمینان را حاصل میکند که اپلیکیشن (نرمافزار) فارغ از اینکه روی چه پلتفرمی دیپلوی گردد، کاملاً به درستی اجرا گردد به طوری که روی سیستم دولوپر گرفته تا محیط تست، سرور مجازی یا حتی کلود عملکرد یکسانی خواهد داشت.
حال ممکن است این پرسش پیش آید که چه دلیلی ممکن است وجود داشته باشد که اپلیکیشن پس از دیپلوی در محیطهای مختلف به درستی اجرا نگردد. در پاسخ به این سؤال فرض کنیم اپلیکیشنی نوشتهایم که در حین فرایند توسعه، نسخهٔ 7.1 PHP روی لپتاپمان نصب بوده است و از برخی ویژگیهای این نسخه همچون اپراتور ??
در کدهای خود استفاده کردهایم. حال زمانی که پروژه را روی سرور اصلی که نسخهٔ PHP 5.6 را دارا است دیپلوی میکنیم، مسلماً به مشکل برخورد خواهیم کرد.
اینجا است که کانتینر به کمک تیمهای توسعهٔ نرمافزار میآید به طوری که این فناوری شامل یک محیط اجرای کامل است که اپلیکیشن به انضمام کلیهٔ وابستگیهایش منجمله لایبرریها، فریمورکها، فایلهای پیکرهبندی و غیره را شامل میشود که در قالب یک پکیج عرضه میشوند (در واقع، وجه تسمیهٔ کانتینرها به خاطر شباهتی است که با کانتینرهایی دارند که در تصویر فوق مشاهده میشوند. به عبارت دیگر، هر کانتینر محیطی کاملاً مجزا است که داخل آن کالاهای مختلفی را میتوان قرار داد اما این در حالی است که تمامی کانتینرها روی یک پلتفرم واحد، کشتی، قرار دارند.)
آشنایی با تفاوتهای کانتینر و ماشین مجازی
با استفاده از فناوری Virtualization (مجازیسازی)، پکیجی که در بالا بدان اشاره شد را در قالب یک Virtual Machine (ماشین مجازی) مابین پلتفرمهای مختلف میتوان جابهجا کرد و این در حالی است که این ماشین مجازی حاوی یک سیستمعامل کامل + اپلیکیشن و وابستگیهایش است:
همانطور که در تصویر فوق ملاحظه میشود، سروری که سه ماشین مجازی روی آن در حال اجرا است در واقع سه سیستمعامل مجزا از یکدیگر روی آن در حال اجرا میباشد اما در مقابل سروری که چهار کانتینر روی آن وجود داشته باشد، صرفاً یک سیستمعامل وجود خواهد داشت و هر یک از کانتینرها، کِرنِل سیستمعامل را به صورت اشتراکی مورد استفاده قرار خواهد داد. به عبارت دیگر، کانتینرها به مراتب سبکتر از ماشینهای مجازی خواهند بود و منابع کمتری استفاده خواهند کرد. همچنین سیستمعامل به منظور مدیریت بهینهتر کل سیستم میزان دسترسی هر کانتینر به منابع سیستمی همچون RAM و CPU را محدود میسازد تا یک کانتینر بهخصوص نتواند تمامی منابع سیستمی را استفاده کرده و بالتبع سایر کانتینرها به مشکل برخورند.
مزایای استفاده از کانتینرها چیست؟
با توجه به اینکه حجم کانتینرها خیلی کمتر از ماشینهای مجازی است، یک سرور به سادگی قادر خواهد بود تعداد کانتینر به مراتب بیشتری نسبت به ماشین مجازی را روی خود میزبانی کند و نیاز به توضیح نست که حجم هر ماشین مجازی ممکن است به چند گیگابایت برسد اما حجم اکثر کانتینرها نهایتاً به چند صد مگابایت خواهد رسید.
نکتهٔ دیگری که در ارتباط با مزیتهای کانتینرها وجود دارد این است که ماشینهای مجازی زمان نسبتاً قابلتوجهی برای بوت شدن سیستمعاملشان نیاز دارند و این در حالی است که کانتینرها خیلی سریعتر اجرا میشوند چرا که کانتینر صرفاً یک Process (پروسه) روی سیستمعاملی میباشد که در حال اجرا است (برای آشنایی بیشتر با این اصطلاح، به آموزش درآمدی بر Process در لینوکس مراجعه نمایید.)
همچنین این امکان فراهم شده تا اصطلاحاً یک ایمِج از کانتینری را به عنوان کانتینر بِیس (پایه) در نظر گرفته و دیگر ایمِجها وابسته به آن باشند. به عبارت دیگر، میشود یک ایمِج پایهای که شامل سیستمعامل، فایلهای پیکربندی و دیگر وابستگیها همچون لایبرریها و فریمورکها میباشد را ایجاد کرد سپس تیم توسعهٔ نرمافزار صرفاً ایمِجی حاوی سورسکد اپلیکیشن که مبتنی بر آن ایمِج پایهای است را ایجاد کنند و همین مسئله مجدداً منجر به سرعت توسعهٔ دیپلوی نرمافزار خواهد شد.
مزیت دیگر استفاده از کانتینرها امکان بهره بردن از اپلیکیشنهای ماژولار است. به عبارت دیگر، به جای اجرای یک اپلیکیشن حجیم و پیچیده در قالب یک کانتینر، میتوان اپلیکیشن خود را به صورت یکسری ماژول مجزا که اصطلاحاً تحت عنوان میکروسرویس شناخته میشوند طراحی کرده و هر یک از آنها را به عنوان یک پکیج روی سرور قرار داد به طور کلی، اپلیکیشنهایی که با معماری میکروسرویس طراحی میشوند به مراتب سادهتر مدیریت میشوند و در صورت نیاز به اِعمال تغییر در یکی از ماژولها، اصلاً نیازی به بیلد کردن مجدد کل اپلیکیشن نخواهد بود.
نسخهبندی کانتینرها هم یکی دیگر از مزیتهای این فناوری است. در واقع، میشود برای هر کانتینر یک ورژن در نظر گرفت، تفاوت ورژنهای مختلف با یکدیگر را مشخص ساخت و در صورت نیاز، به ورژنهای قبلی کانتینرها اصطلاحاً Roll-back (بازگشت) کرد.
به طور کلی، با استفاده از فناوری کانتینر به سادگی قادر خواهیم بود تا بدون اینکه نیاز داشته باشیم تا سرورهای مختلف را بسته به نیازمندیهای اپلیکیشن خود کانفیگ کنیم، با خیال راحت یک اپلیکیشن را دیپلوی کنیم و همین مسئله سرعت انتشار نسخههای جدید اپلیکیشن را بالا خواهد برد.
نقاط ضعف کانتینرها چیست؟
با توجه به اینکه کانتینرها مستقل از سیستمعامل نیستند و چندین کانتینر از یک سیستمعامل واحد استفاده میکند، تهدیدات امنیتی به نسبت فناوری مجازیسازی پررنگتر است. البته برخی سرویسها همچون داکر ادعا میکنند که کاملاً اپلکیشنها را هم نسبت به یکدیگر و هم نسبت به پلتفرمی که کانتینرها روی آن اجرا میشوند ایزوله میکنند که این مسئله امنیت مورد نیاز را ایجاد خواهد کرد. نقطه ضعف دیگری که متوجه کانتینرها است، مجدد به وابستگی آنها به یک سیستمعامل باز میگردد. به عبارت دیگر، کانتینری که مبتنی بر پلتفرم لینوکس طراحی شده باشد، قابلاجرا روی یک پلتفرم ویندوزی نیست (Docker به نوعی با فناوری کانتینر عجین شده است چرا که این سرویس در آگاهیرسانی در مورد کانتینرها نقش بسزایی داشت. در واقع، همانطور که دهها پیش محصول تاید وارد ایران شد و امروزه هم میبینیم که برخی از سالمندان به هر نوعی از شویده میگویند تاید، در صنعت توسعهٔ نرمافزار هم ماجرا در مورد کانتینر و داکر تکرار شده است!)
جمعبندی
در پاسخ به این پرسش که «آیا کانتینرها کاملاً جای ماشینهای مجازی را خواهند گرفت؟» باید اعتراف کرد که جواب شفافی وجود ندارد اما از شواهد امر برمیآید که چنین چیزی حداقل به یک دلیل در آیندهٔ نزدیک امکانپذیر نخواهد بود و آن هم اینکه چیزی که کماکان فناوری مجازیسازی را محبوب نگاه داشته این است که به دلیل ایزولهتر بودن ماشینهای مجازی نسبت به کانتینرها، برخی بر این باورند که ماشینهای مجازی امنتر میباشند اما به هر حال مزیتهای کانتینرها به اندازهای بوده که امروزه کسبوکارهای بزرگی همچون مایکروسافت، گوگل، آمازون و غیره شروع به سرمایهگذاری روی این فناوری کردهاند.