یکی از عبارت هایی که در بین کامپیوتری ها این روزا ها زیاد میشنویم عبارت کانتینر و داکر و کوبرنتیزه مطالبی که در این زمینه خوندم رو میخوام با شما به اشتراک بذارم. اگه جایی به نظرتون بد یا اشتباه گفته شده خوشحال میشم در بخش نظرات بهم بگید. همچنین اگر تجربه جالب یا ارزشمندی از ابزار های این حوزه دارید در نظرات با ما در میان بزارید.
بیاید اول معنی کانتینر رو بفهمیم
کانیتینر چی هست ؟
برای قرن های متمادی از حمل و نقل دریایی برای انتقال کالا ها استفاده میشد. اما با توجه به اینکه کالا ها از لحاظ شکل و اندازه با هم متفاوت اند همواره مشکلات زیادی درحمل و نقل آنها وجود داشته .
ماکوم ملکین در سال 1950 با ایده یکپارچه سازی کالا کانتینراسون را معرفی کرد.در واقع با این تکنیک همه کالا ها در یک جعبه فلزی با نام کانتینر (به فارسی بارگنج) قرار میگرفتند. اجناسی که داخل آنها قرار میگرفتند بدلیل جنس فلزی و محکم کانتینر از آسیب ها در امان هستند و درعین حال ابعادشون استاندارده و این باعث میشه بخوبی روی هم سوار بشند. اینطوری کشتی ها خیلی سریعتر و مقدار بیشتری میتونستند بار بزنند.
کانتینر ها خیلی زود جای خودشون تو صنعت حمل نقل پیدا کردند و الان تو حمل و نقل زمینی و هوایی هم استفاده می شد
این ایده به سرعت در جاهای دیگه هم استفاده شد. حتی مخزن های زباله شهر ها هم عین هم شدند تا کار پدافند شهری راحتتر بشه
خوب تا الان با معنی و مفهوم کانتینر در دنیای حمل و نقل آشنا شدیم حالا ببینیم این مفهوم کی وارد کامپیوتر شد؟
تقریبا می توان گفت کانتینر ها در کامپیوتر هم (مشابه دنیای خارج) به معنای جداسازی و بسته بندی برنامه ها جهت سهولت در توسعه و حمل و اجرای آن ها است. این مفهوم تقریبا جدیده و شاید نگاهی به تایخچه ورود این مفهوم به کامپیوتر درک خیلی بهتری به ما بده.
مخفف change root سال 1979 میلادی با اضافه شدن chroot در unix 7 اولین بار ایزوله کردن سرویس ها اتفاق افتاد.
در واقع دایرکتوری روت را ازنظر برنامه تغییر می دهد و بنابراین برنامه فقط دایرکتوری که ما مشخص کردیم را به عنوان روت می بینید و به بیرون دسترسی ای ندارد (اصلا نمیدونه بالا از اون دایرکتوری دایرکتوری دیگه ای هم هست) و در نتیجه اگر خطایی رخ دهد حداکثر در آن دایرکتوری تاثیر گذاره
بعد سال 2000 مفهوم زندان (Jail) در سیستم عامل Free BSD معرفی شد که بر پایه chroot به مدیران سیستم اجازه میداد تا در سیستم عامل خود چندین زندان (بخش کوچکی از سیستم عامل که در محیط خود ایزوله است) را اجرا کنند .یا به عبارتی دیگر در سطح سیستم عامل مجازی سازی انجام دهند. زندان ها در نسخه های اول با استفاده . ابزار chroot برای کارهای ساده مناسب است اما در مواقعی که نیاز به انعطاف پذیری و پیچیدگی و ویژگیهای خاصی باشد، نمیتوان به آن اعتماد کرد. به همین دلیل زندان ها در طول زمان و در نسخه های مدرن هسته FreeBSD پیشرفت کرده است و همچنان در حال توسعه است تا نیاز های کاربران را پاسخ دهند.
در سال 2001 سیستم زندان در Linux VServer مورد بازبینی قرار گرفت و قسمت بندی منابع سیستم عامل بهبود یافت. Openvz , Solaris Containers در همین زمینه سال 2004و 2005 معرفی شدند.
درباره مکانیزم زندان می توانید بیشتر بخوانید. https://en.wikipedia.org/wiki/FreeBSD_jail
قابلیت cgroups(Control Groups) و namespace در سال 2008 به کرنل لینوکس اضافه شد. در واقع ما cgroups میتونیم بخشی از منابع سیستم عامل بگیریم به یک پردازش (یا مجموعه از پردازش ها) اختصاص بدیم. در نتیجه اون پردازه فقط همین منابع رو برای خودش میبینه به بقیه دسترسی نداره و ایزوله میشه.بطور خلاصه این قابلیت 1.محاسبه 2.تعیین سقف استفاده (limit) 3. ایزوله کردن منابع سیستم عامل (CPU, memory, disk I/O, network ,…) برای مجموعه ای پردازش ها را بر عهده دارد.
در شکل زیر میبینید هر یک از گروه های کنترلی (cgroup) منابعی بخشی از منابع رو بصورت ایزوله دریافت کرده اند.
بعد در سال ۲۰۰۸ LXC (Linux Container) معرفی شد که صرفا با استفاده از قابلیت های جدید کرنل لینوکس محیط ایزوله در اختیار پردازه ها قرار میداد. این شروع یک انقلاب در حوزه کامپیوتر بود. بعد ها تکنولوژی های زیادی بر پایه LXC بوجود اومدند که مهمترین اونها در سال ۲۰۱۳ داکر بود.
مزیت داکر نسبت به بقیه سطح بالا بودن و سادگی اون بود که باعث شد به سرعت به محبوبیت باورنکردنی ای برسه. داکر اگرچه ابتدا با استفاده از LXC کانتیریزیشن رو پیاده سازی میکرد ولی بعد از استقبال گسترده ، موتور خودش رو توسعه داد و جایگزین LXC کرد و کاملا مستقل شد.
امروزه مفهوم مجازی سازی رو زیاد میشنویم. معمولا هر وقت از مجازی سازی صحبت میکنند منظور آن ها مجازیسازی در سطح سخت افزار است که توسط Hypervisor انجام میشود و ماشین های مجازی (vm) ایجاد میشود. که یک محیط ایزوله سخت افزاری هستند و برای کار باید سیستم عامل نصب کنیم
اما سرویس ها مبتنی بر کانتینر که درباره آنها صحبت کردیم با نام مجازی سازی در سطح سیستمعامل شناخته میشوند و با استفاده از قابلیت هسته سیستمعامل یک محیط ایزوله از سیستمعامل را به نام کانتینر در اختیار برنامه ها قرار میدهند.
ارتباط میان حافظه-شبکه کانتینرها و مدیریت آنها توسط Container Engine (در اینجا داکر انجین) صورت میگیرد.
پس تا اینجا فهمیدیم داکر و دیگر سرویس های مبتنی بر کانتینر یک محیط ایزوله از سیستم عامل به نام کانتینر در اختیار ما قرار میدهند . حالا ببینیم اینها چه مزیت و معایبی به ما میدن.
خوب کانیتنر در دنیای واقعی را به خاطر بیاورید آنها آمدند تا به سادگی بارگیری و منتقل شوند. همین مزیت در کامپیوتر وجود دارد در واقع هر وقت بتوانیم یک کانتینر در یک محیط ایزوله (مبتنی بر لینوکس) به درستی اجرا کنیم پس میتوانیم در هر محیط ایزوله ی دیگر هم (مبتنی بر لینوکس ) این کار را چرا که هسته های سیستم عامل ها یکسان و محیط ها ایزوله هستند. فقط کافی است در مقصد هم ابزاری مثل داکر نصب باشد تا بر روی ان کانتینر را اجرا کنیم.
قابل انتقال بودن و سادگی کانتینر ها بهترین ویژگی های آنهاست و این نشان میدهد انتخاب نام نام کانتینر هوشمندانه بوده است .
اما کانتینر ها نسبت به ماشین های مجازی مزیت های بسیار قابل توجهی دارند . به چند نمونه اشاره میکنیم
همونطور که چند خط بالاتر گفتیم کانتینر محیط ایزوله ای از سیستم عامل رو در اختیار ما قرار میده و چون محیط کانتینر ایزوله است و هسته سیستم عامل های لینوکس مشابه اند به سادگی میشه انتقال داد و استفاده کرد. اما اگر بخواهیم از لینوکس ببریم روی ویندوز یا برعکس چی ؟ اصلا ما بالاتر گفتیم این ساخت کانتینر با استفاده از قابلیت های کرنل لینوکسه (از جمله cgroup , namespace) هست ویندوز چجوری ممکنه بتونه این کار رو انجام بده ؟
واقعیت همون چیزی بود که بالاتر گفتیم این قابلیت های در هسته لینوکس اضافه شده ولی خوب مایکروسافت هم برای اینکه اهمیت کانتینرها درک کرده بود تلاش زیادی صورت داد تا این قابلیت رو به ویندوز اضافه کنه. در سال های اخیر داکر و مایکروسافت تعاملات گسترده ای با هم داشتند تا این قابلیت هر چه بهتر در ویندوز پیاده سازی بشه و میشه گفت تاحدوی خوبی موفق بوده. الان به کمک داکر در ویندوز میتوان برنامه هایی که مخصوص ویندوز هستند رو داکرایز کرد و در ویندوز های دیگر اجرا کرد. برای فهمیدن جزییات بیشتر کانتینر در ویندوز میتونید از لینک زیر کمک بگیرید:
بذارید برای فهم بهتر با چند پرسش و پاسخ این مسئله رو بفهمیم :
آیا میتوان برنامه ای در ویندوز مبتنی بر کانتینر کنیم و اون رو در سیستم عامل های ویندوز دیگر اجرا کنیم؟
بله. ویندوز در سال های اخیر قابلیت ساخت محیط های ایزوله کردن پردازه ها و برنامه ها رو در هسته سیسم عامل خودش پیاده سازی کرده و میتوان اینکار را انجام داد.
آیا برنامه های کانتینری ایجاد شده در لینوکس (مبتنی بر کرنل لینوکس) را بر روی ویندوز اجرا کرد؟
بله اما ویندوز برای این کار از یک مجازی ساز بهینه شده در خودش استفاده میکنه در واقع ویندوز با مجازی سازی یه لینوکس مینیمال تو خودش بالامیاره بعد روی داکر اون کانتینر رو اجرا میکنه برای همین داکر ویندوز برای پروژه های بزرگ (چون معمولا کانتیر های مورد نیاز یه پروژه بزرگ مبتنی بر لینوکس هستند ) مشخصا کندتره .
آیا برنامه های کانتینری ایجاد شده در ویندوز (مبتنی بر کرنل ویندوز) را بر روی لینوکس اجرا کرد؟
خیر؛ چنین قابلیت فعلا وجود نداره مگر اینکه خودتون زحمت بالا اوردن یه ویندوز مجازی روی لینوکس بکشید !
با توجه به نکات بالا میبینیم کانتینر به اندازه ماشین های مجازی مستقل نیستند و باید برای اجرا به اینکه مبتنی بر لینوکس هستند یا ویندوز دقت کرد . همچنین چون کانتینر درمحیط ایزوله بر روی سیستم عامل اجرا میشود اگر مشکلی در آسیب پذیری خود سیستم عامل باشد کانتینر ها هم آسیب پذیر خواهند بود.
هر وقت از مفهوم مجازی بر روی سرور ها میگوییم باید از مدیریت مجازی سازی بر روی چندین سرور هم بگوییم.
فرض کنید. فرض کنید یه سایت سرویس دهنده نسبتا بزرگ هستیم. طبیعتا نمیتوانمی تمام ترافیک را بر روی یک سرور مدییرت کنیم نیاز داریم بار ورودی را میان چندین سرور توزیع کنیم . (در اصطلاح load balancing
انجام دهیم ). یا در صورت خرابی یک سرور سرویس ما متوقف نشود و هر وقت به هر دلیل یک سرور از مدار خارج شد سرور دیگر بصورت خودکار شروع به سرویس دهی کند (در اصطلاح High Availibility داشته باشم) . در چنین مسائلی نیاز داریم یک سرور در نقش مدیر مجموعه سرور های ما عمل کند. اگر این مدیریت در محیط کانتینر ها باشد، به آن Container Orchestration میگوییم .
به بیان دقیق تر به خودکارسازی فرایند deployment و مدیریت ، مقیاس پذیری و تنظیم شبکه کانتینر ها Container Orchestration گفته میشود.
در محیط های سازمانی که نیاز به مدیریت صد ها یا شاید چندین هزار کانتینر داریم قطعا نمیتوان این مدیریت را بصورت دستی برای آنها استفاده کرد و این مدیریت با ابزار های Container Orchestration امکان پذیر خواهد بود. بصورت خلاصه این ابزار ها امکانات زیر را برای کانتینر ها ارائه میدهند:
سعی کردم در این پست به زبان ساده درباره کانتینر ها صحبت کنیم از کاربرد اونها در دنیای واقعی گفتیم و بعد بصورت خلاصه تاریخچه ورود این مفهوم به دنیای کامپیوتر رو مطرح کردیم . معماری کانتینر ها رو با مجازیسازی بررسی کردیم و مزیت ها و معایب هر کدوم رو دیدیم
«این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است»