زیر پوست داکر چه خبر است

اینم یه تجربه پراکنده دیگه! این پست قرار بود جای دیگه‌ای منتشر بشه اما خب نشد. پس اینجا منتشرش میکنم. این متن رفرنس‌های زیادی کم داره که انشالا بعدا اضافه‌شون میکنم

در این پست قرار است که به زیرساخت‌هایی که داکر مبتنی بر آن ساخته شده است اشاره شود. هدف نهایی نشان‌دادن این موضوع است که داکر امکانات خود را به چه صورت ارائه می‌کند.

مقدمه

قاعدتا هم‌اکنون که در حال خواندن این متن هستید می‌دانید که داکر چیست و احتمالا می‌دانید که چگونه کار می‌کند. داکر خود مبدع موضوع جدیدی نبوده است و بر دوش تکنولوژی‌هایی توسعه یافته ایستاده است. استفاده از هریک از این تکنولوژی‌ها به تنهایی دردسر زیادی داشته و داکر با تجمع و آسان کردن استفاده از آنها توانسته است به اقبال عمومی دست یابد. در این پست بصورت خلاصه به بررسی این تکنولوژی‌ها پرداخته می‌شود.

کرنل لینوکس

بخش عمده‌ای از امکاناتی که داکر فراهم می‌کند، با استفاده از سازوکارهایی که در کرنل وجود دارند پیاده‌سازی شده‌اند. با در کنار هم قرار گرفتن این تکنولوژی‌ها داکر توانسته است که به ارائه خدمات بپردازد. لیست این تکنولوژی‌ها عبارتند از:

  • فضای نام(namespace)ها در لینوکس: فضا‌های نام این امکان را بوجود می‌آورند که بتوانند بخشی از منابع سیستم را بصورت ایزوله به پروسه‌هایی که درون آنها قرار دارند ارائه دهند. این منابع تنها توسط پروسه‌های درون آن قابل روئیت است. فضاهای نامی در داکر مورد استفاده قرار گرفته‌اند عبارتند از
    • فضای‌نام PID: که باعث می‌شود پروسه تنها پروسه‌های درون خود را ببینند
    • فضای‌نام NET: که باعث می‌شود بتوان کارت‌شبکه، پشته شبکه و سایر موارد را بصورت ایزوله ارائه کرد.
    • فضای‌نام IPC: که روندهای ارتباطی بین پروسه‌های مختلف را ایزوله می‌کند.
    • فضای‌نام MNT: که نحوه اتصال(mount) واسط‌های ذخیره سازی را ایزوله می‌کند.
    • فضای‌نام UTS: که نام کامپیوتر(hostname) و دامنه(NIS) را ایزوله می‌کند.
  • گروه‌های کنترلی یا cgroups: کرنل لینوکس این امکان را فراهم می‌اورد که پروسه‌ها در یک ساختار سلسله مراتبی قرار گفته و دسترسی آن به منابع سیستم محدود شود و مورد پایش قرار گیرد. این باعث می‌شود بتوان به عنوان مثال میزان استفاده از سی پی یو یا رم را کنترل کرد.

فایل سیستم

تکنولوژی دیگری که در داکر مورد استفاده قرار گرفته است، استفاده از یک سیستم فایل خاص به ویژگی copy on write است. سیستم فایلهای با این ویژگی را می‌توان بصورت لایه لایه ذخیره کرد و هنگام انتقال در صورت وجود داشتن نسخه قبلی تنها تفاوت‌ها را ارسال نمود. همچنین این امکان به ما این اجازه را میدهد که بتوانیم تغییرات را نسخه متفاوت همانند یک سیستم مدیریت نسخه پیگیری نماییم. سیستم فایلی که داکر از آن استفاده union file system است که ویژگی‌های زیر را دارد:
– بصورت لایه‌ایست
– هر لایه بایستی commit شود
– هر لایه بصورت فقط خواندنی ذخیره می‌شود.
– تنها فایلهای تغییر یافته در آن لایه ذخیره می‌شوند.

اجرا یک کانتینر

برای اجرای کانتیر و مشخص کردن تمام مشخصات آن بایستی این مشخصات را به فرمتی توصیف کرد. در داکر این فرمت container format نام داشته و داکر سعی در استاندارد کردن آن را دارد.

مجازی‌سازی سبک قسمت دوم

اینم یه تجربه پراکنده دیگه!

همونطور که احتمالا همه میدونید الان بازار containerها یا همون مجازی سازی سبک در دنیا و خب در ایران داغه. من توی یه سری پست سعی میکنم (قسمت اول) که راهی رو که خودم برای درک این موضوع طی کردم رو بنویسم.

این دفعه در مورد اینکه آیا این نوع مجازی سازی جدیده یا قدیمی حرف میزنم و اینکه توی هر سیستم عامل این تکنولوژی چطور پیاده‌سازی شده. کل ایده این هست که سیستم عامل بتونه یه فضای ایزوله شده رو ایجاد کنه و در اون فضا یه سیستم عامل دیگه رو به اجرا در بیاره. اولین و قدیمی ترین تکنولوژی که در تمامی سیستم عامل‌های خانواده یونیکس که لینوکس هم عضوش هست ایجاد شده تکنولوژی chroot هست که فضای دیسک رو از فضای دیسک اصلی ایزوله میکنه. اما بعدی این تکنولوژی‌ها تکمیل شده و منابع دیگه‌ی سیستم غیر از سیستم فایل هم ایزوله میشن. این ایزوله کردن اصالتا بر عهده کرنل هر سیستم عامل هست و کرنل هست که مسئولیت این ایزوله سازی رو برعهده داره پس با توجه به تفاوت‌های سیستم عامل ها تکنولوژی‌های متفاوتی بوجود اومده که عبارتند از

  • لینوکس
    • Linux-VServer: این تکنولوژی یکی از قدیمی ترین(سال ۲۰۰۱) تکنولوژی‌های مجازی سازی در سطح سیستم عامل هست که نیاز به تغییر کرنل(پچ شدن کردن) برای بوجود آوردن امکان ایزوله کردن منابع سیستم هست. این سیستم متن باز بوده ولی هیچوت تغییراتش به هسته سیستم عامل راه پیدا نکرده
    • Parallels Virtuozzo Containers : این سیستم هم بسیار قدیمی است(سال ۲۰۰۱) و بصورت تجاری توسعه پیدا کرده.
    • OpenVZ: یک محصول متن بازه که اون هم نیاز به پچ کردن کرنل داره و تغییراتش هیچوت به درون هسته لینوکس راه پیدا نکرده. شروع توسعه این ابزار به سال ۲۰۰۵ برمیگرده.
    • ابزارهای مبتنی بر cgroups و namespaces در کرنل لینوکس: این تکنولوژی در سال ۲۰۰۶ توسط مهندسان گوگل شروع شده و به کرنل لینوکس راه پیدا کرده. با توجه به این ویژگی‌ها محصولات متفاوتی تولید شده
      • lmctfy: این ابزار توسط گوگل توسعه پیدا کرده و مورد استفاده قرار گرفته. شروع توسعه این ابزار به سال ۲۰۱۳ برمیگرده.
      • LXC: این ابزار تا اونجایی که من میدونم از دل اوبانتو در اومده و تبدیل به یک ابزار قابل استفاده شده. اما به دلیل مستندات محدود خیلی مورد استفاده قرار نگرفته. شروع توسعه این ابزار به سال ۲۰۰۸ برمیگرده.
      • Docker: سازندگان این ابزار ارائه دهنده سرویس paas بودند که از روند مشابهی برای مدیریت paas خود استفاده می‌کردند و تجربیات خودشون رو در قالب این ابزار ارائه دادند. این ابزار به دلیل سادگی، مستندات خوب و معرفی راه‌حلهای کارا بسیار مقبولیت پیدا کرده. شروع توسعه این ابزار به سال ۲۰۱۳ برمیگرده.
      • libvir lxc: این ابزار هم جزئی از کتابخانه libvirt برای مدیریت تکنولوژی‌های مجازی سازی هست که ابزاری برای مجازی سازی سبک هم ارائه کرده.
  • FreeBSD Jail: در این سیستم عامل از سال ۱۹۹۸ کرنل از ویژگی‌ای به نام jail پشتیبانی میکنه که مجازی سازی سبک رو بوجود میاره. برخلاف لینوکس که چند  ویژگی مجزا کرنل برای مجازی سازی سبک استفاده میشه ویژگی jail در freebsd یک ویژگی یک پارچه برای مدیریت مجازی سازی سبک به حساب میاد ابزارهای سطح بالایی هم برای این مدیریت این ویژگی بوجود اومده که لیست کوتاه اونها در پایین اومده:
  • Solaris Containers: این تکنولوژی در هسته سولاریس از سال ۲۰۰۵ وجود داره و من اطلاع زیادی از اون ندارم
  • sysjail: این تکنولوژی در هسته netbsd و openbsd تا سال ۲۰۰۹ وجود داشته و من اطلاع زیادی از اون ندارم
  • WPARs: یک سیستم خاص منظور برای سیستم عامل AIX هست(سال ۲۰۰۷) و من اطلاع زیادی از اون ندارم
  • HP-UX Containers (SRP): این تکنولوژی مختص HPUX هست(سال ۲۰۰۷) که من باز اطلاع خاصی ازش ندارم
  • Sandboxie: این یه تکنولوژی برای ویندوز هست و من دیدم دوستانی که روی بررسی ویروسها کار میکنن ازش استفاده میکنن.

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

همین!

 

مجازی سازی سبک قسمت اول

اینم یه تجربه پراکنده دیگه!

من به شخصه این مدت با توجه به ظهور پدیده ای به نام docker شرو ع به خوندن تکنولوژی‌های زیادی کردم که مهمترینشون مجازی سازی سبک یا مجازی سازی در سطح سیستم عامل هست. سعی میکنم در چند قسمت بصورت خیلی خودمونی و تو دل برو (بخوانید user friendly) بنویسم که این تکنولوژی‌های به چه دردی می‌خورن و کجاها استفاده میشن.

بصورت خیلی خلاصه کل کاری که مجازی سازی سبک انجام میده اینه که با استفاده از کرنل موجود سیستم عامل، یه ماشین مجازی سبک با سیستم عامل همخوانواده سیستم عامل ماشین میزبان بالا میاد. در حقیقت عین اینه که شما با استفاده از اون کرنل یه محیط ایزوله شده از سیستم اصلی بوجود بیارید. این موضوع و تکنولوژی‌های مرتبط باهاش جدید نیستن و از سن زیادی برخوردار هستن.

مهمترین سوالی که بایستی بهش جواب داده بشه اینه که چرا این مجازی سازی سبک به شمار میاد. یکی از مهمترین‌هاش اینه که سرعت بوت شدن و لود شدن این سیستم‌ها به نصبت ماشین‌های مجازی معمول به شدت کمتره. میگن شما زمانی که برای آماده سازی یک ماشین فیزیکی نیاز داری چند ساعت، یک ماشین مجازی عادی نیاز داری چندین دقیقه و یک ماشین مجازی سبک نیاز داری چند ثانیه است. پس این ماشین مجازی سبکه. دومین نکته اینه که اجرای این ماشین مجازی سربار اضافه‌ای روی ماشین میزبان نداره. توی سیستم‌های مجازی سازی قدیمی عملا یک تبدیل از کد باینری یا همون اسمبلی ماشین میهمان به دستورات سی پی یو ماشین میزبان انجام میشد که خب سربار قابل توجهی داشت. این سربار با اومدن تکنولوژی‌های virtualization در سطح سی پی یو کاهش زیادی پیدا کرده اما هنوز هم این سربار قابل توجه. اما به علت یکسان بودن کرنل سیستم عامل میهمان و میزبان عملا این سربار وجود نداشته پس سیستم سبک تر خواهد بود.

فعلا همین!

منتظر قسمت‌های بعدی این نوشته باشید!