داکر (Docker) چیست و چه مزایایی دارد؟
داکر ابزاری برای ساده سازی در ساخت، پیاده سازی و اجرای برنامه ها با استفاده از کانتینرها (Containers) می باشد. برای این که بتوانیم مفهوم و نحوه کارکرد داکر را درک کنیم ابتدا نیاز است تا با مفهوم کانتینر آشنا شویم. سپس در ادامه به توضیح داکر، مزایا و معایب آن و همچنین موارد استفاده از آن می پردازیم.
کانتینر (Container) چیست؟
کانتینر واحد استانداردی از یک برنامه است که کدها و کامپوننت ها، کتابخانه ها و تمام متعلقات مربوط به آن ها را برای اجرای سریع و راحت در محیط های دیگر بسته بندی می کند. کانتینر ها باعث ایزوله شدن برنامه ها از یکدیگر می شوند و دیگر نیازی نیست برای هر کدام بک سیستم عامل جداگانه مورد استفاده قرار گیرد و می توانند از یک سیستم عامل مشترک استفاده کنند.
داکر چیست؟
داکر ابزاری متن باز (Open Source) جهت ساده سازی در ساخت و اجرای برنامه ها با استفاده از کانتینرها می باشد و این اجازه را به ما می دهد تا برنامه و تمام کامپوننت های آن را به شکل یک بسته در آورده و در هر ماشینی بدون نیاز به انجام تنظیماتی که ماشین مبدا (ماشینی که برنامه در آن ایجاد شده است) داشته آن را اجرا کنیم. همچنین با استفاده از داکر شما می توانید تاخیر زمان بین نوشتن کد برنامه تا اجرا و استفاده از آن را به میزان قابل توجهی کاهش دهید.
داکر تا حدی شبیه به ماشین مجازی (Virtual Machine) است با این تفاوت که به جای ساخت یک سیستم عامل مجازی جدید، برنامه ها اجازه استفاده از هسته لینوکسی که در آن اجرا می شوند را دارند و تنها نیاز است تا چیزهایی که در حال حاضر در کامپیوتر اجرا نمی شوند و برنامه ها به آن ها نیاز دارد را همراه خود داشته باشند. این قابلیت باعث بهبود چشم گیری در کارایی و همچنین کاهش قابل توجه حجم برنامه ها می شود.
از آن جایی که کانتینرها وابسته به پلتفرم نیستند، داکر می تواند هم در پلتفرم های بر پایه ویندوز و هم در پلتفرم های بر پایه لینوکس اجرا شود. همچنین در صورت نیاز می تواند داخل ماشین های مجازی نیز اجرا شود و هدف اصلی این است که شما بتوانید برنامه های میکرو سرویس (Micro service) را در معماری توزیع شده اجرا کنید.
معماری داکر (Docker Architecture)
معماری داکر از مدل کلاینت سرور (Client-Server) استفاده کرده و شامل اجزای کلاینت، میزبان یا موتور داکر، شبکه و حافظه می باشد که در ادامه به شرح هر یک از اجزا می پردازیم:
کلاینت داکر (Docker Client)
کاربران با استفاده از کلاینت داکر می توانند با داکر ارتباط برقرار کرده و از آن استفاده کنند و کلاینت دستورات را با استفاده از Docker API به dockerd ارسال می کند. هر کلاینت می تواند با چندین Daemon در ارتباط باشد.
میزبان یا موتور داکر (Docker Engine, Docker Host)
موتور داکر هسته اصلی سیستم داکر می باشد و برنامه ای بر پایه مدل کلاینت سرور (Client-Server) است که بر روی ماشین میزبان نصب می شود و به طور کلی از سه بخش اصلی تشکیل شده است:
- Daemon: در واقع سرویسی است که همواره در پشت صحنه در حال اجرا می باشد و dockerd نام دارد و توانایی ایجاد و مدیریت تصاویر داکر، کانتینرها، شبکه ها و فضای حافظه را دارد و همچنین به درخواست های API پاسخ می دهد.
- Rest API: یک API است که برای تعامل با سرور داکر توسط برنامه ها مورد استفاده قرار می گیرد.
- Command Line Interface (CLI): کلاینتی برای وارد کردن دستورات داکر می باشد.
رجیستری های داکر (Docker Registries)
تصاویر داکر در مکان هایی به نام رجیستری ذخیره می شوند. Docker Hub یک رجیستری عمومی است که شما می توانید تصاویر خود را در آن ذخیره کنید. داکر به صورت پیشفرض تصاویر را از Docker Hub خوانده و در آن ذخیره می کند. همچنین شما می توانید یک رجیستری خصوصی برای خود ساخته و از آن استفاده کنید. وقتی از دستور pull و یا run اسفاده کنید می توانید تصاویر را از رجیستری خوانده و با دستور push می توانید تصاویر را در رجیستری ذخیره کنید.
اشیای داکر (Docker Objects)
زمانی که شما با داکر کار می کنید از اشیایی مانند تصاویر، کانتینرها، حافظه ها و شبکه ها استفاده می کنید که به توضیح هر یک می پردازیم:
- تصاویر (Images): تصاویر قالب هایی فقط خواندنی (Read-only templates) می باشند که حاوی دستورات ساخت کانتینرها هستند. می توان داکر ایمیج را به همان گونه که هستند از Docker Hub استخراج و استفاده کرد و یا با اعمال تغییراتی روی آن ها image جدیدی ایجاد کرد. شما می توانید با استفاده از dockerfile دستورات ایجاد و اجرای کانتینرها را به عنوان image جدیدی ایجاد کرده و از آن استفاده کنید. تصاویر یک لایه فقط خواندنی و یک لایه دیگر دارد که می توان در آن نوشت. به عبارتی زمانی که شما تغییراتی در تصاویر اعمال می کنید فقط قسمت های تغییر یافته در لایه نوشتنی ذخیره می شوند.
- کانتینرها (Containers): پس از آن که یک image را اجرا کنید کانتینری ساخته خواهد شد که تمام برنامه ها و متعلقات مربوط به آن در داخل این کانتینر اجرا می شوند. با استفاده از Docker API و یا CLI می توانید یک کانتینر را فعال، غیر فعال و یا حذف کنید.
- حافظه ها (Volumes, Storage): تمام داده های تولید شده توسط داکر و داده های مورد استفاده کانتینرها در حافظه ها ذخیره می شوند و این حافظه ها توسط Docker API و CLI مدیریت می شوند. این حافظه ها هم با کانتینرهای ویندوزی و هم با کانتینرهای لینوکسی سازگار هستند. به جای این که داده ها را در لایه نوشتنی کانتینرها ذخیره کنیم بهتر است تا آن ها را در حافظه ها ذخیره کنیم. عمر داده های ذخیره شده در حافظه بیشتر از عمر کانتینرها می باشد و ذخیره سازی روی حافظه حجم و سایز کانتینرها را بیشتر نمی کند.
- شبکه ها (Networks): شبکه ها گذرگاهی برای ارتباط کانتینرهای جدا از هم می باشد. به طور کلی ۵ نوع درایور شبکه در داکر وجود دارد:
- None: این درایور به کلی تمام شبکه ها را قطع می کند.
- Bridge: درایور پیشفرض کانتینرهای داکر می باشد و برای مواقعی استفاده می شود که برنامه شما بر روی کانتینرهای مستقل اجرا می شود به بیان دیگر زمانی که چندین کانتینر با یک میزبان یکسان در ارتباط می باشند.
- Host: این درایور جداسازی میان کانتینرها و میزبان را از بین می برد به عبارت دیگر زمانی که شما نمی خواهید جداسازی ای میان کانتینرها و میزبان وجود داشته باشد از این درایور استفاده می کنید.
- Overlay: این درایور سرویس های swarm را فعال می کند تا با یکدیگر ارتباط داشته باشند. این درایور زمانی مورد استفاده قرار می گیرد که کانتینرها روی میزبان های متفاوتی ذخیره شده اند و یا سرویس های swarm توسط چندین برنامه شکل گرفته اند.
- macvlan: این درایور یک آدرس مک (mac address) به کانتینرها اختصاص می دهد تا آن ها را به دستگاه های فیزیکی شبیه کند. ترافیک از طریق آدرس مک کانتینرها از آن ها عبور می کند.
تفاوت داکر و ماشین مجازی (Docker VS VM)
ممکن است این سوال ذهن شما را درگیر کند که تفاوت داکر و ماشین مجازی در چیست؟ برای پاسخ به این پرسش باید آن ها را از جنبه های مختلف مانند پشتیبانی از سیستم های عامل، امنیت، قابلیت جابجایی و کارایی بررسی کنیم.
پشتیبانی از سیستم های عامل (OS Support)
ماشین های مجازی در بالای سیستم عامل میزبان، سیستم عامل جداگانه مربوط به خود را نیز دارند و همین باعث سنگین شدن و مصرف بیش از حد از منابع می شود ولی در داکر تمام کانتینرها به طور مشترک از سیستم عامل میزبان استفاده می کنند و همین امر باعث سبک تر بودن و مصرف کمتر از منابع می شود. همچنین سرعت لود شدن و بالا آمدن ماشین مجازی بسیار کندتر از داکر می باشد. داکر زمانی مناسب است که چندین برنامه را روی هسته یک سیستم عامل اجرا می کنید ولی اگر نیاز است تا برنامه از چندین سیستم عامل استفاده کند و پردازش انجام دهد باید از ماشین مجازی استفاده کنید.
امنیت (Security)
به دلیل این که در داکر چندین برنامه از سیستم عامل مشترک استفاده می کنند ریسک های امنیتی و احمال آسیب پذیری بیشتر از ماشین مجازی است. در ماشین مجازی چون برنامه ها سیستم عامل جداگانه خود را دارند و به صورت کامل از دیگر برنامه ها ایزوله هستند امنیت بیشتری برقرار است. همچنین در ماشین های مجازی اگر حمله ای صورت بگیرد شخص حمله کننده به منابع دیگر ماشین ها و برنامه ها دسترسی ندارد اما در ماشین های کانتینری می تواند به تمام کانتینرها و منابع آن ها دسترسی پیدا کند.
قابلیت جابجایی (Portability)
کانتینرهای داکر به دلیل این که سیستم عامل جداگانه ندارند به راحتی قابل حمل و اجرا بر روی هر سیستم عاملی هستند ولی ماشین های مجازی به دلیل این که دارای سیستم عامل های جداگانه و مختص خود هستند به نسبت کانتینرها بسیا سخت تر قابل جابجایی هستند و جابجایی آن ها زمان گیر است. برای زمانی که نیاز است تا برنامه ساخته شده بر روی چندین پلتفرم تست شود داکر گزینه مناسب تری است.
کارایی (Performance)
به دلیل این که داکر و ماشین مجازی کاربرد های متفاوتی دارند مقایسه آن ها از لحاظ کارایی کار چندان عادلانه ای نیست ولی به خاطر معماری و مصرف کمتر منابع، داکر بعضا گزینه مناسب تری از ماشین مجازی است. همچنین زمان شروع به کار داکر سریع تر از ماشین مجازی می باشد و همچنین کانتینرهای داکر نیازی به نصب سیستم عامل جداگانه ندارند.
به طور خلاصه اگر بخواهیم ویژگی های هر یک و تفاوت های آن ها را بیان کنیم:
- در ماشین مجازی ایزوله سازی فرایند ها در سطح سخت افزاری و در داکر در سطح سیستم عامل می باشد.
- هر ماشین مجازی دارای سیستم عامل مختص خود است ولی کانتینرهای داکر می توانند از سیستم عامل مشترک استفاده کنند.
- در ماشین مجازی سرعت بوت شدن بسیار بالاتر از داکر می باشد.
- ماشین مجازی منابع بیشتری به نسبت داکر مصرف می کند.
- ساخت ماشین مجازی زمان بر تر از ساخت کانتینر داکر می باشد.
موارد استفاده از داکر
حال که با مفهوم داکر و تفاوت های آن با ماشین های مجازی تا حدی آشنا شدید شاید این سوال برایتان مطرح شود که در چه مواقعی باید از داکر استفاده کنیم و در کجا نباید از آن استفاده کنیم؟ اگر برنامه شما در یکی از شاخه های زیر قرار می گیرد استفاده از داکر پیشنهاد می شود:
- یادگیری تکنولوژی های جدید: برای شروع کار با ابزاری جدید بدون نیاز به صرف زمان زیاد برای نصب و تنظیم، داکر محیطی ایزوله و قابل عرضه را ارائه می کند. بسیاری از پروژه ها تصاویر داکر را به همراه برنامه های مورد نیاز آن نصب و تنظیم می کنند.
- موارد استفاده ساده (Basic use cases): اگر برنامه شما ساده و یا استاندارد است شما می توانید بسیاری از برنامه های مورد نیاز خود را در قالب تصاویر داکر از Docker Hub به راحتی استخراج و از آن استفاده کنید.
- ایزوله کردن برنامه: اگر می خواهید چندین برنامه را بر روی یک سرور اجرا کنید با استفاده از داکر می توانید کامپوننت های هر برنامه را در کانتینرهای جداگانه نگه داری کنید و از مشکلات مدیریت وابستگی داده ها جلوگیری کنید.
- تیم های توسعه دهنده: اگر شما توسعه دهندگانی دارید که با تنظیمات مختلفی کار می کنند، با استفاده از داکر می توانید محیط های پیاده سازی محلی مشابه با محیط محصول فراهم کنید تا هر یک بر روی آن کار کنند.
در مواردی نیز استفاده از داکر توصیه نمی شود:
- برنامه شما پیچیده است و یا مدیر سیستم ندارید. برای پروژه های پیچیده و یا بزرگ image های آماده نیازهای شما را برطرف نمی کند همچنین ساخت، ویرایش و مدیریت ارتباط میان کانتینرهایی که روی سرورهای مختلف هستند فرایندی زمان بر است.
- کارایی امری ضروری برای برنامه شما است. سرعت اجرای فرایندهایی که روی سیستم عامل اجرا می شوند بیشتر از سرعت اجرای فرایندهایی است که در داخل کانتینرها اجرا می شوند و اگر نیاز دارید تا بهترین کارایی ممکن را دریافت کنید استفاده از داکر توصیه نمی شود.
- داکر یک تکنولوژی نسبتا جدید است که هنوز در حال توسعه می باشد و برای دسترسی به ویژگی های جدید نیاز است تا نسخه داکر خود را به طور مرتب آپدیت کنید و همچنین ضمانتی برای این که نسخه جدید سازگار با نسخه قبلی باشد وجود ندارد.
برای استفاده کردن یا نکردن از داکر باید موضوع و حیطه کار برنامه شما مشخص باشد تا بتوانید تصمیمی درست بگیرید چون اگر در جای نامناسب استفاده شود علاوه بر این که کار شما را بسیار سخت تر و پیچیده تر می کند، پاسخگوی تمام نیازهای شما نیز نمی باشد.
تفاوت داکر و ماشین مجازی
Docker ابزاری است که از کانتینرها برای ایجاد، استقرار و اجرای برنامه بسیار آسان تر استفاده می کند. این برنامه و وابستگی های آن را در داخل یک container متصل می کند.
اکنون تفاوت های قابل توجه بین کانتینرهای docker و ماشین های مجازی را به شما خواهیم گفت. تفاوت های قابل توجه این دو، پشتیبانی از سیستم عامل، امنیت، قابلیت حمل و عملکرد آنها است.
به اشتراک گذاشتن سیستم عامل میزبان بین کانتینرها آنها را بسیار سبک می کند و به آنها کمک می کند تنها در چند ثانیه راه اندازی شوند. از این رو، سربار مدیریت سیستم کانتینر در مقایسه با ماشین های مجازی بسیار کم است.
مقایسه سرور های مجازی و کانتینرهای Docker منصفانه نخواهد بود زیرا هر دو برای اهداف متفاوتی استفاده میشوند. اما معماری سبک وزن داکر، ویژگی کممصرف آن، آن را به انتخاب بهتری نسبت به ماشین مجازی تبدیل میکند. در نتیجه، کدام کانتینرها در مقایسه با ماشینهای مجازی میتوانند بسیار سریع راهاندازی شوند و استفاده از منابع بسته به بار یا ترافیک موجود در آن متفاوت است.