از داکر برای ساخت، اشتراک و اجرای نرمافزارها استفاده میشود. کانتنر یک واحد استاندارد از نرمافزار (تجریدی از در لایه نرمافزار) است که کد و وابستگیهای آن را بستهبندی نموده تا بتوان نرمافزار را در محیطهای گوناگون رایانش، به سرعت و قابل اعتماد اجرا کرد. داکر یک بسته سبک، مستقل و اجرایی است و شامل تمام چیزهایی است که یک نرمافزار برای اجرا شدن به آنها نیاز دارد: کد، رانتایم، ابزارهای سیستمی، کتابخانه و غیره. کانتینر نرمافزار را از محیط مستقل میسازد و تضمین میکند که نرمافزار صرفنظر از تفاوت instanceهای توسعه و staging، به درستی کار کند.
کانتینر و ماشین مجازی شباهتهای زیادی با یکدیگر دارند اما کانتینر سیستم عامل را مجازی میسازد در حالی که ماشین مجازی سختافزار را. بنابراین کانتینرها ضمن آنکه قابل حمل هستند، کارایی بهتری دارند. میتوان چندین کانتینر را روی یک ماشین اجرا کرد، کرنل سیستم عامل بین کانتینرها به اشتراک گذاشته میشود اما هر کانتینر پردازش را در فضا خود انجام میدهد. کانتینرها فضای کمتری از ماشینهای مجازی اشغال میکنند و میتوانند با منابع اندک تعداد بیشتری از نرمافزارها را مدیریت کنند.
کوبرنتیز
کوبرنتیز (Kubernetes) یک سیستم همنواساز متن باز برای کانتینرها است. از آن برای توسعه نرمافزار، مقیاسپذیری و مدیریت استفاده میشود. در ابتدا گوگل طراحی این پروژه را انجام داد اما بعدتر Cloud Native Computing Fundation نگهداشت آن را بر عهده گرفت. کوبرنتیز با داکر، containerd، و CRI-O کار میکند، اما در گذشته منحصرا برای داکر بود.
کوبرنتیز مجموعهای از بلوکسازههاست که مجموعه و در کنار یکدیگر مکانیزمی برای پیادهسازی، نگهداشت و مقیاسپذیری نرمافزارها فراهم میکند. دارای اتصال شل است و میتواند تحت بارهای کاری متفاوت عمل کند. این سکو از طریق تعریف منابع در قالب اشیا، منابع پردازش و حافظه را کنترل و مدیریت میکند.
گره اصلی کوبرنتیز (Kubernetes Master Node) مدیریت کلاسترها و بارکاری، و هدایت ارتباطات را در کل سیستم برعهده دارد. گره یا کارگر یا مینیون ماشینی است که کانتینرها در آن استقرار یافتهاند.
اولین چالش آن است که ماشین مجازی یک منبع کامپیوتری نسبتا سنگین وزن است. ماشینهای مجازی یک کپی از سیستم عامل هستند که بر روی هایپروایزری که بر روی سختافزار فیزیکی نصب اس، اجرا میشوند. نرمافزارها هم بر روی ماشینهای مجازی اجرا میشوند. قاعدتا از نظر سرعت و عملکرد چالشهایی دارد. این چالشها در محیطهای چابک پررنگتر است.
هدف داکر آن است که این چالشها را از طریق ایجاد یک منبع کامپیوتری سبکوزن و چابک بر طرف کند. یکی از ویژگیهای داکر و کانتینترها این است که همانند یک کشتی حملونقل میتوان تعداد زیادی از آنها بر روی یک سختافزار جای داد. یعنی میتوان تعداد بسیار زیادی از کانتینرهای داکر را بر یک یک ماشین مجازی یا سختافزار فیزیکی جای داد. بنابراین یکی چالش مقیاسپذیری را نیز برطرف میکند.
یکی دیگر از چالشها به ویژه در محیط DevOps ناشی از بلوکسازههای سازمانهای سنتی بود. توسعه دهندگان کد را میساختند و آن را تحویل عملیات میدادند، بعد متوجه میشدند که کد در محیط production کار نمیکند.
داکر در واقع فناوری است که کد، اپلیکیشن و منابع لازم برای اجرای آن را در داخل یک کانتینر قرار داده، و قابل حمل میسازد. بنابراین در تمامی مراحل فرآیند توسعه، پیادهسازی و استقرار نرمافزار، ساخت و اجرای نرمافزار دقیقا مشابه ساخت و اجرای نرمافزار در محیط production خواهد بود.
اولین مورد کاربری مناسب برای استفاده از داکر، CI/CD است. از آنجایی که داکر سبک وزن است، توسعه دهنده میتواند چندین استک از کانتینرهای داکر را در لپ تاپ شخصی خودش ایجاد کند و محیط production را به نوعی تداعی کند. برای مثال استک LAMP و سپس نرمافزار توسعه داده شده را بر روی این استک بسازد و اجرا کند. از آنجایی که این کانتینرها قابل حمل هستند، به راحتی میتوان آنها را جابهجا کرد. فرض کنیم که یک محیط CI روی جنکینز داشته باشیم. به جای بالا آوردن یک ماشین مجازی جدید برای نصب و اجرای نرمافزار و تست و سپس پاک کردن آن ماشین مجازی میتوان از ایمج و کانتینرها استفاده کرد. اکر ایجاد هر ماشین مجازی 10 دقیقه وقت بگیرد، کانتینرها تنها چند ثانیه زمان لازم دارند.
مورد کاربری دیگر آن است که میتوان تعداد زیادی کانتینر را بدون نیاز به هایپروایزر روی یک کانتینر هاست اجرا کرد. به عبارت دیگر میتوان آنها را بر روی یکدیگر سوار کرد. این امر سبب افزایش سرعت میشود. مطابق گزارش منتشر شده توسط IBM، یک کانتینر متوسط حدود 26 برابر از یک ماشین مجازی سریعتر است.
یکی از فناوریهای جالب توجه داکر مفهومی به نام copy-on-write است. فایل سیستمهایی مانند Btrfs و AuFS نیز از این مدل پشتیبانی میکنند. در واقع لایههایی از فایل سیستمها ایجاد میشود. هر کانتینر بر روی یک ایمج ساخته میشود. ایمج مانند یک فایل سیستم از قبل ساخته شده است که یک لایه بسیار نازک از کتابخانهها و باینریهای لازم را دارد. این ایمج یا تصویر بر روی لایه ذخیره میشود که به آن لایه فایل سیستم گفته میشود.
حال فرض کنید که بخواهیم تغییری روی آن اعمال کنیم. فرض کنید که بخواهیم PHP روی آن نصب کنیم. داکر یک لایه جدید روی لایههای موجود ایجاد کرده و تنها چیزهایی را اضافه میکند که تغییر کرده است. در نهایت یک فایل سیستم فقط خواندنی با چندین لایه ایجاد میشود. در نهایت یک سیستم بسیار سبک وزن خواهیم داشت که فقط چیزهای مورد نیاز در آن است. در واقع از لایههای موجود استفاده مجدد میکند.
داکر به دو فناوری کرنل لینوکس به شدت وابسته است. یکی namespace است و دیگری control groups.
اگر یک پردازه در کرنل لینوکس اجرا شود، namespaceها فراخوانی میشوند. کرنل یک namespace اختصاص میدهد که دارای یک پردازه و سایر منابع لازم است. این منابع میتواند شامل cpu یا حافظه باشد. زمانی که یک کانتینر داکر ساخته میشود، از کنرل لینوکس میخواهیم که یک جعبه برای ما درست کند. درون این جعبه باید این فایل سیستمها، اینقدر cpu و حافظه، و دسترسی به شبکه باشد و ضمنا این جعبه باید داخل namespace این پردازه قرار بگیرد. نکته بدیهی این است که زمانی که جعبه داخل namespace یک پردازه مشخص قرار گرفت دیگر نمیتواند پردازه سایر namespaceهای خارج از آن را ببیند.
گروههای کنترل control groups حول مدیریت منابع در دسترس کانتینر طراحی شدهاند. این فناوری امکان میدهد که میزان منابع را برای هر کانتینر مشخص کنیم بطور مثال به یک کانتینر حافظه 128 مگابایتی اختصاص بدهیم و دسترسی به شبکه را از کانتینر دیگر صلب کنیم. با این فناوری میتوان قابلیتها را اضافه و کم کرد.
شبکه در کانتینرها به چه صورت کار میکند؟
علاوه بر فایل و پردازه، کانتینرها محیط ایزولهای را نیز برای آدرسهای شبکه و پورتها فراهم میآورند. برای مثال میتوان چندین وب سرور را روی چند کانتینر بالا آورد که همگی از پورت 80 استفاده میکنند. بصورت پیش فرض کانتینرها پورت را به خارج نشان نمیدهند. هر کانتینر واسط شبکه خودش را دارد که در واقع واسط شبکه مجازی است. میتوان پردازههایی را اجرا کرد که از پورتهای شبکه داخل کانتینرها استفاده میکند. برای مثال داخل یک کانتینر میتوان ده وب سرور آپاچی بالا آورد که همگی از پورت 80 استفاده میکنند، البته داخل خود کانتینر. میتوان پورت داخل کانتینر را به پورت هاست مپ کرد اما این کار را فقط یکبار میتوان انجام داد. زیرا تنها میتوان یک پورت داخل کانتینر را به یک پورت خارجی روی هاست مپ نمود. بصورت پیش فرض این کار بصورت تصادفی انجام میگیرد. بطور مثال پورت 80 داخل کانتینر با پورت 49154 روی هاست مپ میشود.
یکی از شرکتهای فعال در حوزه کانتینرسازی و همنواسازی آنها در کشور، شرکت همروش است. این شرکت با استفاده از کوبرنتیز، بستر ابری استقرار نرمافزار را ارائه میدهد. یکی از چالشهایی که استارتاپها و حتی شرکتهای بزرگ با آن روبهرو هستند، فراهم آوردن زیرساخت لازم است. یکی از سرویسهای این شرکت، سرویس دارکوب است. این سرویس دارای دو نسخه CE و EE است. از جمله مزایای دارکوب، زیرساخت قدرتمند، امکان اجرای ایمجهای داکر، واسط و تجربه کاربری مناسب، پشتیبانی از زبانهای برنامهنوسی مختلف، CI/CD، مقیاسپذیری، پشتیبانگیری خودکار و جمعآوری و نگهداری متریکها و لاگهای لازم است. نکته جالب این سرویس محاسبه هزینه بر اساس زمان استفاده است، که خبر خوبی برای استارتاپها و افراد به ویژه دانشجویان است.
از سایر خدمات این شرکت، میتوان به آپداموس (بررسی بالا بودن سایت و اعلام در صورت پایین بودن و ارزیابی سرعت پاسخ، مشاهده تاریخچه، ارسال گزارش هفتگی و ...)، و همگیت (سرویس گیتلب مدیریت شده و رایگان، CI/CD و رانرهای اشتراکی) اشاره کرد.
از جمله مشتریان این شرکت همراه اول، ایرانایرتور، ترب، سنجاق، بهترینو، تومن و اسنپساپلای هستند.
این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است.