داکر/Docker چیست؟ مفهوم اصلی و علت بوجود آمدنش

در گذشته وقتی تیم برنامه نویسان کد رو تحویل تیم زیرساخت میدادن تا روی سرور نصب بشه، معمولا مشکلاتی بوجود میامد که کد روی سرور درست کار نمی‌کرد. اما کد روی سیستم برنامه نویسان درست کار می‌کرد و اینجا همیشه بحثی بین برنامه نویسان و تیم زیرساخت شکل می‌گرفت و هرگروه مشکل رو به گروه دیگه ربط می‌داد (احتمالا برای شما هم پیش اومده که پروژه تون روی سیستم خودتون درست کار می‌کنه اما روی سیستم استاد یا دوستتون اجرا نمیشه). در طول زمان راه حل های زیادی برای مدیریت بهتر سرویس ها و جلوگیری از مشکلی که بالا توضیح دادم، مطرح شد. یکی از راه‌ حل‌های قدیمی مجازی سازی بود. مجازی سازی الان هم کاربرد زیادی داره‌(اما در جاهای دیگه) اما داکر ترند امروزی دنیای تکنولوژی برای مدیریت بهتر سرویس ها هستش.سرویس چیه؟ سرویس می‌تونه یک پروژه دانشجویی به زبان پایتون یا جاوا، یک دیتابیس mysql، یک دیتابیس postgresql، یک ایمیل سرویس و ... و حتی بخش تایید هویت و ورد کاربران هم می‌تونه یک سرویس باشه. داکر یک پلتفرم است که مدیریت سرویس‌ها رو راحت‌تر می‌کنهچرا داکر از مجازی سازی بهتر سرویس‌ها رو مدیریت می‌کنه؟ بطور کلی و خلاصه مجازی سازی سه‌تا مشکل بزرگ داره که داکر این‌ها رو نداره:در مجازی سازی منابع سرور بین سرویس‌ها تقسیم می‌شن. فرض کنید پیش بینی کردیم ‌سرویس ‌X یک گیگ رم و یک هسته CPU رو لازم داره و بهش اختصاص می‌دیم. اگر سرویس X در عمل از 500MB رم استفاده کنه سرویس های دیگه نمی‌تونن از اون ۵۰۰مگابایت باقیمانده و تخصیص داده شده به سرویس X استفاده کنند. پس عملا بخشی از منابع سرور ما هدر رفته.برای اینکه ایزوله سازی سرویس‌ها رعایت بشه، برای هر سرویس باید یک سیستم عامل جداگانه روی سرور نصب کنیم. که اینکار باعث میشه، زمان ما گرفته بشه تا برای هر سرویس یک سیستم عامل نصب کنیم و هم اینکه اینجوری نمی‌تونیم تعداد زیادی سرویس روی سرورمون داشته باشیم.‌ ( چون منابع هر سرور محدود هستند) اگر سرویس ما روی ویندوز باشه و بخواهیم همون سرویس رو روی لینوکس یا مک هم اجرا کنیم، برای اینکار باید سرویس مون رو روی لینوکس و مک هم نصب کنیم. اینکار هم باعث میشه زمان ما گرفته بشه و هم اینکه کلی دردسر کانفیگ‌ سیستم عامل هم خواهیم داشت. از همه مهمتر اینکه اینجوری یک سرویس روی سه تا سیستم عامل همزمان نصب هستش و منابع زیادی از سرور فقط در اختیار یک سرویس قرار می‌گیره.ایزوله سازی یعنی اینکه سرویس‌ها برای اجرا به متغیری (مثل کانفیگ شبکه، ورژن دیتابیس و ...) نیاز نداشته باشند که باعث ایجاد تداخل و یا مشکل برای سرویس دیگری بشود. داکر با استفاده از مفهومی به نام Dockr Image و Container هر سه مشکل بزرگ مجازی سازی رو برطرف می‌کنه.کانتینر/Containerکانتینر در داکر دقیقا مثل کانتیرهای واقعی هستش. یک محیط بسته که مواردی بصورت مرتب داخلش قرار داده شده و همه اون چیزها باهم دیگه جابجا می‌شن. در اینجا داخل کانتینرها کدها و Dependencyهای سرویس مون رو قرار می‌دیم.این یعنی هر سرویس در محیط ایزوله مخصوص خودش ( container ) قرار داره. اینجوری براحتی و با سرعت بالا سرویس‌ها رو می‌تونیم در اختیار تیم‌های دیگه بذاریم و هر سرویس بصورت ایزوله اجرا بشه. چجوری این کار انجام می‌شه؟؟داکر Image داکر Image یک تصویر از اپلیکشن یا سرویسی است که می‌خواهیم اون رو اجرا کنیم. در واقع یک بسته اجرایی با حجم کم و مستقل است که هرچیزی برای اجرای یک اپلیکیشن نیاز است را داخلش داره. این موارد شامل کدها، ابزارهای سیستمی، کتابخانه‌ها، تنظیمات و ... هستند. داکر Image یک فایل قابل حمل است که شامل یک سری دستورالعمل بوده که مشخص می‌کند Container کدام کامپوننت‌های نرم افزاری را اجرا کند.بطور ساده و خلاصه، وقتی از داکر استفاده می‌کنیم درواقع از یک یا چند کانتینر استفاده می‌کنیم که براساس Docker Image های مختلف ساخته شده اند. معماری داکر به گونه ای هستش که هسته سیستم عامل، منابع سخت افزاری و نرم افزاری و .... رو بین کانتینرها به اشتراک می‌ذاره و هر کانتینر بصورت ایزوله و جدا از هم اجرا میشن. اینجوری ما می‌تونیم چند سرویس مختلف داشته باشیم که هرکدوم در کانتینر خودش اجرا میشه و با سرویس های دیگه تداخل نخواهد داشت.توضیح بیشتر در مورد Docker Imageبطور معمول image ها از روی imageهای دیگر ساخته میشن. چندین base image وجود داره که برنامه نویسان بطور معمول از اون base image ها استفاده می‌کنند و image دلخواه رو می‌سازند. docker image بصورت لایه ای هستش. از لایه اول به لایه آخر ( در داخل Dockerfile ) یکسری دستورات می‌نویسیم که مشخص میکنه اپلیکشن ما چجوری ساخته بشه و dependencyهای پروژه چه چیزهایی هستند. با ساختن image می‌تونیم از روش یک کانتینر بسازیم و روی هر ماشینی که از داکر رو پشتیبانی می‌کنه، پروژه رو اجرا کنیم.داکر بر پایه لینوکس ساخته شده. درواقع docker image یک لینوکس کوچک هستش. image base ها هم یک لینوکس کوچک هستند که روی آنها ابزارهای پایه با حداقل dependencyها نصب شده اند. در هسته لینوکس امکانی برای اشتراک گذاری منابع وجود داره و داکر با استفاده از این امکان محیط های ایزوله ای ایجاد می‌کنه که از منابع سیستم بصورت اشتراکی استفاده می‌کنند. باتوجه به سه مشکلی که از مجازی سازی گفتم و اینکه در یک پروژه تجاری صدها یا هزاران سرویس وجود خواهد دشات،‌ الان می تونید درک کنید که داکر اومده چیکار کنه و چجوری می‌خواد باعث مدیریت بهتر سرویس‌ها باشه.فرض کنید چندین سرویس روی چندین کانتینر مختلف دارید، در حالت مجازی سازی باید هر سرویس روی یک سیستم عامل جداگانه باشه حتی اگر بصورت مداوم نیاز به استفاده ازش نداشته باشیم. اما در داکر می‌توینم همه کانتینرها رو روی یک سیستم عامل داشته باشم و هرکانتینر زمانی اجرا می‌شه که بهش دستور بدیم. پس منابع سیستم در صورت نیاز به کانتینرها تعلق می‌گیره. اینجوری هم منابع سیستم بصورت بهینه استفاده میشن و هم اینکه می‌تونیم تعداد زیادی کانتینر داشته باشیم. از همه مهمتر که سرعت کد زنی بالا میره و دیگه نیازی نیست برای هر ماشینی جداگانه کد بزنیم یا درگیر برطرف کردن dependencyها باشیم.تا اینجا متوجه شدیم داکر چیه و چرا بوجود اومده و چجوری باعث می‌شه مدیریت سرویس ها راحتتر بشه. وارد معماری داکر نشدم و صرفا مفهوم داکر و عملکرد کلی داکر رو توضیح دادم. در پست های بعدی نحوه استفاده از داکر رو می‌نویسم.