مفهوم معماری کانتینر (Container) چیست؟ – به زبان ساده


شاید تاکنون از خود پرسیده باشید که کانتینرها چه تفاوتی با ماشینهای مجازی دارند؟ در این نوشته قصد داریم به معرفی کانتینرها و معماری کانتینر پرداخته و به این سؤال پاسخ دهیم. فناوری کانتینر به زودی به یک فناوری فراگیر تبدیل خواهد شد، زیرا ما هم اینک در عصر فناوری ابری (cloud) به سر میبریم و کانتینرها نیز یکی از فناوریهای کلیدی کلاود محسوب میشوند. مواردی که در این مقاله ارائه شدهاند را میتوان در فهرست زیر جمعبندی کرد:
- درک طرز کار سیستم عامل و کرنل که این دانش برای درک کانتینر ضروری است.
- طرز کار ماشینهای مجازی چگونه است؟
- ماهیت کانتینرها چیست؟
- مزایا و معایب کانتینرها کدام است.
- کاربردهای کانتینر نرمافزاری چیست؟
کانتینرها به عنوان اپلیکیشنهای نرمافزاری سبکوزن، مزیتهای مختلفی دارند که شامل کاهش زمان عرضه اپلیکیشن، مقیاسپذیری، سهولت مدیریت اپلیکیشن و پشتیبانی از آن و همچنین بهبود تجربه کاربری است.
پیش از آن که به بررسی مفهوم کانتینرها بپردازیم، باید با طرز کار سیستم عامل آشنا شویم. ما به طور خاص با نقش کرنل در قلب سیستم عامل آشنا خواهیم شد.
آشنایی با مفاهیم مقدماتی طرز کار سیستم عامل
سیستم عامل (OS) مهمترین نرمافزار هر سیستم رایانهای محسوب میشود. این بخش به مدیریت سختافزار رایانه میپردازد. به علاوه سیستم عامل مسئول مدیریت اپلیکیشنهای نرمافزاری است که کاربران نهایی و دیگر اپلیکیشنها با آن تعامل خواهند داشت.
سیستم عامل بستهای از اپلیکیشنهای نرمافزاری است.
سیستم عامل چند مسئولیت دارد که شامل زمانبندی وظایف، پردازشها، تخصیص حافظه است و همه این وظایف به طوری اجرا میشود که اپلیکیشنها بتوانند به طور مجزا از هم کار کنند. به علاوه یک لایه انتزاع برای شیوه تعامل اپلیکیشنها با منابع سختافزاری ارائه میکند.
امروزه چند سیستم عامل در دسترس ما قرار دارند که شامل مایکروسافت ویندوز، Mac OS، اندروید گوگل، و لینوکس اوبونتو میشود.
سیستم عامل بین اپلیکیشنهای نرمافزاری و سختافزار رایانه قرار میگیرد.
یک سیستم عامل شامل چند برنامه درونی است. در این جا منظور از برنامه دستورالعملهای صرف است. به این معنا یک برنامه وجود دارد که هسته اصلی سیستم عامل را تشکیل میدهد و به نام کرنل (kernel) شناخته میشود.
بدین ترتیب به بخش دوم این مقاله که به توصیف کرنل مربوط است میرسیم. کرنل نقش قلب سیستم عامل را ایفا میکند.
کرنل چیست؟
کرنل مهمترین برنامه یک سیستم عامل است. سیستم عامل اولیه یک رایانه به نام سیستم عامل میزبان شناخته میشود. روی این سیستم عامل میزبان میتوان سیستمهای دیگری را نیز اجرا کرد که در ادامه مقاله این وضعیت را توضیح میدهیم. این سیستمهای عامل اضافی به نام سیستم عامل میهمان شناخته میشوند.
کرنل را میتوان به مثابه پلی تصور کرد که اپلیکیشنهای نرمافزاری یک سیستم رایانهای را با پردازش دادهها روی سختافزار متصل میسازد.
اهمیت کرنل از این واقعیت ناشی میشود که در حیطه خاصی از حافظه که به خودش اختصاص داده قرار دارد. از این رو کرنل یک ناحیه اختصاصی از حافظه RAM را در اختیار دارد. این ناحیه از دیگر اپلیکیشنها جدا است. ماهیت طراحی کرنل به اپلیکیشنهای کاربر اجازه نمیدهد که کرنل سیستم عامل را دستکاری کرده یا خللی در آن وارد کنند.
زمانی که یک رایانه بوت میشود، کرنل یکی از نخستین برنامههای رایانه است که باید در سیستم رایانه بارگذاری شود. به علاوه کرنل تا زمانی که سیستم رایانهای خاموش شود، در حافظه باقی میماند.
کرنل در مرکز سیستم رایانهای و بین واحد پردازش مرکزی (CPU)، حافظه، سختافزار و اپلیکیشنهای کاربر قرار دارد.
کرنل ارتباط بین قطعههای سختافزاری مانند ماوس، صفحهکلید، نمایشگر، و پرینترها را برقرار میسازد. کرنل همچنین به تبدیل دستورالعملها برای CPU میپردازد. بدین ترتیب وظایف سطح پایین را به طرز مؤثری اجرا میکند.
دقت کنید که CPU دستورها را با تجزیه آنها به دستورهای فرعی اجرا میکند. CPU را میتوان به مثابه مغز رایانه تصور کرد.
نکته کلیدی که از روی نمودار فوق میتوان درک کرد این است که کرنل مسئول مدیریت حافظه در اپلیکیشنها است. این بخش اپلیکیشنها را راهاندازی کرده و در حافظه بارگذاری میکند و متعاقباً مسئولیت نگهداری از پردازشها را نیز بر عهده دارد.
مقدمه کوتاهی در مورد Hypervisor
کرنلها دسترسی نامحدودی دارند، در حالی که اپلیکیشنهای کاربر باید به از طریق پردازشهای دیگر به سختافزار دسترسی داشته باشند. یکی از این پردازشهای کلیدی به نام Hypervisor شناخته میشود. Hypervisor بین اپلیکیشنهای سیستم رایانهای و سختافزار فیزیکی قرار میگیرد. در نتیجه اگر اپلیکیشنی بخواهد با یک CPU تعامل داشته باشد، باید از سیستم عامل و سپس از Hypervisor عبور کند. در این طراحی چند مشکل پدید میآید که نیازمند توجه هستند. این موارد در ادامه ارائه شدهاند.
این طراحی چندلایه میتواند روی تجربه کاربری تأثیر منفی بگذارد. بدین ترتیب ما نمیتوانیم دو سیستم عامل میزبان را به طور همزمان روی یک سیستم سختافزاری اجرا کنیم. به علاوه یک اپلیکیشن میتواند موجب وقفه یا خللی در اپلیکیشنهای دیگر شود. راهاندازی زیرساخت سیستم سختافزاری زمانبر و پرهزینه است.
برای حل این مشکل و ایجاد صرفه جویی زمانی، بهبود قابلیت نگهداری، مقیاسپذیری، بهبود بیشتر تجربه کاربری و کاهش زمان عرضه یک اپلیکیشن، کانتینرها مطرح شدند. ما تا به این جا مشغول توضیح موارد مقدماتی جهت درک طرز کار کانتینرها و مزیتهایی که ارائه میکنند بودیم. پیش از آن که اندکی جلوتر برویم و کانتینرها را بهتر معرفی کنیم، باید درکی از یک مفهوم مهم دیگر به نام ماشین مجازی نیز داشته باشیم.
ماشینهای مجازی (VM)
ماشینهای مجازی اپلیکیشنهای نرمافزاری را از سختافزار یک سیستم رایانه جدا میسازند. ما میتوانیم یک سیستم رایانهای را با افزایش ماشین مجازی کلون کنیم. ماشین مجازی یک لایه انتزاع میسازد و پیچیدگیهای زیرساختی تشکیلدهنده اجزای سختافزاری را از دید پنهان نگاه میدارد. ماشینهای مجازی میتوانند برای بهرهبرداری از سیستمهای سختافزاری فیزیکی استفاده شوند. ماشین مجازی بیش از یک دهه است که به طور گستردهای در صنعت سختافزارهای محاسباتی مورد استفاده قرار میگیرد. به این ترتیب یک پردازش hypervisor ماشینهای مجازی را اجرا میکند.
یک ماشین مجازی اقدام به ساخت یک سیستم سختافزاری مجازی میکند.
ما میتوانیم یک ماشین مجازی را روی یک سیستم عامل مایکروسافت ویندوز اجرا کنیم و یک سیستم عامل لینوکس را روی آن نصب نماییم. بدین ترتیب انعطافپذیری زیادی در اختیار کاربران IT قرار میگیرد.
ماشین مجازی را میتوان نسخهای از سیستم عامل دانست
سیستمهای عامل میهمان همگی روی یک سیستم عامل میزبان نصب میشوند. هر سیستم عامل میهمان درون یک ماشین مجازی مجزا راهاندازی میشود.
نصب، توزیع و تکرار یک ماشین مجازی ارزانتر از خرید یک مجموعه کامل از زیرساختها است. بدین ترتیب میتوان یک اپلیکیشن خاص را روی یک ماشین مجازی نصب کرد. این فرایند نیازمند یک سیستم عامل مجزا (که سیستم عامل میزبان نامیده میشود) است تا بتوانیم اپلیکیشنها را روی یک ماشین مجازی اجرا کنیم.
در نتیجه ماشینهای مجازی سیستم عامل میهمان خاص خود را دارند که شامل کرنل، درایورها، و فایلهای باینری اپلیکیشنها هستند. متعاقباً ماشین مجازی روی یک hypervisor عمل میکند که آن نیز به نوبه خود روی سیستم عامل میهمان اجرا میشود. در نتیجه اگر یک اپلیکیشن بخواهد با یک CPU تعامل داشته باشد، باید از سد سیستم عامل و سپس hypervisor عبور کند.
گذر از hypervisor و سیستم عامل میزبان میتواند تأثیر منفی روی تجربه کاربری داشته باشد.
ماشینهای مجازی مشکلاتی را نیز دارند چون نه تنها نیازمند حافظه سنگینی هستند؛ بلکه مشکل تکراری بودن اپلیکیشنهای باینری بین ماشینهای مجازی مختلف نیز وجود دارد. به علاوه در این وضعیت زمان بیشتری برای بوت شدن یک ماشین مجازی مورد نیاز است.
سناریوی اول
تصور کنید میخواهید دو ماشین مجازی را درون سیستم عامل ویندوز اجرا کنید. به علاوه قصد دارید کد سرور (سرویسها) را روی یک ماشین مجازی و کد کلاینت (رابط کاربری) اپلیکیشن خود را روی ماشین مجازی دیگر میزبانی کنید. در این حالت ممکن است بخواهید یک ماشین مجازی را با سیستم عامل ویندوز آمادهسازی کنید و سپس آن را کلون کنید. واقعیت این است که شما اینک یک ماشین مجازی را کلون کردهاید که موجب ایجاد نسخههای تکراری از سیستم عامل و کتابخانهها میشود. همچنین بدین معنی است که درایورهایی که نیاز داریم در هر دو سیستم عامل اجرا میشوند. از این رو هر دو ماشین مجازی به نوبه خود فضای زیادی از حافظه را مصرف میکنند. متعاقباً میتوانید چندین ماشین مجازی را روی سرور فیزیکی اجرا کند.
ماشینهای مجازی برنامههای رایانهای سنگینی هستند. آنها نیازمند بخش زیادی از حافظه سرور هستند و علاوه بر آن چند ماشین مجازی میتوانند به طور همزمان روی یک سیستم رایانهای اجرا شوند.
نیاز به حل مشکل زمان بوت شدن ماشین مجازی، نصب، عملکرد، نگهداری و ایجاد نسخه تکراری از آن موجب شد که تکنیک جدیدی که به نام کانتینرسازی (containerisation) معروف شده، مطرح شود.
طرز کار کانتینر چگونه است؟
ماشینهای مجازی یک سیستم رایانهای را برای خودشان کلون میکنند؛ در حالی که کانتینرها میتوانند یک سیستم عامل را به اشتراک بگذارند.
در ابتدا باید بگوییم که کانتینرها نیازمند یک سیستم عامل میزبان هستند. در واقع کانتینر یک برنامه نرمافزاری است. همه اپلیکیشنهای درون یک کانتینر، درون فضای کاربری سیستم عامل اجرا میشوند که همراستا با طراحی سیستم عامل میزبان است و بدین ترتیب تنها کرنل، دارای فضای اختصاصی برای خود است. این وضعیت موجب میشود که اپلیکیشنها بتوانند بدون عبور از سد سیستم عامل میهمان و سپس hypervisor به CPU دسترسی داشته باشند. در نتیجه کانتینرها عملکرد بهتری ارائه میدهند.
مشکلات ایجاد شده از سوی ماشینهای مجازی تا حدودی به وسیله کانتینرها حل میشود، زیرا یک سیستم عامل میزبان و درایورهای آن میتواند شامل فایلهای باینری اپلیکیشنهایی باشد که آن را به اشتراک میگذارند. این وضعیت متضمن این نکته است که تنها فایلهای باینری مرتبط و منابع آنها روی کانتینر میزبانی شوند.
کانتینرها یک نسخه تکراری از سیستم فایل میسازند و این کار امکان اجرای اپلیکیشنها در یک محیط امن را پدید میآورد. بدین ترتیب همه منابع و فایلها درون سیستم فایل کانتینر اجرا میشود. در این وضعیت متغیرهای محیطی همراه با کتابخانهها درون کانتینرها نگهداری میشوند. بدین ترتیب اجرای دستورالعملها در کانتینرها در قیاس با وهلههای مبتنی بر hypervisor سریعتر خواهد بود.
کانتینرها یک محیط قرنطینه ارائه میکنند که لایهای مجزا از سیستم عامل است.
کانتینرها در یک موتور کانتینر اجرا میشوند. متعاقباً یک موتور کانتینر میتواند چند کانتینر را اجرا کند. این کانتینرها سیستم پیکربندی مبتنی بر فایل دارند. این فایلها را میتوان نسخهبندی و پشتیبانی کرد و مورد نظارت قرار داد. از این رو مقایسه دو کانتینر بسیار آسانتر میشود.
کانتینرها شامل image-هایی هستند که کل اطلاعات مورد نیاز برای اجرای کانتینر را در خود جای داده است. کانتینرها ترجیح میدهند که اپلیکیشنهای تک لایهای به میکرو اپلیکیشنهایی افراز شوند و سپس ارتباطی بین این میکرو اپلیکیشنها برقرار شود. تشکیل میکروسرویسها به تیمهای IT این امکان را میدهد که تنها بخشهای الزامی اپلیکیشن را بهبود، پیادهسازی و توزیع کنند.
میکروسرویسها همراه با کانتینرها به عنوان میکروسرویسهای توزیع یافته عمل میکنند و میتوانند با استفاده از کانتینرها میزبانی و مقیاسبندی شوند. اگر میخواهید در مورد میکروسرویسها بیشتر مطالعه کنید به این مقاله (+) مراجعه کنید.
کانتینرها به جای مجازیسازی سیستم سختافزاری، سیستم عامل را به صورت مجازی ارائه میکنند.
همه کانتینرها میتوانند از یک سیستم عامل میزبان منفرد استفاده کنند و از این رو میتوانند از کرنل یکسانی بهره بگیرند. در نتیجه زمان بوت شدن ارتقا مییابد. دقت کنید که ما نیازی به اجرای کانتینر روی یک سیستم عامل میهمان نداریم. این طراحی موجب افزایش کارایی در معماری مبتنی بر کانتینر میشود.
کانتینرها برنامههای رایانهای سبک هستند.
کانتینرها در برابر ماشین مجازی
در یک ماشین مجازی سیستم عامل میزبان نصب شده است که با سختافزار ارتباط برقرار میکند. سپس فایلهای باینری روی ماشین مجازی میهمان نصب میشوند. اپلیکیشنهای دیگر مانند وب اپلیکیشنها، سرورهای پایگاه داده و موارد دیگر نیز میتوانند روی ماشین مجازی نصب شوند. در سوی دیگر، در یک اپلیکیشن کانتینر، چند سیستم عامل میهمان میتواند روی یک سیستم عامل میزبان نصب شود و هر سیستم عامل میهمان میتواند میزبان یک اپلیکیشن مجزا باشد. در نتیجه وب اپلیکیشنها میتوانند روی یک سیستم عامل میهمان متفاوت نسبت به سرور پایگاه داده توزیع یابند. همه سیستمهای عامل میهمان روی لایه زیرساختی سختافزاری مشترکی ارتباط برقرار میکنند.
در نتیجه امکان انتقال و کلون کردن در کانتینرها آسانتر است. کانتینرها نیازمند حافظه کمتری هستند و چند کانتینر را میتوان روی یک سرور فیزیکی میزبانی کرد.
کانتینرها یک پوشش پیرامون اپلیکیشنها ایجاد میکنند که همگی میتوانند به منابع سختافزاری یکسانی دسترسی داشته باشند. در نتیجه، موجب بهبود بیشتر قابلیت نگهداری و دسترسیپذیری به اپلیکیشنها میشوند.
کانتینرها میتوانند از همدیگر جداسازی شوند. این امر موجب حفاظت بیشتر از اپلیکیشنها و افزایش امنیت بین اپلیکیشنها میشود. به علاوه، کانتینرها جدید میتوانند برای یک اپلیکیشن ایجاد و راهاندازی شوند و همه این کانتینرها میتوانند به یک کرنل سیستم عامل یکسان دسترسی داشته باشند. کانتینرها را میتوان روی ماشینهای مجازی که خودشان روی کلود میزبانی میشوند نیز میتوان میزبانی کرد. هر کانتینر میتواند روی سیستم عامل متفاوت نیز اجرا شود.
سناریوی دوم
فرض کنید میخواهید یک اپلیکیشن را در یک کانتینر توزیع کنید. در این حالت میتوانید تغییرات مورد نیاز را روی اپلیکیشن اعمال کرده و مستقیماً روی image کانتینر توزیع کنید. متعاقباً ایمیج کانتینر میتواند روی سیستم عامل میزبان نیز توزیع شود، به علاوه، میتوان یک ایمیج ساخت و آن را از محیطهای توزیع به تست و متعاقباً به محیط توزیع نهایی در همه جا منتشر ساخت. یکپارچگی در ایمیجها موجب افزایش پایداری در اپلیکیشن در سطح سیستم میشود. از این رو هر ایمیج میتواند نسخهبندی شود و پیشرفت آن در طی زمان را میتوان ردگیری کرد. علاوه بر آن اندازه کمینه ایمیجهای کانتینر موجب کاهش زمان مورد نیاز برای عرضه یک اپلیکیشن در سطح سازمان میشود.
مفهوم کانتینر به طور کلی در مورد اشتراک منابع در موارد مقتضی است.
مزیتهای کانتینرها چیست؟
اگر بخواهیم مزیتهای کانتینرها را جمعبندی بکنیم، میتوانیم به فهرست زیر اشاره کنیم:
- جداسازی در سطح اپلیکیشن
- راهاندازی سریعتر نسبت به ماشین مجازی
- مصرف حافظه کمتر نسبت به ماشین مجازی
- امکان مهاجرت، پشتیبانگیری و انتقال آسانتر به دلیل اندازه کوچکتر در مقایسه با ماشین مجازی
- ارتباط سریعتر با سختافزار و از این رو میتواند کارایی بالاتری داشته باشد.
- بهبود توزیع و نگهداری اپلیکیشن به دلیل وجود ایمیجهای کانتینر خودکفا.
- کاهش زمان عرضه اپلیکیشن
- افزایش استفاده از طراحی و معماری میکرو
معایب متداول کانتینرها کدام هستند؟
البته که کانتینر نیز مانند هر فناوری و حتی هر چیز دیگری معایبی دارد که در فهرست زیر مورد اشاره قرار گرفتهاند:
- کانتینرها به اندازه ماشینهای مجازی بلوغ نیافتهاند و عملکرد آنها در مقیاسهای بزرگ همچنان در حال آزمون است.
- مشاوران مدیریت IT زیاد تجربه کار با فناوری کانتینر را ندارند. از این رو کار پشتیبانی از اپلیکیشنها در بلندمدت با مشکل مواجه خواهد شد.
- به علاوه در مورد کانتینرها به دلیل ظهور عصر کلود، هیاهوی زیادی شده است؛ اما امکان تداوم این جنبش در آینده همچنان محل تردید است.
- یک لایه اضافی برای مدیریت در زیرساخت IT ایجاد میکند.
- از آنجا که در کانتینرها اپلیکیشن به طور کامل مجزا نشده است، به اندازه ماشینهای مجازی امن نیستند و امنیت موضوعی است که به بهبود بیشتری نیاز دارد.
کدام ارائهدهندگان نرمافزاری، کانتینرها را پیشنهاد میکنند؟
- فناوری داکر (Docker) اخیراً محبوبیت زیادی کسب کرده است. داکر چندلایه دارد که شامل ایمیج مبنا است که خود سیستم عامل دارد. اپلیکیشنهای میتوانند تنها روی لایههای مناسب نصب شوند.
- CoreOS نیز یک فناوری کانتینری دیگر است که میتواند کانتینرهای داکر را اجرا کند.
- Rocket نیز اخیراً در حال کسب محبوبیت است.
جمعبندی
در این مقاله مروری در مورد مفهوم کانتینر داشتیم. به علاوه، به بررسی طرز جداسازی کرنل و اپلیکیشنها در سیستم عامل پرداختیم. همچنین مختصری از ماشین مجازی و مزیتها و معایب کانتینرها را بیان کردیم. در نهایت چند مورد از کاربردهای نرمافزارهای کانتینری را معرفی کردهایم. در صورتی که هر گونه دیدگاه یا پیشنهادی داشته باشید، میتوانید در بخش نظرات این نوشته با ما و دیگر خوانندگان فرادرس در میان بگذارید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای مهندسی نرم افزار
- آموزش داکر (Docker) برای توسعه دهندگان
- مجموعه آموزشهای علوم کامپیوتر
- کانتینر (Container) و مفهوم و کاربرد این تکنولوژی — به زبان ساده
- اکوسیستم داکر (Docker) — کامپوننت های رایج
- زمان بندی و هماهنگی (Orchestration) در اکوسیستم داکر – راهنمای جامع
==