کانتینر چیست؟
کانتینر (Container) در دنیای کامپیوتر به یک واحد نرمافزاری استاندارد گفته میشود که اپلیکیشن را به همراه تمام کدها، کتابخانهها، وابستگیها و فایلهای پیکربندی بستهبندی کرده و اجرای صحیح آن روی تمام محیطهای پردازشی را تضمین میکند. کانتینرها بدون نیاز به ماشین مجازی میتوانند مستقیما به هسته سیستمعامل دسترسی پیدا کنند و در مقایسه با ماشین مجازی، مزایای بسیار زیادی دارند. اگر میخواهید بدانید کانتینر چیست و چطور کار میکند، در ادامه این مطلب با ما همراه باشید.
کانتینر چیست؟
Container یک بسته نرمافزاری است که تمام اجزای ضروری برای اجرای اپلیکیشن روی هر محیطی را در خود دارد. اپلیکیشنی که به صورت کانتینر ارائه میشود را میتوان روی کامپیوتر شخصی، سرویسهای کلاد عمومی یا دیتاسنتر سازمانی اجرا کرد. کانتینر از نوعی مجازیسازی سیستمعامل (OS Virtualization) بهره میبرد و امکان توسعه و انتشار اپلیکیشنها با بهینگی و سرعت بالا را ممکن میسازد. از معروفترین محصولات این حوزه میتوان به داکر (Docker) و کوبرنتیز (Kubernetes) اشاره کرد که به احتمال فراوان نام آنها را شنیدهاید. برای شروع موضوع جذاب کانتینرها بیایید ابتدا تاریخچه این فناوری را مرور کنیم.
نگاهی به پیشینه فناوری کانتینر
تاریخچه این فناوری به سالها قبل یعنی اواخر دهه ۱۹۷۰ میلادی برمیگردد. در سال ۱۹۷۹ میلادی سیستمعامل یونیکس نسخه هفت (Unix V7) با سیستم تغییر مسیر ریشه (chroot یا Change Root) معرفی شد. سیستم chroot با محدود کردن دسترسی اپلیکیشن به یک دایرکتوری خاص و زیردایرکتوریهای آن، امکان جداسازی فرایندهای سیستم را ممکن میساخت. این سیستم بهسرعت محبوبیت بالایی پیدا کرد و در سال ۱۹۸۲ میلادی به سیستمعامل BSD نیز راه یافت. با این حال فناوری Container به مدت دو دهه پیشرفت خاصی نکرد.
روزهای نخست فناوری کانتینر
شکوفایی فناوری Container در دهه ۲۰۰۰ میلادی و با معرفی مفهوم زندان (Jail) در سیستمعامل فری بیاسدی (Free BSD) آغاز شد. این فناوری در سال ۲۰۰۱ و با عرضه راهکار تقسیمبندی منابع سیستم در VServer لینوکس بهبود یافت. در سال ۲۰۰۴ سیستمعامل سولاریس (Solaris) نیز فناوری مشابهی به نام سولاریس را معرفی کرد. دو سال بعد یعنی در سال ۲۰۰۶ میلادی فناوری سیگروپس (CGroups) یا گروههای کنترلی به هسته لینوکس اضافه شد. گروههای کنترلی لینوکس امکان جداسازی استفاده از منابع مانند سیپییو (CPU) و حافظه رم (RAM) را فراهم میکردند. در سال ۲۰۰۸ میلادی کاملترین و پایدارترین فناوری کانتینر در دنیای کامپیوتر بهنام «کانتینرهای لینوکس» (LXC یا LinuX Containers) عرضه شد. بهخاطر پایداری و عملکرد مطمئن کانتینرهای لینوکس، بسیاری از فناوریهای بعدی بر اساس LXC ساخته شدهاند که بین آنها میتوان به واردن (Warden) و مهمتر از همه، داکر (Docker) اشاره کرد.
عصر طلایی فناوری کانتینر
اگرچه این فناوری در سالهای ۲۰۰۰ تا ۲۰۱۱ میلادی رشد قابل توجهی داشت، اما معرفی داکر را میتوان آغازگر عصر طلایی این فناوری دانست. داکر بر مبنای دو فناوری توسعه یافت: کانتینرهای لینوکس (LXC) و لیبکانتینرز (Libcontainers). داکر علاوه بر این فناوریها به رابط کاربری گرافیکی سادهای مجهز شده بود و از سیستمعاملهای مختلف نیز پشتیبانی میکرد. به همین دلیل این نرمافزار توانست در سال نخست عرضه به بیش از ۱۰۰ میلیون کاربر دست پیدا کند. پس از موفقیت داکر، محصول دیگری بهنام راکت (rkt که Rocket تلفظ میشود) عرضه شد تا بعضی از مشکلات داکر را حل کند و قابلیتهای امنیتی را به آن اضافه نماید.
محبوبیت این دو ابزار پس از همکاری با «بنیاد محاسبات بومی ابری» (CNCF) که یکی از مراجع توسعهدهندهها محسوب میشود، بیشتر شد. مایکروسافت در سال ۲۰۱۶ امکان اجرای بومی کانتینرهای لینوکس (شامل راکت و داکر) روی ویندوز را ممکن ساخت. در سال ۲۰۱۷ کوبرنتیز معرفی شد که در حال حاضر یکی از مهمترین ابزارهای مدیریت Container در این حوزه محسوب میشود.
کانتینر چگونه کار میکند؟
تا اینجای مطلب «کانتینر چیست» با ماهیت این فناوری و تاریخچه آن آشنا شدیم. Container بهشکل یک فایل قابل اجرا عرضه میشود که به آن ایمیج (image) میگویند. ایمیج شامل اطلاعاتی است که در زمان اجرا در سیستمعامل به اجرا درمیآیند. اپلیکیشنهای کانتینری یا مبتنی بر کانتینر میتوانند از چند ایمیج تشکیل شده باشند. مثلا اپلیکیشنهای سه کانتینری میتوانند شامل کانتینرهای وب سرور فرانتاِند، سرور اپلیکیشن و دیتابیسها باشند که هرکدام بهطور مستقل اجرا میشوند. همچنین میتوان چند نمونه از یک ایمیج کانتینر را بهطور همزمان اجرا کرد. توسعهدهندگان از کانتینرها برای تسریع فرآیند توسعه و تست اپلیکیشنها استفاده میکنند.
همانطور که گفتیم کانتینرها تمام اجزای ضروری برای اجرای نرمافزار را در خود دارند. این اجزا شامل فایلها، متغیرهای محیطی، وابستگیها و کتابخانهها هستند. مدیریت دسترسی Container به منابع فیزیکی سیستم در اختیار سیستمعامل است تا هر Container نتواند تمام قدرت پردازش CPU یا حافظه رم را اشغال کند.
فایلهای ایمیج کانتینر بهشکل نسخههایی کامل، ایستا و قابل اجرا از اپلیکیشن یا سرویس عرضه میشوند و قالب آنها در فناوریهای مختلف با یکدیگر فرق میکند. بهعنوان مثال ایمیجهای داکر از چند لایه تشکیل شدهاند که لایه زیرین یا بیس، تمام وابستگیهای مورد نیاز برای اجرای کد در یک Container را در خود دارد. هر ایمیج از یک لایه ایستا و غیر قابل تغییر و یک لایه قابل خواندن/نوشتن تشکیل شده است. در کانتینرهای استاندارد پروژه کانتینر باز (OCI یا Open Container Initiative) که در سال ۲۰۱۵ توسط داکر راهاندازی شد، ایمیجها شامل یک مانیفست، لایههای سیستم فایل و پیکربندیها میشوند.
برای اجرای کانتینرها از ابزاری بهنام «کانتینر انجین» (Container Engine) استفاده میشود و بسیاری از سازمانها از ابزارهای مدیریتی کانتینر مانند کوبرنتیز بهره میگیرند. مهمترین ویژگی کانتینرها قابلیت انتقال آنهاست، چون هر ایمیج تمام وابستگیهای مورد نیاز برای اجرای کد را در خود دارد. بنابراین کاربران میتوانند یک ایمیج را روی زیرساختهای مختلف مانند سرور ابری، سرورهای داخلی و حتی کامپیوترهای شخصی اجرا کنند.
انواع کانتینر چیست؟
قبل از صحبت در مورد انواع Container، باید به این نکته اشاره کنیم که کانتینرها را میتوان به دو دسته اپلیکیشن (Application) و سیستمعامل (OS) یا سیستمی تقسیم کرد. کانتینر سیستمعامل از نظر کارکرد، شباهت زیادی به ماشین مجازی دارد اما بهینهتر عمل میکند. در کانتینر سیستمعامل میتوان اپلیکیشنها و کتابخانههای مختلف را نصب، پیکربندی و اجرا کرد. کانتینر سیستمی امکان اجرای همزمان پروسههای مختلف روی یک سیستمعامل را نیز فراهم میکند. در مقابل، کانتینر اپلیکیشن برای بستهبندی و اجرای یک سرویس طراحی میشود.
تفاوت ماشین مجازی و کانتینر چیست؟
مهمترین تفاوت بین ماشین مجازی (VM یا Virtual Machine) و کانتینر در سطح مجازیسازی آنهاست. ماشین مجازی یک سیستم سختافزاری را بهطور کامل تا سطح سختافزار مجازیسازی کرده و در اختیار اپلیکیشن قرار میدهد. هر ماشین مجازی یک سیستمعامل را در محیطی مستقل اجرا میکنند و برای این کار از منابع فیزیکی سرور مانند سیپییو، حافظه، فضای ذخیرهسازی و شبکه بهره میگیرند.
از آنجا که هر ماشین مجازی باید یک سیستمعامل را اجرا کند، به منابع فیزیکی زیادی نیاز دارد و فضای بسیار بیشتری را اشغال میکند. معمولا حجم ماشین مجازی را با مقیاس گیگابایت بیان میکنند اما این رقم برای کانتینرها بر حسب مگابایت است. در واقع شما روی یک سیستمعامل میتوانید تعداد زیادی Container را اجرا کنید اما برای اجرای هر ماشین مجازی به یک سیستمعامل نیاز خواهید داشت. همچنین سیستمعاملی که Container را اجرا میکند، حجم و قابلیتهای کمتری دارد.
آشنایی با ابزارهای کانتینر
از آنجا که فناوری Container در حال حاضر با نام «داکر» شناخته میشود، ما هم ابتدا به سراغ این پلتفرم معروف میرویم.
داکر (Docker)
داکر یکی از معروفترین و پرکاربردترین پلتفرمهای Container با قابلیت مجازیسازی در سطح سیستمعامل است. این پلتفرم امکان توسعه، اجرا و مدیریت کانتینرها روی سرور یا کلاد را فراهم میکند و با زبان برنامهنویسی «گو» (Go) نوشته شده است. داکر در ابتدا برای لینوکس توسعه یافته بود اما اکنون از تمام انواع سیستمعامل مانند ویندوز و مکدیواس نیز پشتیبانی میکند.
از مزایای داکر میتوان به امنیت بالای کانتینرها، پشتیبانی از تمام انواع اپلیکیشنها، سیستمعاملها، زیرساختها و ابزارهای مدیریتی، اپنسورس بودن و پلاگینهای مختلف برای افزایش کارایی اشاره کرد. البته بسیاری معتقدند راهاندازی اولیه داکر کار دشواریست و یادگیری آن نیز به زمان زیادی نیاز دارد.
مایکروسافت هایپر-وی (Hyper-V) و کانتینرهای ویندوز سرور
مایکروسافت بهعنوان یکی از بزرگترین شرکتهای نرمافزاری دنیا نیز فناوریهای خود را در این زمینه عرضه کرده است که هایپر-وی (Hyper-V) و کانتینرهای ویندوز سرور دو مورد از آنها هستند. این دو فناوری عملکردی مشابه یکدیگر دارند و از ایمیجهای کانتینر یکسانی استفاده میکنند اما از نظر سطح جداسازی (isolation) تفاوت دارند. در کانتینرهای ویندوز سرور عملیات جداسازی از طریق فضای نام (namespace)، کنترل منابع و دیگر روشها صورت میگیرد اما کانتینرهای هایپر-وی بر اساس نمونههای اجرا شده روی یک ماشین مجازی سبک جدا میشوند. بنابراین هایپر-وی را میتوان یک کانتینر سیستمی در نظر گرفت.
گوگل کوبرنتیز (Kubernetes)
کوبرنتیز (Kubernetes) بهعنوان یکی از محصولات گوگل به استاندارد مدیریت کانتینرها تبدیل شده است. این ابزار میتواند تمام مراحل توسعه و اجرای کانتینرها را برعهده بگیرد و محصولات زیادی بر اساس آن توسعه پیدا کردهاند که بین آنها میتوان به رنچر (Rancher)، ردهت اپن شیفت (Red Hat OpenShift) و پلتفرم ۹ اشاره کرد.
از ویژگیهای جالب کوبرنتیز میتوان به احراز هویت و مدیریت دسترسی از طریق اکانت گوگل، پشتیبانی از ایمیجهای داکر، پشتیبانی از پردازشگر گرافیکی (GPU) و رابط کاربری گرافیکی ساده اشاره کرد. امنیت بالا و راهاندازی ساده از طریق گوگل کلاد را نیز میتوان از نقاط قوت این پلتفرم دانست.
بیشتر بخوانید: کوبرنتیز چیست؟
کانتینرهای لینوکس (LXC)
کانتینرهای لینوکس (LXC یا Linux Containers) یکی از پلتفرمهای مجازیسازی در سطح سیستمعامل است که امکان اجرای تعداد زیادی Container مجزا روی سیستمهای مبتنی بر لینوکس را فراهم میسازد. LXC ابزاری اپنسورس محسوب میشود که تحت مجوز GNU LGPL منتشر شده است.
از مهمترین ویژگیهای LXC میتوان به API قدرتمند، ابزارهای ساده و کاربردی و البته رایگان بودن آن اشاره کرد. با این حال امنیت این ابزار در مقایسه با دیگر روشهای مجازیسازی سطح سیستمعامل چندان بالا نیست. همچنین LXC محدود به کانتینرهای لینوکس است و با سیستمعاملهای دیگر سازگار نیست.
پادمن (Podman)
پادمن (Podman) که توسط ردهت (RedHat) توسعه یافته، یک انجین کانتینر اپنسورس و بومی برای لینوکس است و یکی از بهترین جایگزینهای داکر محسوب میشود. از این ابزار میتوان برای توسعه، اجرا و مدیریت کانتینرهای OCI لینوکس و ایمیجهای کانتینر استفاده کرد. پادمن برخلاف بسیاری از ابزارهای این حوزه به دیمن (daemon) نیاز ندارد و از کانتینرهای بدون ریشه (rootless) نیز پشتیبانی میکند.
کانتینرد (Containerd)
کانتینرد (Containerd) یک رانتایم بسیار سبک و سریع برای اجرای کانتینرهاست و از رابط کاربری سادهای بهره میبرد. با استفاده از کانتینرد میتوانید چرخه عمر کانتینرها را بهطور کامل مدیریت کنید. این ابزار با دیگر پلتفرمهای مدیریت کانتینر از جمله کوبرنتیز نیز سازگار است. از مهمترین مزایای کانتینرد نسبت به داکر میتوان به حجم پایین و اپنسورس بودن آن اشاره کرد.
کانتینر بهعنوان سرویس (CaaS)
اکثر شرکتهای ارائه دهنده خدمات ابری، محصولاتی در قالب «کانتینر بهعنوان سرویس» (CaaS) عرضه کردهاند که بین آنها میتوان به موارد زیر اشاره کرد:
- سرویس کانتینر الاستیک آمازون (ECS یا Elastic Container Service)
- سرویس الاستیک کوبرنتیز (EKS یا Elastic Kubernetes Service)
- آمازون فارگیت (AWS Fargate)
- موتور کوبرنتیز گوگل (GKE یا Google Kubernetes Engine)
- نمونههای کانتینر اژور مایکروسافت (ACI یا Azure Container Instances)
- سرویس کوبرنتیز اژور (AKS یا Azure Kubernetes Service)
- سرویس کوبرنتیز ابری آیبیام (IBM Cloud Kubernetes Service)
- سرویس پلتفرم ابری زَس
کاربردهای متداول کانتینر چیست؟
کانتینرها بهترین گزینه برای توسعه مایکروسرویسها محسوب میشوند، چون هر سرویس در اپلیکیشن را میتوان در قالب یک Container مقیاسپذیر و مستقل بستهبندی و عرضه کرد. بهعنوان مثال یک اپلیکیشن مبتنی بر معماری مایکروسرویسها میتواند از سرویسهای مختلفی برای مدیریت اعلانها، ثبت اطلاعات، احراز هویت کاربران و دیگر موارد در قالب کانتینرها تشکیل شده باشد. تمام این سرویسها روی یک سیستمعامل اجرا میشوند و از همدیگر جدا هستند. هر سرویس بهطور جداگانه قابلیت افزایش یا کاهش مقیاس را دارد. زیرساختهای ابری نیز برای همین وضعیت یعنی مقیاسپذیری الاستیک و نامحدود طراحی شدهاند.
مزایای استفاده از کانتینر چیست؟
از آنجا که کانتینرها از هسته سیستمعامل بهعنوان میزبان استفاده میکنند، بسیار بهینهتر از ماشینهای مجازی هستند، چون هر ماشین مجازی (VM یا Virtual Machine) نیاز به سیستمعامل مستقل دارد.
کانتینرها در مقایسه با دیگر فناوریهای میزبانی اپلیکیشن، قابلیت جابجایی بیشتری دارند. اپلیکیشن مبتنی بر Container را میتوان بدون نیاز به تغییر کد در محیطهای مختلف اجرا کرد. در واقع کد اجرای اپلیکیشن به هیچ متغیر محیطی در سیستمعامل میزبان نیاز ندارد و کتابخانهها و وابستگیها را نیز با خود جابجا میکند.
مهمترین مزیت استفاده از کانتینرها را میتوان در استفاده بهینه از منابع سیستمعامل مانند سیپییو و حافظه رم جستجو کرد. کانتینرها فضای بسیار کمتری را در مقایسه با ماشینهای مجازی اشغال میکنند. به عنوان مثال روی یک میزبان ساده میتوانیم صدها Container را اجرا کنیم در حالی که تعداد ماشینهای مجازی قابل راهاندازی روی این زیرساخت فیزیکی به عدد انگشتان دست میرسد. دیگر عامل اصلی در برتری کانتینرها به پایداری آنها در چرخه عمر اپلیکیشن برمیگردد. بهخاطر این پایداری، فرایند توسعه سریع (agile) اپلیکیشنها بسیار سادهتر خواهد شد.
معایب استفاده از کانتینر چیست؟
یکی از معایب بالقوه استفاده از کانتینرها، وابستگی به سیستمعامل میزبان است. از آنجا که کانتینرها بهطور مشترک به هسته سیستمعامل میزبان دسترسی دارند، هرگونه رخنه امنیتی در Container میتواند کل سیستم را در معرض خطر قرار دهد. این موضوع در مجازیسازی سطح سختافزار و ماشینهای مجازی بسیار کمرنگتر است. البته برای رفع این مشکل میتوان کانتینرها را روی یک ماشین مجازی اجرا کرد تا فرد مهاجم تنها به سیستمعامل ماشین مجازی دسترسی داشته باشد.
مسئله دیگر به مانیتورینگ مربوط میشود. اجرای صدها Container روی یک سرور قابلیت بسیار کاربردی محسوب میشود اما نظارت بر اینکه در هر کدام از کانتینرها چه اتفاقی در حال وقوع است، دشوار خواهد بود.
جمعبندی
در مطلب کانتینر چیست با فناوری کاربردی کانتینر و مزایای آن نسبت به دیگر روشهای مجازیسازی آشنا شدیم. کانتینرها در تمام حوزههای کامپیوتر و فناوری اطلاعات بهکار میروند و در مقایسه با ماشینهای مجازی، عملکرد بهتری را ارائه میدهند. پلتفرمهای مدیریت Container مانند کوبرنتیز نیز کار شرکتها برای استفاده از کانتینرها را بسیار ساده کردهاند.
پیشبینی میشود که کانتینرها به حوزههای دیگری از جمله امنیت، شبکه و فضای ذخیرهسازی نیز راه پیدا کنند. در حال حاضر بعضی سازمانها در پی توسعه اپلیکیشنهای حالتمند (stateful) مانند اپلیکیشنهای دیتابیس و یادگیری ماشین در قالب Container هستند. بنابراین احتمالا در آینده از کانتینرها بیشتر خواهیم شنید.