نتورک داکر چیست
سرویسهای اینترنتی و ابری خدماتی هستند که دنیای کسبوکار دیجیتال را با انقلاب روبرو کردهاند. نتورک داکر یک نوع وبسرویس پلتفرمی است که فضا و امکانات لازم برای اجرا شدن کد را در اختیار کدنویسان قرار میدهد. نتورک داکر از کانتینرهایی تشکیل شده است که هرکدام شبیهساز یک سیستمعاملاند. این سیستمعاملها همگی در داکر به یک هسته (کرنل) متصل شده و از طریق کانالهایی با یکدیگر در ارتباطند.
این شبیهسازی باعث میشود از هرجایی و با هر سیستمی تنها با اتصال به ابر بتوان روی پروژه کار کرده یا آن را تست کرد. در این مطلب قصد داریم نتورک داکر (Network Docker) را بهتر و دقیقتر بشناسیم.
نتورک داکر چیست
برای تعریف نتورک داکر ابتدا باید دو مفهوم دیگر را معرفی کنیم:
- سرویسهای پلتفرمی (Platform as a Service) : پلتفرمی است که در فضای ابری به توسعهدهندگان ارائه میشود تا در آن بدون روبرو شدن با پیچیدگیهای معمول، برنامههای خود را ساخته و تست کنند.
- کانتینر (Container) : کانتینر یک شبیهسازی از سیستمعامل است. تفاوت آن با سیستمعامل موجود روی کامپیوتر شما در وجود امکانات لازم برای اجرای کدهای مختلف است. در سیستمعاملهای معمولی برای اجرا شدن هر کد لازم است مواردی را از قبل روی کامپیوتر خود نصب کنید. کانتینر اما از طریق فضای ابری این پیشنیازها را در اختیار توسعهدهندگان قرار میدهد. در کانتینر بدون نیاز به هیچ کار اضافهای تنها کد را نوشته و اجرا میکنید.
حالا به تعریف نتورک داکر برمیگردیم؛ داکر یک سرویس پلتفرمی است که از شبیهسازی سطحسیستمعامل، برای ارائه نرمافزار در قالب پکیجهایی که کانتینر نامیده میشوند استفاده میکند.
هر کدام از این کانتینرها برنامه مخصوص به خود، کتابخانهها و فایلهای خود را نگهداری میکنند و از طریق کانالهای مشخصی با یکدیگر ارتباط دارند. هسته مرکزی تمام این سیستمعاملهای مجازی یک کرنل مشترک است.
در واقع داکر یک سیستمعامل است که از طریق واحدهای مجزا در اختیار شما قرار میگیرد. کاربرد اصلی داکر در توسعه تیمی پروژههای بزرگ و چندبخشی است. با داکر میتوان بخشهای مختلف برنامه را با سرعت بالا ویرایش و تست کرد.
تاریخچه نتورک داکر چیست
سالومون هایکس و سباستین هال برای اولین بار در تابستان ۲۰۱۰ این ایده را عملی کردند. هایکس که در آن زمان در شرکت «دات کلود» شاغل بود (شرکتی که سرویس پلتفرمی در بسیاری از کشورها ارائه میدهد) این پروژه را بهعنوان پروژه داخلی شرکت آغاز کرد. هایکس برای اولین بار در کنفرانس بینالمللی پایتون یا PyCon از داکر رونمایی کرد. داکر به عنوان سیستمی متنباز معرفی شد و در آن زمان از LXC برای محیط اجرا استفاده میکرد. LXC یک شبیهسازی سیستمعامل برمبنای لینوکس است. با گذشتن یک سال از معرفی داکر، هایکس و همکارانش LXC را با محیط ویژه خودشان جایگزین کردند و کاملا مستقل شدند.
معرفی داکر و محبوبیتی که توسط این نرمافزار بهدست آمد، شرکتهایی مثل مایکروسافت را به این فکر انداخت تا سیستمعاملهای خود را با داکر هماهنگ کنند. اولین سیستمعامل که با سازندگان داکر جهت Adopt کردن آن به توافق رسید، RedHat بود. در ادامه مایکروسافت هم با داکر به توافق رسید و بهتدریج، داکر تبدیل به یکی از ملزومات حضور در دنیای برنامهنویسی شد. قراردادهای استراتژیک با IBM و آمازون در این راه بسیار موثر بودند. در حال حاضر این شبیهساز سیستمعامل گوی سبقت را از ماشینمجازی (Virtual Machine) ربوده است.
داکر چگونه کار میکند؟
داکر محدودیتهای فیزیکی را از اجرای برنامه حذف میکند. در زمان قدیم برای انتقال برنامهها روی سرورها یا کامپیوترهای مختلف، لازم بود تمام پیشنیازهای اجرا نیز منتقل شوند. در داکر تمام این وابستگیها (Dependancies) که پیشنیازهای اجرای برنامه هستند در یک حملکننده (کانتینر) ذخیره شده و از این طریق قابلیت اجرا روی هر سیستم یا سروری را دارند. هسته مرکزی داکر همان کرنل لینوکس است.
اگرچه داکر از هسته مرکزی لینوکس استفاده میکند، سازندگان آن پس از ورژن ۰٫۹ با طراحی libcontainer (حامل کتابخانهها) توانستند علاوه بر بهره بردن از امکانات لینوکس، محدودیتهای آن را دور بزنند. داکر همچنین برای بهتر شدن شبیهسازی خود از سه رابط شبیهسازی انتزاعی به صورت همزمان استفاده میکند. این سه رابط عبارتند از LXC، libvirt و systemd-nspawn .
معماری داکر
داکر با سلسله مراتب خاصی کار میکند. این سلسله مراتب از نوع کلاینت-سروری است. برای شناخت این سلسله مراتب و نحوه تعامل توسعهدهندگان با آن نیاز داریم اول اجزای آن را بشناسیم. معماری شبکه در داکر از اجزای زیر تشکیل میشود:
- Docker Deamon: این بخش با کلاینت در ارتباط است و درخواستهای او را اجرا میکند. کنترل بخشهای مختلف داکر در دست این بخش بوده و همیشه در انتظار درخواست کلاینت است.
- Docker Client: راهی که اکثر کلاینتها از طریق آن با داکر دیمن ارتباط میگیرند کدنویسی بهعنوان کلاینت است. از دستورات نوشته شده توسط کلاینت میتوان به Ducker run اشاره کرد. یک کلاینت میتواند با چند دیمن در ارتباط باشد.
- Docker Registeries: imageها در این بخش ذخیره شده تا در زمان درخواست کلاینت به او ارائه شوند.
- Docker Objects: بخشهای درونی داکر که فعالیتها و اطلاعات کلاینت در قالب آنها ذخیره میشود.
- Images: فایلی Read-only که در خود دستورالعملهایی برای ساخت یک کانتینر را دارد. معمولا یک image از روی یک image دیگر ساخته میشود و هر بار تغییراتی در تنظیمات کانتینر ایجاد میشود. تنظیمات لازم برای اجرا شدن برنامه شما در این فایل قرار دارد.
- Containers: کانتینر نسخه قابل اجرای image است. شما با استفاده از API یا CLI داکر میتوانید با محتویات کانتینر کار کنید. دستورات اصلی مربوط به کانتینر عبارتند از : Create، Start، Stop، Move و Delete. شما میتوانید کانتینر را گسترش دهید یا با تغییرات ایجاد شده را در قالب یک image تازه ذخیره نمایید.
دستورات داکر
در ادامه چند نمونه از دستورات داکر را بهعنوان مثال میآوریم:
فهمیدن ورژن نصب شده از داکر:
Docker -version
دریافت یک image:
Docker pull <image name>
ساخت یک کانتینر از یک image:
Docker run -it -d <image name>
دریافت فهرستی از کانتینرهای در حال اجرا:
Docker ps
دریافت فهرستی از تمام کانتینرها (بسته شده و در حال اجرا):
Docker ps -a
دسترسی به یک کانتینر خاص:
Docker exec <container id> bash
توقف اجرای کانتینر:
Docker stop <container id>
توقف فوری اجرای کانتینر:
Docker kill <container id>
ساخت یک image تازه از کانتینر:
Docker commit <container id> <username/imagename>
لاگین به داکر:
Docker login
کاربرد درایورها در داکر
درایورها در داکر امکانات لازم جهت کار با داده و جابجایی آن را فراهم میکنند. داکر یک سری درایور اصلی دارد که در ادامه معرفی میکنیم. متنباز بودن داکر امکان اتصال درایورهای مختلف و شخصیسازی کردن تنظیمات را به توسعهدهندگان میدهد.
- Overlay2 درایور مورد ترجیح سازندگان داکر برای ذخیره اطلاعات است. این درایور به علت سازگاری بالا با داکر نیاز به نصب موارد اضافه برای کار کردن ندارد.
- Aufs برای کسانی که از ورژن ۱۸٫۰۶ داکر و ۱۴٫۰۴ اوبونتو روی کرنل ۳٫۱۳ استفاده میکنند مناسب است. این ورژن از overlay2 پشتیبانی نمیکند.
- Devicemapper پشتیبانی میشود اما فقط در صورت برخورداری از loopback-lvm عملکرد قابل قبولی خواهد داشت.
- از دیگر مواردی که معمولا بهعنوان درایور ذخیرهسازی در داکر استفاده میشوند، میتوان به brtfs، zfs و vfs اشاره کرد. همانطور که گفتیم قابلیت شخصیسازی و استفاده از درایورهای نامرسوم نیز وجود دارد.
- ارتباط دو کانتینر به همدیگر با درایور Bridge داکر ممکن میشود.
مزایای کلیدی داکر
- حذف محدودیت سیستمها: شما با اجرا کردن داکری که حاوی کدتان است روی هر سیستمی میتوانید کد را اجرا کنید. کامپیوتری که برنامه روی آن اجرا میشود تنها نیاز به اتصال به اینترنت دارد.
- استفاده بهینه از منابع: حجم کم کانتینرهای داکر باعث میشود کمترین مقدار ممکن حافظه صرف اجرای برنامه شود.
- سرعت بخشیدن به روند توسعه: با استفاده از داکر هیچ مرزی وجود ندارد. اعضای تیم حتی در سفر و با یک کامپیوتر ساده میتوانند کد را تغییر داده یا آن را تست کنند. این قابلیت داکر باعث محبوبیت آن شده است زیرا کسبوکارهای اینترنتی امروزه نیاز مبرمی به واکنش سریع به تغییرات بازار و حرکات رقبا دارند.
- پشتیبانی از مایکروسرویسها: برای نرمافزارهایی که از چندین بخش پیچیده تشکیل میشوند، مایکروسرویسها کار را سریعتر و راحتتر میکنند. کانتینرها سازگاری بسیار خوبی با پیادهسازی مایکروسرویس دارند.
مشکلاتی که با داکر حل نمی شود
در قسمت گفتیم داکر چه امتیازاتی برای تیمهای نرمافزاری بهارمغان میآورد. اما بعضی مشکلات هست که باید از راههای دیگر حل شوند. این مشکلات عبارتند از:
- مشکل امنیت: داکر امنیت بالاتری نسبت به سیستمهای معمولی و کامپیوترهای شخصی دارد؛ اما نمیتوان برای پروژههای بزرگ به این مقدار بسنده کرد.
- مشکل برنامهنویسی: داکر قرار نیست جای نبوغ و تلاشهای برنامهنویسانه را بگیرد. در واقع نباید از داکر انتظار معجزه داشت.
- ایزوله بودن بخشهای برنامه: اگر پروژه شما سنگین بوده و هر بخش نیازمند تنظیمات دقیق و خاص خود باشد، ماشین مجازی گزینه بهتری خواهد بود.
مقایسه کانتینر با VM
Virtual Machine یا ماشین مجازی هم یک شبیهسازی کامپیوتر است که برای اهدافی مشابه اهداف داکر به کار گرفته میشود. این دو مفهوم اگرچه شباهتهای اساسی به یکدیگر دارند، نباید با هم اشتباه گرفته شوند. ماشین مجازی انتزاعی از لایه فیزیکی شبکه است که یک سرور را به چندین سرور تبدیل میکند. شما میتوانید چندین ماشین مجازی را روی یک ماشین اجرا کنید. کانتینرها انتزاعی از لایه app شبکه هستند که کدها و وابستگیهای مربوط به آنها را بستهبندی میکنند. چندین کانتینر روی یک سیستم قابلیت اجرا دارند و همگی از یک هسته (کرنل استفاده میکنند).
تفاوت اساسی کانتینر و VM
تفاوت اساسی کانتینر و VM در حجم اشغالی است. ماشینهای مجازی دهها گیگ و کانتینرها دهها مگ فضا اشغال میکنند. در عوض ماشین مجازیهای مختلف هر کدام یک کامپیوتر مجزا هستند و از همین رو استقلال بیشتری نسبت به کانتینرها ارائه میدهند. ماشین مجازی سرعت پایینی برای بالاآمدن دارد.
انتخاب بین این دو کاملا مربوط به ویژگیها و نیازهای پروژه خواهد بود. سبکی و سرعت کانتینر امتیاز خوبی است اما تمام پروژهها نمیتوانند از آن استفاده کنند. برای مثال اگر اولویت شما برقراری امنیت در پروژه باشد یا بخواهید از چند سیستمعامل به صورت همزمان استفاده کنید، کانتینر انتخاب بدی برای شما خواهد بود.
کلام آخر
نتورک داکر پدیده ایست که کار شبیهساز سیستمهای کامپیوتری را برای تیمهای برنامهنویسی انجام میدهد. بر خلاف ماشین مجازی که شبیهسازی لایه فیزیکی شبکه است، نت ورک داکر شبیه سازی لازه اپلیکیشن بوده و به مراتب سبکتر و سریع تر از ماشین مجازی عمل میکند.
در قلب نتورک داکر، کانتینرهایی قرار دارند که همه از طریق کانالهایی با هم در ارتباط بوده و به یک هسته (کرنل) متصل میشوند. کدها بههمراه وابستگیهایشان در این کانتینرها قرار میگیرند و بهاینصورت دیگر نیاز نیست مثلا برای اجرای کد جاوا JRE نصب کنید.
میتوانید با هر کامپیوتر و از هرجایی تنها با دسترسی به اینترنت و داشتن ظرفیت پردازشی کافی، به کدد متصل شده و روی آن تغییراتی ایجاد کرده یا آن را تست کنید. کانتینرها اگر مناسب پروژه شما باشند میتوانند کار شما را راحتتر کنند. انتخاب درست بین داکر و ماشین مجازی بسیار حیاتی است.