داکر برای برنامه‌نویس‌ها: قسمت اول - آشنایی با مفاهیم

مقدمه

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

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


مفهوم کانتینر و تفاوت آن با ماشین مجازی

اول ببینیم کانتینر چی هست. در کرنل لینوکس یک مفهومی وجود داره به نام namespace. در خیلی از زبان‌های برنامه‌نویسی این مفهوم وجود داره. مثلا تو cpp شما یه namespace درست می‌کنید و کلاس‌هایی که تو اون تعریف میشه با کلاس‌های namespace دیگه تداخل ندارن و از هم جدا حساب میشن. تو کرنل لینوکس هم چنین مفهومی رو داریم. برنامه‌هایی که اجرا میشن به طور پیشفرض همه‌شون توی یه namespace هستن و همه هم دیگه رو می‌بینن. اما ما دوست داریم برنامه‌هامون مستقل از هم اجرا شن. پس میایم اونا رو تو namespaceهای جدا می‌ذاریم و بینشون isolation ایجاد می‌کنیم یا بهتر بگم ایزوله می‌کنیم.

این جدا کردن namespace میتونه در چند زمینه انجام بشه. مثلا از نظر فایل سیستم یا شبکه. همه‌اش رو اینجا نمی‌گم ولی هر کدوم نوع خاصی از ایزوله بودن میده بهمون. اگه فایل سیستم جدا باشه کلا چیزی که تو فایل سیستم ماست رو داخل namespace جدید نمی‌بینیم و یه فایل سیستم جدید ساخته میشه. یا اگه شبکه باشه دیگه دو تا برنامه که تو namespaceهای مختلف هستن نمی‌تونن از طریق localhost هم دیگه رو ببینن. هر کدوم ip جدا می‌گیرن و انگار تو ماشین‌های مختلف اجرا شدن.

پس namespace دید برنامه‌ها و پروسه‌های سیستم رو محدود میکنه و باعث میشه فکر کنن تو یه سیستم جدید هستن. در کنار اون یک عنصر دیگه هم می‌خوایم و اون برای محدود کردن منابع مورد استفاده برنامه‌هاست. برای این از مفهوم cgroup در کرنل استفاده می‌کنیم. با cgroup به کرنل می‌گیم که هر برنامه چقدر cpu و ram میتونه استفاده کنه. انگار اون برنامه تو یه سیستم با اون قدر cpu و ram نشسته.

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

برای بهتر دیدن این تفاوت به این تصویر توجه کنین:

همون توضیحاتی که بالا دادم رو میشه توش دید. پس کانتینر، کانتینر هست و ماشین مجازی، ماشین مجازی و با هم فرق دارن.


مزایای استفاده از کانتینر

دیدیم کانتینر چیه. الان میخوایم ببینیم چرا این قدر محبوبه و سر و صداش پیچیده.

یک برنامه‌نویس رو فرض کنید که تو سیستم خودش برنامه‌ای رو توسعه میده و تنظیماتی رو هم انجام داده و برنامه‌اش تو سیستم خودش به خوبی کار می‌کنه. وقتی این برنامه به سیستم جدیدی میره که در محیط production قرار داره و میخواد به کاربران خدمات بده به مشکل می‌خوره. چرا؟ چون همه تنظیماتی که تو سیستم برنامه‌نویس بود رو نداره. ممکنه اصلا این کد به یه برنامه‌نویس دیگه داده بشه و اون هم بخواد روش کار کنه. اون هم باید تنظیماتی که روی سیستم برنامه‌نویس اول بود رو داشته باشه. حالا فرض کنید تعداد زیادی برنامه‌نویس داشته باشیم که بخوان روی اون کد کار کنن. واقعا سخته هماهنگ شدن همه‌ی این‌ها.

در دنیای کانتینرها مفهومی وجود داره به نام image یا تصویر. وقتی کانتینری می‌خوایم بسازیم از روی تصویر داده شده مشخصاتش رو می‌فهمیم. مثل این که چه فایل‌ها، برنامه‌ها و تنظیماتی داره؛ مثلا تصویر اوبونتو که با اجرا کردنش یک اوبونتو به شکل کانتینری رو سیستم‌ خواهیم داشت. تصویر مثل کلاس می‌مونه تو برنامه نویسی شیء گرا و کانتینر مثل شیء. تصویر ساختاری که کانتینر باید داشته باشه رو مشخص می‌کنه. حالا برنامه‌نویس ما کدش رو توی تصویر مناسب میذاره و تنظیمات لازم اون رو انجام میده و در اختیار بقیه میذاره. هر کس بخواد رو این پروژه کار کنه یا باهاش به کاربران خدمات بده کافیه یه کانتینر از رو این تصویر بسازه. این شکلی تمام کارها داخل تصویر اعمال میشن و این تصویر روی همه سیستم‌ها کانتینر یکسانی می‌سازه.

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

اگر مزیت دیگه‌ای سراغ دارید در قسمت نظرات بگید تا استفاده کنیم.


داکر و کانتینرها

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

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


جمع بندی

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

این مطلب به اتمام رسید. امیدوارم مفید بوده باشه براتون. صحبت یا نظری دارید این پایین بفرمایید. به امید دیدن شما در قسمت‌های بعدی.

قسمت بعدی