در این قسمت از سری آموزش کامل کار کردن با معماری مایکروسرویس ها با استفاده از اپلیکیشن های Containerized شده در Net Core. قصد داریم در رابطه با مقایسه ای بین Docker Image ها و ماشین های مجازی و یا همان Virtual Machine ها صحبت کنیم. امیدواریم تا به اینجای کار را از این آموزش لذت برده باشید و حتماً قسمت های قبلی را نیز مطالعه کنید.
تصویری که در قسمت زیر مشاهده می کنید مقایسه بین ماشین های مجازی و Docker Image ها را به تصویر کشانده است.

همانطور که در تصویر سمت چپ مشاهده میشود ماشین های مجازی شامل اپلیکیشن و تمامی library ها و باینری های مورد نیاز هستند و البته یک سیستم عامل میهمان کامل نیز در آنها لحاظ میشود. دقت کنید که پیاده سازی Virtualization نسبت به Containerization نیاز به منابع سخت افزاری بیشتری دارد. از طرفی بر اساس تصویر سمت راست Container ها شامل اپلیکیشن و تمامی dependency های آن می باشند. با این وجود Container ها به صورت اشتراکی از Kernel سیستم عامل استفاده میکنند و به صورت فرآیندهای ایزوله شده در User Space بر روی سیستم عامل Host مورد نظر اجرا می گردند. البته این موضوع در Container های مربوط به Hyper-V متفاوت است چرا که در آنها هر Container درون یک ماشین مجازی خاص به ازای هر Container اجرا می شوند.
علاوه بر این موضوع در ماشینهای مجازی، سه لایه اصلی در Host Server وجود دارند که از پایین به بالا شامل Infrastructure و Host Operating System و یک Hypervisor می باشند. علاوه این موضوع هر ماشین مجازی، سیستم عامل منحصر به فرد خود را به همراه تمامی library های لازم خواهد داشت. از طرفی در داکر، به سادگی یک Host Server فقط Infrastructure و سیستم عامل را سوار بر آن خواهد داشت. ضمنا Container Image نیز وجود دارد که باعث میشود Container ها از یکدیگر تفکیک شده اما از سرویس های مربوط به سیستم عامل مربوطه به صورت اشتراکی استفاده کنند.
از آنجایی که Container ها نسبت به ماشینهای مجازی به منابع خیلی کمتری نیاز دارند، deploy کردن و اجرا کردن آنها بسیار سریع و آسان میباشد. این موضوع باعث می شود که اصطلاحا density و یا تراکم بیشتری به دست آورده شود. داشتن تراکم بالاتر به این معنی است که شما می توانید سرویس های بیشتری را بر روی یک واحد سخت افزاری یکسان اجرا کرده و طبیعتاً در هزینه ها صرفه جویی کنید.
البته یک موضوع در رابطه با استفاده کردن از Container ها وجود دارد و آن نیز این است که به دلیل استفاده مشترک از Kernel سیستم عامل، استفاده کردن از Container ها نسبت به ماشین های مجازی از سطح Isolation کمتری برخوردار هستند.
هدف اصلی یک Image این است که محیط و یا Environment که شامل dependency ها می باشد را برای تمامی deployment ها، یکسان خواهد کرد. این بدان معنی است که شما می توانید به سادگی یک Image را بر روی ماشین خود اجرا کرده و حتی debug کنید و سپس به یک ماشین دیگر deploy کرده و مطمئن باشید که یک Environment یکسانی در اختیار شما قرار خواهد گرفت.
یک Container Image روشی است که با استفاده از آن می توانید یک اپلیکیشن و یک سرویس را و یا یک سرویس را اصطلاحاً Package کرده و سپس به روشی کاملا قابل اعتماد و قابل تولید، Deploy کنید. از همین جمله میتوان این برداشت را کرد که داد که Docker لزوماً یک تکنولوژی نیست بلکه یک فلسفه و روش انجام کاری به حساب میآید.
زمانی که از Docker استفاده می کنید دیگر جملاتی از قبیل «این نرم افزار در ماشین من کار میکرد چرا در Production کار نمیکند» را نخواهید شنید. برنامه نویسان با استفاده از Docker به سادگی جمله «این برنامه بر روی Docker اجرا میشود» را خواهند گفت چرا که اپلیکیشن موجود با استفاده از Docker بستهبندی شده و میتواند بر روی Environment های مختلفی که Docker آنها را پشتیبانی می کند اجرا بشوند. علاوه بر این بر روی تمامی Deployment Target ها نیز می توانید برنامه خود را اجرا کنید. برای مثال می توانید به سادگی برنامه را در Dev و QA و Staging و Production داشته باشید.
یک مقایسه ساده
در این قسمت قصد داریم با ارائه یک مقایسه ساده، مفاهیم مربوط به Docker را به شکلی آسان تر برای شما تفهیم کنیم.
سالها قبل از ظهور نرمافزارهای پردازش واژه از قبیل Microsoft Word، دستگاههای گرفتن کپی از اسناد تقریباً در همه جا دیده می شدند و مورد استفاده قرار میگرفتند.
فرض کنید که در آن شرایط نیاز داشتید که تعداد زیادی از نامهها را به صورت فیزیکی ایجاد کرده و سپس به سمت مشتریانتان با استفاده از پاکتهای نامه فیزیکی ارسال کنید. دقت کنید که هر چند در آن شرایط ممکن است ایمیل وجود داشته باشد ما میخواهیم نامه ها را به صورت فیزیکی ارسال کنیم.
پس از گذشت چند روز متوجه میشویم که نامه هایتان فقط ترکیبی از پاراگراف های مختلف هستند که میتوانند در کنار یکدیگر قرار بگیرند. به همین جهت تلاش میکنید که سیستمی را ایجاد کنید تا بتوانید با کنار هم قرار دادن پاراگراف ها نامه هایتان را ایجاد کرده و کار را تسریع ببخشید.
این سیستم بسیار ساده است:
- کار را ابتدا با مجموعهای از کاغذهایی آغاز می کنید که شامل یک پاراگراف تک هستند.
- برای ساختن یک نامه شما از کاغذ هایی که بر روی آنها فقط یک پاراگراف نوشته شده است استفاده می کنید. آنها را برداشته و در کنار یکدیگر قرار می دهید تا بتوان آنها را با شکلی ساده خواند.
- حال می توانید این مجموعه پاراگراف ها را به درون دستگاه فتوکپی قرار داده و هر تعداد مناسبی که از آنها میخواهید را ایجاد کنید.
دقیقاً سیستم Docker نیز به همین ترتیب عمل میکند.
در Docker هر لایه از سیستم در واقع نتیجه تغییراتی است که بعد از اجرا کردن عملیاتی از قبیل نصب کردن یک نرم افزار بر روی File System اتفاق میافتد.
بنابراین زمانی که شما در این شرایط به File System نگاه میکنید می بینید که تمامی فایلهای برنامه نصب شده، به همراه لایه اصلی فایل سیستم شما دیده میشود.
می توان به سادگی به یک Image در Docker به عنوان یک هارددیسک آماده نصب شدن در یک کامپیوتر فکر کرد که سیستم عامل از قبل بر روی آن نصب شده است و Container مربوطه نیز یک کامپیوتر است که قرار است این هارد دیسک که حاوی سیستم عامل می باشد به آن متصل بگردد.
حال این Container دقیقاً شبیه به یک کامپیوتر می تواند روشن و خاموش بشود. برای استفاده کردن از Docker و درک هرچه بهتر و مفاهیم آن واژگانی وجود دارند که باید با آنها آشنا بشوید. واژگان فنی مربوط به نرم افزار Docker را در قسمت بعدی معرفی خواهیم کرد.