Container (کانتینر) چیست و چه تفاوت‌هایی با Virtual Machine (ماشین مجازی) دارد؟

Container (کانتینر) چیست و چه تفاوت‌هایی با Virtual Machine (ماشین مجازی) دارد؟

امروزه کمتر کسی را می‌توان یافت که حوزهٔ آی‌تی فعالیت کند و نام Docker را نشنیده باشد؛ داکر که از سال ۲۰۱۳ به دنیا عرضه شد، فناوری‌ای را در اختیار دولوپرها قرار می‌دهد تحت عنوان Container که با استفاده از آن به مراتب ساده‌تر از ماشین‌های مجازی، می‌توانید نرم‌‌افزارهای خود را روی پلتفرم‌های مختلف اجرا کنید.

Container (کانتینر) چیست؟
دولوپرها همواره با این مشکل مواجه هستند که مثلاً اپلیکیشنی (در اینجا منظور اپ موبایل نبوده بلکه هر نرم‌افزاری شامل می‌گردد) را روی لپ‌تاپ خود کدنویسی، دیباگ، تست و اجرا کرده و از صحت عملکرد آن اطمینان حاصل می‌کنند اما همین که نرم‌افزار را به محیط یا پلتفرم دیگری همچون یک سرور منتقل می‌کنند، باگ‌ها و مشکلات عجیب و غریب بسیاری را تجربه می‌کنند و اینجا است که کانتینر خودنمایی می‌کند. به عبارت دیگر، کانتینر این اطمینان را حاصل می‌کند که نرم‌افزار فارغ از اینکه روی چه پلتفرمی دیپلوی گردد، کاملاً به درستی اجرا گردد (از روی سیستم دولوپر گرفته تا محیط تست،‌ سرور مجازی یا حتی کلود).

حال ممکن است این سؤال پیش بیاید که چه دلیلی ممکن است وجود داشته باشد که اپلیکیشن پس از دیپلوی در محیط‌های مختلف، به درستی اجرا نگردد. در پاسخ به این سؤال بایستی گفت که فرض کنیم اپلیکیشنی نوشته‌ایم که در حین فرایند توسعه، نسخهٔ ۷.۱ از زبان برنامه‌نویسی PHP روی لپ‌تاپ‌مان نصب بوده است و از برخی ویژگی‌های این نسخه همچون اپراتور ?? در کدهای خود استفاده کرده‌ایم. حال زمانی که پروژه را روی سرور اصلی که نسخهٔ PHP آن ۵.۶ است دیپلوی می‌کنیم، مسلماً به مشکل برخورد خواهیم کرد (و یا فرض کنیم که پروژه را روی لپ‌تاپی که لینوکس اوبونتو رویش نصب بوده توسعه داده اما سرور اصلی نسخه‌ای از توزیع دبیان دارد).

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

تفاوت کانتینر با ماشین مجازی چیست؟
با استفاده از فناوری Virtualization (مجازی‌سازی)،‌ پکیجی که در بالا بدان اشاره شد را در قالب یک Virtual Machine (ماشین مجازی) مابین پلتفرم‌های مختلف می‌توان جابه‌جا کرد و این در حالی است که این ماشین مجازی حاوی یک سیستم‌عامل کامل + اپلیکیشن و وابستگی‌هایش است.

 Container (کانتینر) چیست و چه تفاوت‌هایی با Virtual Machine (ماشین مجازی) دارد؟

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

به منظور مدیریت بهینه‌تر کل سیستم، همچنین سیستم‌عامل میزان دسترسی هر کانتینر به منابع سیستمی همچون RAM و CPU را محدود می‌سازد تا یک کانتینر به‌خصوص نتواند تمامی منابع سیستمی را استفاده کرده و بالتبع سایر کانتینرها به مشکل برخورند.

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

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

همچنین این امکان فراهم شده تا اصطلاحاً یک Image از کانتینری را به عنوان کانتینر Base (اصلی) در نظر گرفته و دیگر ایمج‌ها وابسته به آن باشند. به عبارت دیگر، می‌شود یک ایمج پایه‌ای که شامل سیستم‌عامل، فایل‌های پیکربندی و دیگر وابستگی‌ها همچون لایبرری‌ها و فریمورک‌ها بوده را ایجاد کرد سپس تیم توسعهٔ نرم‌افزار صرفاً ایمجی حاوی سورس‌کد اپلیکیشن که مبتنی بر آن ایمج پایه‌ای است را ایجاد کنند و همین مسئله مجدداً منجر به سرعت توسعه‌ٔ دیپلوی نرم‌افزار خواهد شد.

مزیت دیگر استفاده از کانتینرها، امکان بهره بردن از اپلیکیشن‌های ماژولار است. به عبارت دیگر، به جای اجرای یک اپلیکیشن حجیم و پیچیده در قالب یک کانتینر، می‌توان اپلیکیشن خود را به صورت یکسری ماژول مجزا و ناوابسته (میکروسرویس) به یکدیگر طراحی کرده و هر یک از آنها را به عنوان یک پکیج کانتینر روی سرور قرار داد (برای آشنایی بیشتر با مفهوم میکروسرویس، به مقالهٔ میکروسرویس (Microservice) چیست؟ مراجعه نمایید). به طور کلی، اپلیکیشن‌هایی که با معماری میکروسرویس طراحی می‌شوند به مراتب ساده‌تر قابل مدیریت بوده و در صورت نیاز به اعمال تغییر در یکی از ماژول‌ها، اصلاً نیاز به بیلد کردن مجدد کل اپلیکیشن نخواهد بود.

نسخه‌بندی کانتینرها هم یکی دیگر از مزیت‌های این فناوری است. در واقع می‌شود برای هر کانتینر یک ورژن در نظر گرفت، تفاوت ورژن‌های مختلف با یکدیگر را مشخص ساخت و در صورت نیاز، به ورژن‌های قبلی کانتینرها اصطلاحاً Roll-back (بازگشت) کرد.

در سرویس‌هایی همچون EC2 Container Service آمازون، این کمپانی ادعا می‌کند که کانتینرهای شما هرچقدر منابع سیستمی استفاده کنند، همان‌قدر پول پرداخت خواهید کرد و ویژگی‌هایی از این دست، بیش از پیش به میزان محبوبت کانتینرها افزوده‌اند.

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

نقطه ضعف کانتینرها چیست؟
باتوجه به اینکه کانتینرها مستقل از سیستم‌‌عامل نیستند و چندین کانتینر از یک سیستم‌عامل واحد استفاده می‌کند، تهدیدات امنیتی به نسبت فناوری مجازی‌سازی به مراتب راحت‌تر در سیستم پخش می‌گردد. البته برخی سرویس‌ها همچون Docker ادعا می‌کنند که کاملاً اپلکیشن‌ها را هم نسبت به یکدیگر و هم نسبت به پلتفرمی که کانتینرها روی آن اجرا می‌شوند ایزوله می‌کنند که این مسئله امنیت مورد نیاز را ایجاد خواهد کرد (راه‌کاری هم که برخی ارائه می‌دهند، ترکیب فناوری‌های مجازی‌سازی با کانتینرها است بدین صورت که می‌شود امنیت ماشین‌های مجازی را با سبکی و مدیریت آسان کانتینرها با یکدیگر ادغام کرد).

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

ارتباط مابین Container و Docker چیست؟
سرویس تجاری Docker به نوعی با فناوری کانتینر عجین شده است چرا که این سرویس در آگاهی‌رسانی در مورد کانتینرها نقش‌ بسزایی داشته است و این در حالی است که مفهوم کانتینر از ده‌ها سال قبل از لینوکس بوده است (در واقع همان‌طور که بیش از ۵۰ سال پیش محصول تاید وارد ایران شد و امروزه هم می‌بینیم که برخی از سالمندان به هر نوعی از شویده می‌گویند تاید، امروزه هم ماجرا در مورد کانتینر و داکر تکرار شده است).

سرویس‌های ارائه دهندهٔ تکنولوژی کانتینر کدامند؟
از سرویس‌های اپن‌سورس و رایگان گرفته تا سرویس‌های اینترپرایز (تجاری)، دولوپرها می‌توانند بسته به میزان بودجه و نیازمندی‌های خود از سرویس‌های مختلفی استفاده کنند که در ادامه برخی از مهم‌ترین آنها را معرفی خواهیم کرد:

Kubernetes: این سرویس به عنوان شناخته‌شده‌ترین و معروف‌ترین کانتینر اپن‌سورس و رایگان است که اولین نسخه‌های آن در کمپانی گوگل طرح‌ریزی شد.

(Docker (EE: نسخهٔ Docker Enterprise Edition را به نوعی می‌توان معروف‌ترین پلتفرم اینترپرایز فناوری کانتینر معرفی کرد. داکر علاوه بر لینوکس، روی سیستم‌عامل ویندوز، آژور و غیره هم قابل‌اجرا است.

Tectonic: این سرویس محصولی از CoreOS است که بر پایهٔ Kubernetes ساخته شده که سازگار با سرویس‌های AWS، Azure و VMWare است.

Open Shift Container Platform: این سرویس کانتینر محصولی از شرکت Red Hat است که مبتنی بر Kubernetes و لینوکس توزیع Red Hat Enterprise می‌باشد.

Rancher: این سرویس هم مبتنی بر Kubernetes است که به گفتهٔ سایت رسمی‌اش، ۱۰۰٪ اپن‌سورس است.

آشنایی با توزیع‌های لینوکسی مناسب اجرای کانتیرها
به نظر می‌رسد برخی از توزیع‌های لینوکسی دارای فیچرهایی اضافی هستند که برای اجرای کانتیرها غیرضروری می‌باشند. در همین راستا، یکسری توزیع سبک از لینوکس کاملاً اختصاصی برای میزبانی کردن کانتینرها به بازار عرضه شده‌اند که برخی از مهم‌ترین آنها عبارتند از:

Container Linux: این توزیع پیش از این تحت عنوان CoreOS شناخته می‌شد که به عنوان یکی از اولین توزیع‌هایی است که اختصاصاً برای میزبانی کانتینرها طراحی شده است.

RancherOS: این توزیع محیطی قابل‌اعتماد و در عین حال با مدیریتی ساده برای میزبانی کانتینرها در اختیار دولوپرها می‌گذارد.

Photon OS: توزیعی سبک از لینوکس است که توسط کمپانی VMWare عرضه شده است که اختصاصاً برای میزبانی پلتفرم‌های VMWare طراحی شده است.

Ubuntu Core: توزیعی کوچک و سبک از سیستم‌عامل محبوب اوبونتو است که برای فناوری‌های اینترنت اشیاء و کانتینرها عرضه شده است. 

آیا کانتینرها کاملاً جای ماشین‌های مجازی را خواهند گرفت؟
پاسخ به چنین سؤالی کار آسانی نیست اما از شواهد امر برمی‌آید که چنین چیزی به چند دلیل حداقل در آیندهٔ نزدیک امکان‌پذیر نخواهد بود. اولین چیزی که کماکان فناوری مجازی‌سازی را محبوب نگاه داشته این است که به دلیل ایزوله‌تر بودن ماشین‌های مجازی نسبت به کانتینرها، برخی بر این باورند که ماشین‌های مجازی امن‌تر می‌باشند. اما به هر حال مزیت‌های کانتینرها به اندازه‌ای بوده که امروزه کسب‌وکارهای بزرگی همچون مایکروسافت، گوگل، آمازون و غیره شروع به سرمایه‌گذاری روی این فناوری کرده‌اند.

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