در سال های اخیر Containerization به رویکردی غالب در توسعه نرم افزار تبدیل شده و به عنوان روش جایگزین کننده Virtualization مطرح شده است. علاوه بر توسعه نرم افزار از این تکنولوژی در پیاده سازی و نگهداری ابزارها و تکنولوژی های دیگر نیز استفاده می گردد. کانتینرها  شامل پکیج کردن یا کپسوله کردن کدهای نرم افزار و تمامی وابستگی های آنها است تا امکان اجرای نرم افزار بدون هیچگونه تغییری بر روی هر زیرساختی فراهم گردد. ( Immutable deployment )

Containerization به توسعه دهندگان امکان Deploy سریعتر و امن تر را می دهد. مفاهیم کانتینرها و ایزوله نمودن پروسه ها عمری بیش تر از یک دهه دارند ولی در سال ۲۰۱۳ به عنوان یک تکنولوژی اوپن سورس در Docker Engine به عنوان یک استاندارد صنعتی در یکپارچه سازی پکیج سازی ابزارهای مختلف مطرح گردید.

معماری Container

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

معماری Virtual machine

برخلاف کانتینرها ، VM ها یک سیستم عامل کامل را اجرا می نمایند.

در زیر به مقایسه Container و Virtual machine خواهیم پرداخت.

Isolation

  • VM: به طور کامل از سایر محیطها ایزوله بوده و از نظر امنیتی دارای مزایای بیشتری می باشد.
  • Container: به شکل معمول یک ایزوله سازی تقریبی را به نسبت سیستم میزبان و سایر کانتینرها ارائه می دهد ولی مثل VM ها ارائه دهنده یک محیط ایزوله کامل نمی باشد.

Operating system

  • VM: اجرای سیستم عامل به صورت کامل که باعث نیاز به منابع بیشتر می گردد.
  • Container: با استفاده از سیستم عامل میزبان نیاز به اجرای سیستم عامل را کاهش داده و فقط بخش های مورد نیاز از سیستم عامل در آن اجرا می گردد که باعث کاهش منابع مورد نیاز می گردد.

Deployment

  •  VM: استفاده از ابزارهایی مثل HyperV و VMware
  • Container: دپلوی نمودن کانتینرها با کمک خط فرمان داکر یا کنترل دپلوی چندین کانتینر با کمک ابزارهای Orchestrator مثل Kubernetes

Operating system updates and upgrades

  • VM: دانلود و نصب به روز رسانی ها بر روی تک تک vmها. نصب یک سیستم عامل جدید نیازمند ایجاد مجدد vm است.
  • Container: جهت به روز رسانی و یا اعمال تغییر لازم است ایمیج کانتینر شما مجددا بر اساس Dockerfile جدید ساخته شود،  سپس کانتینر ایمیج جدید باید به کانتینر رجیستری منتقل شود، دپلوی مجدد کانتینر توسط ابزاهای Orchestrator صورت خواهد گرفت.

Load balancing

  • VM: نیاز است vm در حال اجرا به سرور دیگری در کلاستر منتقل شود.
  • Container: کانتینرهای در حال اجرا به node دیگری منتقل نخواهند شد، بلکه Orchestrator به طور خودکار با start و stop نمودن کانتینرهای موجود در کلاستر لود کاری موجود در کلاستر را کنترل می نماید.

Fault tolerance

  • VM: نیاز است vm که با مشکل مواجه شده به سرور دیگری منتقل شده و restart شود.
  • Container: اگر یک node در کلاستر fail شود، هر کانتینری که در آن node وجود داشته به سرعت توسط Orchestrator در node دیگری ایجاد می گردند.

تکنولوژی هایی که کانتینرها بر اساس آن ایجاد شده اند در تصویر زیر قابل مشاهده هستند. 

NameSpace

 NameSpace ها بلوک های سازنده container ها هستند. انواع مختلفی از کانتینرها وجود دارد و هر کدام از آنها وظیفه ایزوله نمودن اپلیکیشن ها از سایر Namespaceها را بر عهده دارند. آنها با استفاده از clone system call ایجاد می گردند. در ادامه برخی از این namespace های مورد استفاده در کانتینرها را مورد بررسی قرار خواهیم داد.

  • PID namespace
  • Net namespace
  • IPC namespace
  • MNT namespace
  • UTS namespace
  • USER namespace

Cgroups

 control group ها ارائه دهنده ساختار مدیریت منابع و اکانتینگ برای کانتینرها هستند. cgroup ها امکان اعمال محدودیت بر روی چندین processرا فراهم می نمایند. برخی از قابلیت هایی که cgroupها محیی می نمایند به شرح زیر است.

  • Resource limiting: به عنوان مثال یک cgroup می تواند به یک cpu خاص متصل شود، در نتیجه تمام پردازشهای آن روی یک cpu مشخص اجرا خواهد شد.
  • Prioritization: بعضی از cgroup ها می توانند سهم بیشتری از cpu را به خود اختصاص دهند.
  • Accounting: توانایی محاسبه میزان مصرف منابع
  • Control: امکان freeze و restart گروه ها

Union filesystem

امکان ایجاد ساختاری چندلایه جهت ترکیب لایه های مختلف یک کانتینر را فراهم می سازد و با کمک این تکنولوژی می توان از کانتینر ایمیج های دیگر جهت ایجاد یک کانتینر جدید استفاده نمود.