در سیستم عامل لینوکس سه مفهوم اساسی وجود دارد که زیرساخت همهی مفاهیمی مانند داکر1, lxc و کوبرنیتز میباشد برای درک عمیق از مفاهیم مجازی سازی خوب است با این سه مفهوم آشنا شویم. Chroot و Cgroup و Namespace که در ادامه مفاهیم آنها را توضیح میدهیم
در لینوکس ساختار فایلسیستم درختی است این درخت را درخت فایلسیستم مینامند.
همانطور که میبینید همه چیز در یک ساختار درختی قرار میگیرد و آدرسهای دسترسی بر مبنای این درخت تعریف میگردد ریشه درخت را root مینامیم . در صورتی که توسط یک فراخوانی سیستم2یا توسط دستور chroot به برنامهای بگوییم که از این به بعد تو به جای اینکه از آدرس ریشه اصلی فایلسیستم از یک دایرکتوری دیگر به عنوان ریشه استفاده کن همهی دسترسیهای آن برنامه بر مبنای درخت فایلسیستم جدید که ریشه آن عوض شده است انجام میگیرد و برنامه اصطلاحاً chroot شده است.
وقتی که همهی منابع مورد نیاز یک برنامه را در یک ساختار درختی جدید در یک پوشه میریزیم و برنامه را به وسیله chroot به آن ساختار محدود میکنیم به این ساختار درختی جدید jail گفته میشود.
مفهوم cgroupکمی از مفهوم chroot عمیقتر و پیشرفته تر است. کرنل لینوکس قابلیتی برای مدیریت منابع مورد استفاده یک برنامه دارد به نام cgroup که مخفف control group است. Cgroup این قابلیت را به ما میدهد که برنامههامون را دستهبندی کنیم و بعد به این دستهها منابع اختصاص بدهیم و منابعشون را مدیریت کنیم و حتی منابع را برای برنامهای تضمین کنیم. مثلاً فرض کنید میخواهیم نوعی از سیستمعامل یا برنامهی بلادرنگ را ایجاد کنیم و مطمئن بشیم سیستم عامل سیپییوو رم را برای برنامهمون تضمین کنه و نریم پشت صف اختصاص منابع سیستم عامل! استفاده از cgroup راهی راحت و مطمئن برای این کاره!
با cgroup میشه زمان cpu، حافظه سیستم و … را مدیریت کرد.
همانطور که در برنامهنویسی فضای نام داریم و متغیرهای یک فضای نام فقط به متغیرهایی که در همان فضای نام تعریف شدهاند دسترسی دارند و به فضای نام دیگری دسترسی ندارند در لینوکس نیز مفهومی به نام فضای نام داریم. خود cgroup نوعی از فضای نام است نوعی دیگر از فضای نام فضای نام شبکه یا network namespace است. فضای نام شبکه این قابلیت را به ما میدهد که فضای نام جدیدی را ایجاد کنیم و درون آن کارت شبکهی مجازی ای ایجاد کنیم و با انتقال برنامه به این فضای نام جدید دسترسیهای برنامه به شبکه را کاملاً مدیریت کنیم یعنی برنامهای را کاملاً از شبکه ایزوله کنیم(مفهوم sandbox) یا توسط فایروال دسترسیها را مدیریت و نظارت کنیم.
بر اساس مفاهیمی که توضیح داده شد تکنولوژی هایی مانند lxc و داکر و کوبرنیتز و فلت پک و… ساخته شدند تا کانتینر را مدیریت کنند. کانتینر درواقع همان ترکیب سه مفهوم فوق است که برنامهای را به صورت شبیهسازی شده اجرا میکنند. این سطح از شبیه سازی مانند هایپروایز3متفاوت است.
در مجازی سازی با هایپروایزر نتیجه ماشینهای مجازی هستند. هایپروایزر امکان شبیهسازی سختافزار را فراهم میکند و سختافزار و cpu و ارتباطات شبکه ای و … شبیه سازی میشوند و بر مبنای آن در ماشین مجازی ایجاد شده سیستمعامل نصب میشود و برنامهها در این فضا نصب و اجرا میشوند.
در مجازیسازی کانتینر سیستمعامل اصلی یکی است و تنها لایهای برای مدیریت برنامههای کانتینرسازی شده میان سیستمعامل و کانتینر قرار دارد. در این مدل سیستمعاملهای متعدد وجود ندارد سرعت بیشتر است و حجم لازم برای اجرای یک سرویس جدید کمتر است (نیاز به نصب سیستمعامل جدید نیست) و فرآیندهای مدیرتی سادهتر است.
استفاده از کانتینرها برای مدیریت و استقرار برنامهها کار برنامهنویسها و مدیران سیستم و devops را خیلی راحتتر کرد مثلاً شما می خواید یک سرویس جدید بالا بیارید به جای ساعتها تلاش برای نصب پیشنیازها و نصب و پیکربندی سرویس جدید با استفاده از برنامهای مانند داکر در عرض چند دقیقه سرویس جدید را نصب و راه اندازی میکنید و با استفاده از معماری میکروسرویس امکان ارتباط بقیه برنامههاتون با این سرویس جدید فراهم میشود.
1docker
2systemcall
3هایپروایزر