برای اجرای کدهای یک پروژه روی سرورهای مختلف، تمام کتابخانهها و نیازهای سیستمی آن را به همراه کد در یک واحد نرمافزاری تحت عنوان Container قرار داده و نگهداری میکنند. افراد مختلفی در مراحل مختلف توسعه، تست و استقرار کد نقش ایفا میکنند و هر کدام از این افراد سرورهای متفاوتی را برای انجام کارها مورد استفاده قرار میدهند. به این ترتیب، بهرهبرداری از Container این همکاری را آسان کرده و سرعت میبخشد، چرا که با به اشتراکگذاری Container مستقل از پیکربندی سیستم میتوان کد را اجرا کرد. در حالیکه بدون وجود Container، برای اجرای هر بخش از توسعه، تست و استقرار، کتابخانهها و سایر موارد باید نصب و پیکربندی شوند. در ادامه این نوشته برای دریافت پاسخ داکر چیست با ما همراه باشید.
کدها به وسیله Container به راحتی بین محیطهای مختلفی چون لپتاپ توسعهدهنده، محیط تست، محیط استقرار محصول، ماشینهای مجازی ابری و زیرساخت سنتی جابجا میشوند. این در حالی است که مشکلات ساختارهای سنتی مانند ورژنهای مختلف زبانها یا کتابخانهها، توزیعهای مختلف سیستمعاملها، پیکربندی شبکه سیستمها و سیاستهای مختلف امنیتی دیگر نمیتوانند مانعی برای این جابجاییها باشند.
استفاده از Container فقط محدود به همکاری تیمها بر روی یک تکه کد نیست، بلکه برای پاسخ سریع به نیازهای کسبوکار نیز کاربرد فراوان دارد. یک Container میتواند مستقل از نوع زیرساخت (ابری یا سنتی و یا ترکیبی از این دو) برای مقیاسپذیری بسیار مفید باشد، چون میتوان تعداد نسخههایی از یک نرمافزار که اجرا میشوند را به آسانی افزایش یا کاهش داد.
این مقاله را بخوانید که به طور دقیق و جامع بدانید داکر چیست؟
بررسی فنی Container
از لحاظ فنی، Container مجموعهای از یک یا چند پردازه است که از دیگر بخشهای سیستم، ایزوله شدهاند و فایلهای لازم برای اجرای کد را شامل میشوند. محتویات یک Container را میتوان مانند توزیعی از لینوکس در نظر گرفت که تمامی Packageها، کتابخانهها، فایلهای پیکربندی و سایر موارد را در برمیگیرد، حجم بسیار کمی دارد و در زمان بسیار کوتاهی میتوان آن را نصب کرد.
Container را میتوان یک فناوری مبتنی بر مجازیسازی در نظر گرفت، با این تفاوت که از Kernel سیستمعامل میزبان استفاده میکند و صرفاً پردازهها را از هم جدا میکند. در سایر فناوریهای مجازیسازی مانند IaaS یا Infrastructure as a Service، باید برای هر یک از سیستمهای مهمان یک نسخه کامل سیستمعامل را نصب کرد که به هیچ وجه بهینه نیست، اما استفاده از Container این مشکل را برطرف کرده و بهینگی بسیار بالایی دارد.
به شکل کلی، Container در مقایسه با ماشین مجازی یا Virtual Machine استفاده از منابع را بهینه میکند، رابط کاربری استانداردی دارد، ایزولهسازی بهتری بین پردازهها دارد، زمان بوت پایینتری دارد و به عنوان یک بخش کوچک از یک نرمافزار بزرگ به خاطر داشتن ماژولاریتی بالا بهتر مدیریت میشود. همچنین، برنامههای Multi-Container به کمک ابزارهایی مانند Kubernetes بین چندین ابر بهتر ساماندهی میشوند.
Docker چیست؟
اکنون وقت آن است که به طور دقیق بگوییم داکر چیست؟
Container واحد استانداردی از نرمافزار است که در کنار کد اپلیکیشن، تمام ملزومات اجرای آن را نیز به همراه دارد تا بتوان آن را به سادگی از یک محیط پردازشی به محیط پردازشی دیگر منتقل کرد. این مفهوم اولین بار در سال ۲۰۰۰ معرفی شد ولی در سال ۲۰۱۳ و با ظهور پروژه Docker به شکل جدی مورد توجه قرار گرفت.
Docker Container Image یک بسته سبک قابل اجرای نرمافزاری است که تمام آنچه برای اجرای یک برنامه لازم است را در خود دارد. این بسته شامل مواردی مانند: Code، Runtime، System Tools، System Libraries و تنظیمات میشود.
از امکاناتی که به وسیله Docker برای تیمها فراهم شده است، سادهتر شدن کار روی پروژههای نرمافزاری است. پیش از این، زمانیکه توسعهدهنده تکه کدی را برای تستکننده ارسال میکرد، یکسان نبودن کتابخانههای دو طرف باعث به مشکل برخوردن فرآیند میشد. با استفاده از Docker و با ضمیمه کردن تمام ملزومات اجرای کد در Container، مشکلاتی مانند این از بین رفته است.
از نظر فنی، Container یک یا مجموعهای از پردازههای ایزوله شده است. از این نظر، Container از یک سیستمعامل مستقل مانند آنچه در ماشین مجازی وجود دارد، متفاوت است. برای این ایزولهسازی از دو قابلیت Namespaces وControl Groups کرنل لینوکس استفاده میشود. با Container میتوان از توزیعهای مختلف لینوکس به شکل همزمان روی یک Host که Kernel لینوکس را در اختیار قرار میدهد، استفاده کرد.
پیکربندی و مدیریت Container بدون استفاده از Docker و به وسیله Namespaceها و Control Groupها کار بسیار دشواری است، اما به کمک از Docker، بدون آنکه درگیر جزئیات ریز فنی ماجرا شویم، میتوانیم از قابلیت Container به بهترین شکل استفاده کنیم.
Conternization با Docker
در این بخش قصد داریم با یکی از روشهای جدید مجازیسازی با استفاده از Containerها موسوم به Docker آشنا شویم. اما واقعاً چرا به Docker نیاز داریم؟
جواب کوتاه: چون میخواهید به عنوان یک کاربر، بتوانید نرمافزارهای گوناگون را خیلی راحت و سریع نصب کنید. همچنین اگر برنامهساز هستید نیاز دارید برنامه شما توسط کاربران به آسانی قابل اجرا باشد.
جواب بلند: شیوه قدیمی/فعلی نصب بسیاری از نرمافزارها به اینصورت است که شما ابتدا باید بسته (package) نرمافزاری مورد نظرتان را برای سیستمعامل خودتان، مثلاً بصورت یک Installer برای ویندوز یا بسته RPM برای RedHat Linux، پیدا کنید و سپس باید مطمئن شوید که پیشنیازهای لازم (dependency) برای آن را نصب کردهاید و تنها پس از آن است که میتوانید اقدام به نصب کنید.
البته در بیشتر موارد داستان به همین جا ختم نمیشود. احتمال دارد شما برنامهای از قبل روی سیستمتان داشته باشید که با این برنامه جدید تداخل کند. محتملترین حالت وجود نسخه قدیمیتری از همین برنامه است که نیاز دارید ابتدا آن را از روی سیستم حذف کنید. حذف کردن برنامهها هم در برخی موارد کار سادهای نیست و ممکن است حتی پس از حذف یک برنامه نیاز داشته باشید بخشهایی از آن را که بر روی سیستم شما باقی مانده است تک تک پیدا کرده و پاک کنید تا تداخل کاملاً برطرف شود. در این قبیل موارد تغییرات در فایلهای سیستمی معمولاً بیشترین دردسر را ایجاد میکند چون به نوعی میتوان گفت سیستم شما را آلوده کرده است و برگرداندن آن به وضعیت قبلی کار آسانی نیست.
مشکل بزرگتر زمانی پیش میآید که برنامه جدید با یکی از برنامههای موجود تداخل میکند ولی شما به هر دوی آنها نیاز دارید. مثالهای معروف آن نصب نسخههای متفاوتی از ابزارهای یک زبان برنامهنویسی است. مثلاً برای داشتن نسخههای متفاوتی از ruby به صورت همزمان روی یک سیستم به مشکل برخواهید خورد و نیاز دارید از یک برنامه دیگر به نام rvm استفاده کنید. متأسفانه برای بیشتر بستههای نرمافزاری چنین امکانی اصلاً وجود ندارد و شما باید تنها یک نسخه را در هر زمان نصب کنید.
استفاده از ماشینهای مجازی (Virtual Machine) تا حدی میتواند در حل این مشکلات کمک کند ولی حجیم بودن و سرعت پایین نصب و راهاندازی مانع از همه گیر شدن این روش شده است. همچنین تمام برنامههایی که روی یک ماشین مجازی خاص نصب میشوند همچنان در معرض این مشکلات قرار دارند.
Docker به عنوان یک ابزار روزمره این امکان را فراهم میکند که شما بدون نیاز به آلوده کردن سیستم خودتان هر نرمافزاری را که به صورت Container ساخته شده باشد به سرعت و بصورت کاملاً مجزا نصب و اجرا کنید. زمانی هم که به این Container احتیاج نداشته باشید با حذف کردن آن تمامی آثار آن از سیستم شما پاک خواهد شد. نصب داکر به صورت مجزا انجام میشود.
به این ترتیب مثلاً شما میتوانید نسخههای متفاوتی از یک محصول را به صورت همزمان نصب و اجرا کنید بدون اینکه آنها از وجود یکدیگر با خبر شوند. سادگی و سرعت استفاده از Containerها نیز به مراتب بیشتر از ماشینهای مجازی است و همین امر باعث میشود استفاده از آنها در کار روزمره عملیتر باشد.
Container چیست؟
این روزها امکان ندارد به کنفرانسهای توسعهدهندگان نرمافزار بروید و در مورد Containerها نشنوید: Docker، Kubernetes، Mesos و کلی اسم دیگر. مایکروسافت، گوگل، آمازون و بسیاری از شرکتهای بزرگ دیگر در یک سال اخیر یا حتی قبلتر به این سمت رفتهاند، اما چرا همه در این مورد تا این حد مشتاقاند؟
برای درک این موضوع که چرا Containerها آنقدر ارزشمند هستند، بیایید کمی درمورد Containerها در دنیای فیزیکی بیاندیشیم. در صنعت مدرن همه از Containerها برای جابجایی استفاده میکند، زیرا بشر استانداردهایی برای سایز Containerها وضع کرده است. قبل از وضع این استاندارد، جابجایی هر چیزی بصورت کلی یک کار پیچیده و دشوار بود. تصور کنید چه زحمتی در جابجایی یک کارتن از تلفنهای هوشمند از روی کشتی تا روی ماشین بارکش باید متحمل میشدند. اما حالا بجای جابجایی یکسری تلفن هوشمند خاص از آسیا، ما آنها را در یک Container جا میدهیم و مطمئن خواهیم بود که این Container در هر کشتی و سیستم باربری به سادگی قابل بارگیری است.
در واقع ایده استفاده از Containerهای نرمافزاری در Docker از سیستمهای حمل و نقل گرفته شده است، در سیستم حمل و نقل یا اصطلاحاً Cargo Transport از مخزنها مختلفی جهت حمل اقلام استفاده میشود. از بشکهها برای حمل و نقل سوختها، از جعبههای چوبی، کیسهها و… اما با بروز شدن سیستمهای حمل و نقل استفاده از کانتینترها برای حمل و نقل انواع اقلام رایج شد. دلیل ایجاد Containerهای نرمافزار در Docker هم موردی مشابه بود.
به جای جابجایی تمام سیستمعامل و نرمافزارتان (و حتی نرمافزارهایی که نرمافزارتان به آن وابسته است)، شما به راحتی کدتان را بستهبندی میکنید و کد شما تنها به یک Container وابسته است که میتوانید آن را همهجا به راحتی منتقل کنید و به چون معمولاً این Containerها بسیار کوچک هستند، میتوانید تعدا زیادی Container را روی یک سیستم کامپیوتری اجرا کنید.
دلیل ایجاد Containerهای نرمافزاری هم موردی مشابه بود. به جای جابجایی تمام سیستمعامل و نرمافزارتان (و حتی نرمافزارهایی که نرمافزارتان به آن وابسته است)، شما به راحتی کدتان را بستهبندی میکنید و کد شما تنها به یک Container وابسته است که میتوانید آن را همهجا به راحتی منتقل کنید و به چون معمولاً این Containerها بسیار کوچک هستند، میتوانید تعدا زیادی Container را روی یک سیستم کامپیوتری اجرا کنید.
خب چرا Containerها تا این حد ارزشمندند؟ قبل از اینکه Containerها مانند امروز محبوب شوند، ماشینهای مجازی تکنولوژیای بودند که اجازه میدادند روی یک سرور تعداد زیادی برنامه اجرا کنیم که کاملاً از هم جدا و در محیطی ایزوله باشند. این تکنولوژی، وجود اولین نسل از سیستمهای پردازش ابری را ممکن ساخت (و حتی تا حدی سیستمهای میزبانی وب را). اگر بخواهید برای هر برنامه یک سرور مجزا تهیه کنید، هزینههای آن بشدت سنگین تمام میشود.
روشی که ماشینهای مجازی کار میکنند، بستهبندی تمام سیستمعامل و کدها با همدیگر است. سیستمعاملهای روی ماشینهای مجازی بصورت یک سرور جدا دیده میشوند، اما در حقیقت آنها یک سرور را با تعدادی از ماشینهای مجازی دیگر شریک شدهاند. هرکدام از آنها سیستمعامل خود را اجرا میکنند و در مورد همدیگر چیزی نمیدانند. به هر صورت همه آنها وابسته به سیستم عامل مقصدند که اجازه میدهد هر کدام از این ماشینهای مجازی به این اندیشه باشند که مهمترین قسمت دنیا هستند. اما خب مشکلش کجاست؟ سیستمعاملهای مجازی میهمان، اساساً روی سرورهای شبیهسازی شده اجرا میشوند و این یک سربار بزرگ ایجاد میکند و همه چیز به نسبتی کند میشود. (اما با این حال میتوانید تعداد زیادی از انواع سیستمعاملهای موجود را روی یک سرور اجرا کرد.)
در بحث جابجایی Containerها، ماشینهای مجازی چیزی است شبیه به داشتن یک Container بزرگ با تعداد زیادی استخر کوچک که تمام ویژگیهای خاص Containerهای کوچک با هم منتقل میشود.
Containerها بسیار متفاوت از ماشینهای مجازی عمل میکنند. چون آنها تنها به نرمافزار، کتابخانهها، frameworkها و این قبیل چیزها وابسته هستند و شما میتوانید تعداد زیادی از آنها را روی یک سیستمعامل میزبان اجرا کنید. تنها سیستمعامل نصب شده روی سرور، سیستمعامل اصلی است و Containerها مستقیماً با آن صحبت میکنند. به این شیوه، Containerها کوچک و سربار آنها بسیار کم میشود.
ماشینهای مجازی از “hypervisorها” به عنوان یک لایه بین کامپیوترهای مهمان و سیستمعامل اصلی استفاده میکنند. برای Containerها مفهموم مشابه، Container Engine است که در حال حاضر Docker Engine به محبوبترین آنها بدل شده است.
Containerها مدتهاست که یک ویژگی روی هسته لینوکس هستند اما استفاده از آن سخت بود. Docker با هدف ساده ساختن استفاده از Containerها و استفاده ساده توسط توسعهدهندگان به میدان آمد.
Containerها کار را برای توسعهدهندگان تا آن حد ساده کرده که توسعهدهندگان بدانند بدون اینکه مهم باشد کجا قرار است نرمافزارشان پیاده شود، قادر به اجرا خواهد بود. در Containerها، همچنین مفهوم میکروسرویسها را پیاده کردند. یعنی به جای داشتن یک نرمافزار monolithic بزرگ، در نگاه میکروسرویسی نرمافزارها، به تعدادی قسمت کوچکتر که میتوانند با همدیگر ارتباط برقرار کنند، قسمت میشوند. این بدان معنی است که تیمهای مختلف میتوانند به سادگی روی بخشهای مختلف نرمافزارها کار کنند در عین اینکه نیاز نیست تغییرات بزرگی در نحوه کارکرد نرمافزارهایشان برای ارتباط با دیگر نرمافزارها بوجود آورند و نرمافزارها میتوانند بصورت مستقل از آنها به کار خود ادامه دهند. این روش میتواند توسعه نرمافزارها را سریعتر و تست برای یافتن خطاهای احتمالی را آسانتر کند.
برای مدیریت تمام این Containerها، شما به بستههای نرمافزاری دیگری مانند Kubernetes (که توسط گوگل توسعه داده شده) نیاز دارید که کمک میکند Containerها روی ماشینهای مختلف پیادهسازی و اجرا شوند، مطمئن باشید که آنها در حال اجرا هستند و کمک کند Containerها بیشتری را به راحتی وارد چرخه کنید وقتیکه نیاز دارید آنها را افزایش دهید و اگر نیاز دارید که Containerها در مورد همدیگر بدانند، پس همچنان به پیادهسازی یک شبکه مجازی نیاز پیدا میکنید که میتوانید این کار را با اتصال آدرس IP مجزا به هر Container انجام دهید.
Containerها میتوانند همه انواع نرمافزارها را اجرا کنند، اما از آنجا که آنها بسیار با ماشینهای مجازی متفاوتند، تعداد زیادی از نرمافزارهای قدیمی که در شرکتهای بزرگ نرمافزاری در حال اجراست به این مدل تبدیل نشدهاند. ماشینهای مجازی میتوانند به شما کمک کنند که نرمافزارهای قدیمی را روی سرویسهای ابری همچون AWS یا Microsoft Azure منتقل کنید، ولی با این حال حتی با وجود مزایای بسیار زیاد Containerها، ماشینهای مجازی به این زودی از رده خارج نمیشوند.
Docker خود را اینگونه معرفی میکند:
Build any app, Ship any where, Run any where
سوالی که مهم است و در ابتدا باید به آن پاسخ داد سوال زیر است:
Docker چه تفاوتی باVirtual Machinها دارد؟
سوالی که در ذهن هر شخص قبل از ورود به دنیای Docker خطور میکند بعد از این که داکر چیست؟ همین سوال است. یکی از کارهایی که میتوان در Docker انجام داد عبارت است از نصب سریع یک سیستمعامل، نصب ابزارهای مورد نیاز روی آن و در نهایت تست نرمافزار خود و پس از پایان کار پاک کردن محیط تست. تفاوت Docker با Virtual Machin را میتوانید در در شکل زیر مشاهده نمایید.
در شکل فوق، هم در Docker و هم در ماشینمجازی دو عنصر Server و Host OS مشترک هستند. در مرحله بعدی در ماشینمجازی یک مجازیساز مانند VMware Workstation، VirtualBox و در Docker نرمافزار Docker را نصب داریم. تفاوتها از اینجا شروع میشود که در ماشینمجازی باید یک سیستمعامل کامل را نصب و نرمافزارها را روی آن نصب کرد. ولی Docker این مرحله را ساده کرده است و یک نسخه کوچک از سیستمعامل را در خود دارد که بدون نیاز به نصب سیستمعاملهای سنگین و پیچیده میتوان نرمافزارها را روی آن نصب و تست کرد.
هرچند میتوان نسخه کوچکی از نسخههای مختلف سیستمعامل را نیز نصب کرد ولی باز هم بسیار راحتتر از سیستم ماشینهای مجازی است. از مزایای استفاده از Docker نسبت به مجازیساز میتوان به موارد زیر اشاره کرد:
- ایجاد و حذف بسیار سریعContainer ها
- restart و خاموش کردن بسیار سریع
- انتقالپذیری راحت و سبک
- مدیریت منابع و resourceها بصورت قدرتمند و متغیر
- و…
مجازیسازی در سطح سیستمعامل یا OS Level Virtualization چیست؟
همانطور که میدانید مجازیسازی انواع مختلفی دارد، مجازیسازی سرور، مجازیسازی دسکتاپ، مجازیسازیApplication ها و مجازیسازی نرمافزارها از جمله این تنوعهای مجازیسازی هستند. در این بخش قصد داریم در خصوص یک مفهوم جالب در مجازیسازی یا در واقع یک لایه جدید در مجازیسازی به نام OS Level Virtualization یا مجازیسازی در سطح سیستمعامل بپردازیم. زمانیکه صحبت از مجازیسازی میشود بلافاصله ما یک نرمافزار Hypervisor و سیستمعاملهای مجازی که داخل این Hypervisor ایجاد میشوند را در ذهن تصور میکنیم اما به عنوان یک متخصص IT جالب است بدانید که ما میتوانیم بدون ایجاد کردن یک سیستمعامل جدید و مجزا هم یک سرور مجازی ایجاد کنیم!!! این در واقع همان تکنولوژی است که ما آن را به عنوان مجازیسازی در لایه سیستمعامل میشناسیم.
مجازیسازی در لایه سیستمعامل یا Operating System Level Virtualization یک روش مجازیسازی سرور است که هسته یا Kernel سیستمعامل این اجازه را به شما میدهد که چندین سیستمعامل مجازی از درون یک سیستمعامل بصورت کاملاً ایزوله بیرون بکشید در واقع شما یک سیستمعامل اصلی دارید که همه چیز بر هسته همین سیستمعامل بنا نهاده شده است و سیستمعامل جدیدی که به شما داده میشود بر پایه و هسته این سیستمعامل اولیه است. به این ماشین مجازی یا در اصطلاح فنیترinstance ی که توسط مجازیسازی در لایه سیستمعامل خروجی داده میشود در اصطلاح فنی Container یاSoftware Container ، Virtualization Engine یاVE ، Virtual Private Server یا VPS و برخی اوقات Jail هم گفته میشود. این سیستم مجازی که در اختیار کاربر قرار میگیرد این احساس را به کاربر میدهد که در حال کار کردن با یک سیستم کاملاً واقعی است اما در باطن این سیستم کاملاً مجازی و وابسته به هسته سیستمعامل اصلی است. در سیستمعاملهای خانواده لینوکس و یونیکس با استفاده از مکانیزمی به نام chroot شما میتوانید تکنولوژی مجازیسازی در لایه سیستمعامل را پیادهسازی کنید. علاوه بر مکانیزم ایزوله کردن هسته یا Kernel اصلی سیستمعامل میتوانید قابلیت مدیریت منابع بر اساس نیاز هر Container را نیز فراهم کند.
از مجازیسازی در لایه سیستمعامل در کجا استفاده میشود؟
از تکنولوژیهای مجازیسازی در لایه سیستمعامل بیشتر در محیطهای هاستینگ مجازی استفاده میشود، در اینگونه محیطها مدیران هاستینگ نیاز به راهاندازی و تخصیص منابع سختافزاری به تعداد زیادی کاربرانی است که هاست لینوکس یا ویندوز نیاز دارند و سرعت عمل و امنیت و همچنین مدیریت ساده از اولویتها به حساب میآید. البته متخصصین IT در سازمانهای مختلف نیز ممکن است از تکنولوژی مجازیسازی در لایه سیستمعامل استفاده کنند برای مثال ممکن است یک متخصص IT بخواهد سرورهای خودش را جمعآوری و آنها را در قالبContainer ها برای استفاده بهینه از منابع و کاهش تعداد سرورهای فیزیکی و حتی مجازی استفاده کند. یکی دیگر از مواردی که مجازیسازی لایه سیستمعامل بسیار میتواند کاربردی باشد ایزوله کردن منابع سختافزاری و نرمافزاریApplication ها برای بالا بردن امنیت و تخصیص درست منابع است، برای مثال شما میخواهید بر روی یک سرور لینوکس یا ویندوز چندین نرمافزار تخصصی و کاربردی را بدون تداخل با سایر نرمافزارها داشته باشید و نمیخواهید دغدغهها و درگیریهای سیستمعاملهای جانبی را داشته باشید و منابع را نیز میخواهید بصورت اختصاصی در اختیار هر Application قرار بدهید. یکی از قابلیتهای بسیار جذابی که در OS Level Virtualization وجود دارد امکان استفاده از Live Migration است که شما میتوانید در یک Cluster ازContainer ها Load کاری بین سیستمعاملها را تقسیم کنید و ماشینهای مجازی را نیز به راحتی جابجا کنید.
مجازیسازی در لایه سیستمعامل چه مقدار Overhead بر روی OS دارد؟
مجازیسازی در لایه سیستمعامل در واقع به خاطر کاهش بسیار زیاد Overhead تا حد صفر بسیار معروف شده است، دلیل آن هم کاملاً مشخص است، برنامهها در چنین محیطی منابع را در قالب پارتیشنهای مجازی دریافت میکنند که همه آنها بر روی سیستمعامل اصلی یا مادر قرار گرفته است، در واقع هر چقدر ما System Call داشته باشیم بر روی اینContainer ها، بصورت مستقیم بر روی سختافزارها و منابع سختافزاری اجرا میشود و این میان لایه واسط Hypervisor وجود ندارد، در اینگونه مجازیسازی در واقع ما هیچگونهEmulation ی در واسطه نداریم و در واقع همه سیستم مجازیسازی میشود نه فقط ماشینهای مجازی، برخلاف آن درHypervisor هایی مثلESXi ، KVM، QEMU یا Hyper-V این لایه واسط خودش باعث ایجاد شدن ناخودآگاه Overhead بر روی سیستمعامل میشود، حتی سیستمعاملهایی که فرآیند Paravirtualization نیز انجام میدهند مثل Xen یا UML هم نمیتوانند به این اندازه Overhead را بر روی سیستمعامل کاهش بدهند. جالب اینجاست بدانید که در این نوع مجازیسازی بسیاری از وابستگیهای سختافزاریHypervisor ها وجود ندارد و بر روی سختافزارهای بسیار زیادی بدون محدودیت قابل پیادهسازی است.
مجازیسازی در لایه سیستمعامل چه مقدار انعطافپذیری دارد؟
یکی از نقاط ضعفی که در مجازیسازی لایه سیستمعامل وجود دارد همین بحث انعطافپذیری است. هیچوقت نمیتوانید شما در این سطح از مجازیسازی انتظار انعطافپذیری را داشته باشید که در سایر راهکارهای مجازیسازی سرور استفاده میکنید، دلیل آن هم کاملاً مشخص است، شما در این سرویس هیچگونه بحثی به نام Host OS و Guest OS دیگر ندارید و در واقع تنها یک Host وجود دارد و یک هسته یا Kernel سیستمعامل وجود دارد. برای مثال شما با استفاده از این نوع مجازیسازی میتوانید بر روی سیستمعامل لینوکس بسیاری از توزیعهای مختلف سیستمعامل لینوکس را نصب کنید با توجه به اینکه Kernel آنها یکی است مشکلی پیش نمیآید اما طبیعتاً شما نمیتوانید بر روی سیستمعامل لینوکس، سیستمعامل ویندوز را به عنوان Container داشته باشید. البته شما بر روی سیستمعامل ویندوز هم همین محدودیتها را دارید، شما در این سیستمعامل در صورت مجازیسازی لایه سیستمعامل فقط میتوانید ویندوز داشته باشید.
ذخیرهسازی اطلاعات در مجازیسازی لایه سیستمعامل چگونه است؟
برخی از مکانیزمهای ذخیرهسازی در مجازیسازی لایه سیستمعامل در قالب File Level Copy On Write یا CoW عمل میکنند که شما آن را به اسم فایل سیستم میشناسید، در واقع یک فایل سیستم بین چندین پارتیشن به اشتراک گذاشته میشود و Constrainer نیز به همین شکل به اشتراک گذاشته میشود، به محض اینکه تغییری در این پارتیشنها ایجاد شود Containerها تغییرات خودشان را بصورت خودکار کپی میکنند. این روش برای backupگیری بسیار ساده است و هم فضای کمی اشغال میشود و هم از نظر سادگی بهتر است، به نوعی یک ساختار ذخیرهسازی Cache وجود دارد و از مکانیزم Block Level تا حد زیاد بهتر عمل میکند (البته در این لایه)، برخی دیگر از مکانیزم Whole System Virtualizer یا مجازیسازی کلی سیستم برای ذخیرهسازی استفاده میکنند که برای فایل سیستمهای غیر بومی سیستمعامل کارایی بهتری دارد و امکان Roll Back و Snapshot را نیز فراهم میکند.
اما پس از این مقدمه از مجازیسازی لایه سیستمعامل یا اصطلاحاً OS Level Virtualization شاید این سوال برای شما مطرح شود که چه ابزارهای چنین قابلیتی را به ما میدهند؟ در پاسخ به این سوال میبایست اشاره کنیم، ابزارهای مختلفی برای این منظور وجود دارد که از جمله معروفترین و پرکاربردیترین آنها میتوان به: Docker، LXC، Virtuozzo و… اشاره نمود.
Docker چیست؟
پیشتر در خصوص مفهومی به نام OS Level Virtualization توضیحاتی ارائه شد، در این فصل میخواهیم در خصوص یکی از محصولاتی که بصورت تخصصی در حوزه مجازیسازی در لایه سیستمعامل فعالیت میکند صحبت کنیم. بصورت کلی Docker یک محصول Open Source است که فرآیند ایجاد، توسعه و اجرا کردنApplication ها با استفاده ازContainer ها را بسیار ساده میکند. C Containerها به یک برنامهنویس این اجازه را میدهند که Application خود را با تمامی اجزای مورد نیاز آن اعم از فایلهای dll و کلیه libraryها و کلیه وابستگیها در قالب یک بسته نرمافزاری بیرون بدهد به شکلی که از بیرون یک نرمافزار واحد به نظر برسد. با استفاده از این مکانیزم برنامهنویس میتواند مطمئن باشد که نرمافزاری که نوشته است فارق از نوع توزیع لینوکسی که بر روی آن اجرا میشود نیازی به نصب کردن هیچگونه اجزای جانبی برای اجرا شدن نخواهد داشت و حتی تنظیمات آن نیز بصورت از پیش تعریف شده انجام میشود.
در واقع ما میتوانیم از Docker به عنوان یک ماشینمجازی یاد کنیم زیرا تا حدود زیادی وقتی صحبت از Docker میشود اکثر افراد تصورشان یک ماشینمجازی است. اما برخلاف ماشینهای مجازی که یک سیستمعامل کاملاً مستقل ایجاد میکنند، Docker هیچ سیستمعامل جدیدی ایجاد نمیکند بلکه این امکان را به بسته نرمافزاری ایجاد شده میدهد که از Kernel اصلی سیستمعامل لینوکسی که بر روی آن نصب شده است استفاده کند و در زمان انتقال نیز فقط Package نرمافزاری منتقل میشود نه ماشینمجازی، در واقع Docker Engine یا موتور اصلی Docker جایگزین نرمافزار Hypervisor ما میشود و این کار یعنی کارایی سیستم ما به شدت افزایش مییابد زیرا یک لایه واسط به نام Hypervisor حذف شده و نرمافزار بصورت مستقیم با هسته اصلی سیستمعامل کار میکند با این تفاوت که کاملاً ایزوله شده است. شکل زیر این موضوع را نشان میدهد.
یکی از مهمترین فاکتورهایی که Docker دارد Open Source بودن آن است. این یعنی هر کسی میتواند Docker را تهیه و source آن را تغییر بدهد و یک محصول جدید معرفی کند و یا اینکه قابلیتهای جدیدی به آن اضافه کند که تا به حال بر روی آن وجود نداشته است.
Docker توسط زبان برنامهنویسی Go نوشته شده است و میتوان را بر روی سیستمعاملهای لینوکس و ویندوز نصب و راهاندازی نمود. Docker مبتنی بر لایسنس Apache License 2.0 بوده و سایت رسمی آن در نشانی زیر قرار دارد:
Docker میتواند با انواع مختلفی از ابزارهای زیرساختی همچون: Amazon Web Services، Ansible، CFEngine، Chef، Google Cloude Platform، IBM Blumix، HPE Helion Stackato، Jelastic، Jenkins، Kubernetes، Microsoft Azure، OpenStack Nova، OpenSVC، Oracle Container Cloud Service، Puppet، Salt، Vagrant، VMware vSphere Integrated Containers و OpenShift یکپارچه و integrage شود.
Docker برای چه کسانی مناسب است؟
Docker ابزاری است که هم برای برنامهنویسها و هم به برای مدیران شبکه مناسب است و به همین خاطر هم برخی اوقات به نامDevOps از آن یاد میشود که ترکیبی از دو اسم Developer و Operations است. برای برنامهنویسها Docker به این معنا است که فقط روی کدنویسی خودتان تمرکز کنید و دغدغه اینکه کد برنامه شما قرار است بر روی چه سیستمعاملی با چه نیازمندیهایی نصب شود را نداشته باشید این کار را Docker برای شما انجام میدهد. از طرفی هزاران برنامه و نرمافزار متنوع وجود دارند که برای کار کردن در محیطDocker طراحی شدهاند و شما به عنوان یک متخصص IT میتوانید به راحتی از آنها در مجموعه خودتان در قالب یک Docker Container استفاده کنید. از طرفی در محیطهای عملیاتی Docker این امکان را به همه میدهد که چندین برنامه را همزمان بر روی یک سیستم فیزیکی نصب و اجرا کنند و اینها هیچکدام با یکدیگر کوچکترین ارتباطی نداشته باشند و بصورت کاملاً ایزوله در مجموعه فعالیت نمایند.
مکانیزم کاری Docker چیست؟
حالا که میدانید داکر چیست بد نیست بدانید مکانیزم Docker چیست؟ Docker یک لایه واسط بین سیستمعامل اصلی شما و بسته نرمافزاریتان ایجاد کرده و در واقع با استفاده از این لایه واسط نرمافزارها را از همدیگر ایزوله میکند، هیچکدام از نرمافزارها از وجود نرمافزار دیگر بر روی سیستم خبری ندارند. این مکانیزم یک چیز عجیب و غریب برای لینوکس نیست، در سیستمعامل لینوکس قابلیتهایی برای ایزولهسازی منابع وجود داشته و دارند که هم هسته سیستمعامل و هم گروهها و منابع سختافزاری و نرمافزاری سیستمعامل را بصورت ایزوله شده در اختیار نرمافزارها قرار میدهند که Docker نیز از آنها استفاده میکند، برای مثال قابلیتهای cgroups و kernel namespaces از جمله مواردی هستند که Docker از آنها برای کار خودش استفاده میکند. قابلیتی مثل kernel namespace باعث میشود کهapplication ها هیچ دیدی از محیطی که در آن اجرا میشوند نداشته باشند که این موارد شامل:process tree ها، شبکه، ID های کاربران و حتی فایل سیستمهای mount شده نیز میشود، از طرفی قابلیتی مثلcgroups محدودیتهای دسترسی به منابع:CPU ، RAM، I/O و شبکه را ایجاد میکند. Docker در محیطهای اشتراکی امنیت را نیز برای نرمافزارهای ما به ارمغان میآورد اما به عنوان یک مکانیزم امنیتی شناخته نمیشود. شما به عنوان یک برنامهنویس یا شبکهکار بایستی سیستمعامل Docker را بصورت جداگانه امن کنید.
چه اینکه قصد داشته باشید سیستم خودتان را به یک سرور راهدور منتقل یا اینکه هر چیزی را برای استفاده در هر جایی Packageبندی کنید، همیشه انتقال برنامهها به سرور جدید با الزاماتشان و اجرای آنها بدون خطا، یک چالش به حساب میآید. در حقیقت چالشهای زیادی در این راه وجود دارد و راهحلهای موجود تا کنون نتوانستهاند برای اکثریت آنها موفقیتآمیز باشند.
بطور خلاصه Docker به عنوان یک پروژه به شما کمک میکند مجموعهای کامل از ابزارهای سطح بالاتر را برای انتقال هر فرم از برنامههای کاربردی بر روی سیستمها و ماشینها (چه فیزیکی و چه مجازی) بکار بگیرید و مزایای زیادی با خود به ارمغان میآورد.
Docker برنامههای کاربردی خود را (چه فرآیندها و چه منابع) از طریق محفظههای لینوکسی (به عنوان مثال فضاهای نام یا دیگر ویژگیهای Kernel) آرشیو میکند. قابلیتهای دیگر آن از خود قطعات پروژه و اجزای آن منشأ میگیرد، ویژگیهایی که همه پیچیدگی کار را با ابزارهای سطح پایینتر یاAPI های لینوکس که برای سیستم و مدیریت برنامههای کاربردی با توجه به امنیت فرآیندها، به کار میرود مرتفع میسازد.
تاریخچه Docker
در این بخش به صورت اختصار تاریخچه پیدایش Docker را بررسی میکنیم:
- سال ۲۰۰۶:در این سال Process Container ارائه شد.
- سال ۲۰۰۸:در این سال LXC یا Linux Containers ارائه شد که این موضوع مقدمهای مناسب و خوبی برای استفاده از containerها بود.
- سال ۲۰۱۳:سرویس Docker در این سال ارائه شد. در همین سال شرکت بزرگ RedHat اعلام کرد که پروژههای: Fedora،Red Hat، Enterprise Linux و OpenShift به سمت این پروژه خواهد برد و از این پروژه حمایت کرد.
- سال ۲۰۱۴:در این سال شرکت مایکروسافت اعلام کرد که نسخه آینده ویندوز سرور خودش را به سمتی خواهد برد که بتواند Docker Client را پشتیبانی کند. شرکت IBM نیز در همین سال اعلام کرد که برنامهریزی خواهد کرد تا در IBM Cloud از این سرویس استفاده خواهد کرد و در همین سال شراکت (Partnership) خودش را با سرویس Docker اعلام کرد.
- سال ۲۰۱۶: شرکت Docker سرویس تجاری (Commercial) خود را در این سال ارائه کرد.
- سال ۲۰۱۸:سرویس Docker دارای جامعه متن باز بسیار پویا و کاملی شد که بسیار فعال بوده و تقریباً همواره در حال رشد و شکوفایی بیشتر میباشد.
نکته آخر: در حال حاضر (سال 2019) سرویسهای بزرگ و معتبری از Docker حمایت و استفاده میکنند که در ادامه لیست برخی از آنها آورده میشود:
- IBM
- RedHat
- OpenStack
- Canonical
- OpenShift
- Kubernetes
- Microsoft
- Rancher
- Rackspace
پروژه Docker و اجزای اصلی آن
پروژه Docker (پروژه متن بازی که توسط dotCloud در ۱۳ مارس ۲۰۱۴ ارائه شد) شامل چندین بخش اصلی است (برنامههای کاربردی) و اجزای آن (که این بخشها را بکار میبرند) عمدتاً روی هستههای لینوکسی ساخته میشوند.
نسخههای مختلف Docker
Docker بصورت کلی دارای دو نسخه اصلی میباشد که در ادامه توضیح داده میشود:
نسخه Enterprise Edition
این نسخه نیاز به اشتراک دارد و برای استفاده از آن باید هزینه کرد. یک راهکار کامل حرفهای است که دارای پشتیبانی کاملی میباشد. در کل یک راهکار کاملاً خودکار برای نگهداری و راهاندازی containerها بصورت کاملاً حرفهای است. تمام آن چیزی که شما به آن نیاز دارید و خودتان باید ایجاد کنید را بصورت یکپارچه در اختیار شما قرار میدهد.
- بر روی سیستمعامل و پلتفرمهای مختلف در دسترس خواهد بود.
- دارای مانیتورینگ و احراز هویت دیجیتال به همراه اسکن امنیتی containerها میباشد.
- به خوبی با اپلیکیشنهای مختلف یکپارچه شده و میتواند فرآیندهای مختلف را بصورت خودکار راهاندازی کرد.
- همواره دارای آخرین نسخه پایدار Docker میباشد.
- دارای پشتیبانی به همراه SLA است.
- دارای قابلیت پشتیبانی از نسخ مختلف و قدیمی و ارائه patchهای امنیتی و بروزرسانیهای لازم میباشد.
- مجموعه کاملی از خدمات و آموزشها برای سرعت بخشیدن به سرویسدهی است.
- برای استفاده از آن نیاز است تا ثبت نام کرده و هزینه پرداخت کرد.
در جدول زیر فهرستی از قابلیتهای این نسخه که در سه مسیر Basic، Standardو Advanced ارائه میشود فهرست شده است.
نسخه Community Edition
این نسخه به صورت رایگان ارائه میشود. برای تیمهای کوچیک و محققین بسیار توصیه میشود و همواره دو مسیر برای ارائه دارد که به قرار زیر میباشد:
- نسخه Stable:هر ۳ ماه یکبار بروزرسانی میشود و قابل اعتماد است. البته ممکن است به وصلهای (patch) نیاز داشته باشد که در بین این زمان ارائه میشود. البته این بروزرسانیها تا ۴ ماه بعد از ارائه نسخه ابتدایی ارائه میشود.
- نسخه Edge:هر ماه ویژگیهای جدیدی را به شما اضافه میکند.
نسخه docker CE دارای قابلیتهای زیر میباشد:
- بر روی سیستمعامل و پلتفرمهای مختلف در دسترس خواهد بود.
- همواره نسخه آخر Docker خواهد بود که بهینهسازی شده برای سرویسهای زیرساختی
- همواره آخرین قابلیتهای پایدار Docker را در خود دارد.
- Repoهای عمومی و خصوصی را بدون محدودیت در اختیار قرار میدهد.
- به صورت خودکار build از سرویس دارد.
- برنامهی منظم برای انتشار نسخه پایدار (Stable) دارد.
- دارای پشتیبانی جامعه آزاد است. (Community support)
- کاملاً رایگان است.
پشتیبانی Docker
در مورد پشتیبانی Docker صحبت شد که در نسخه به چه صورت است اما در جدول زیر این موضوع بصورت خیلی شفاف و دقیقتری بررسی شده است.
نکته مهم اینکه اگر از نسخه رایگان Docker استفاده کنید تمام امکانات نسخه حرفهای آن را میتوانید ایجاد کنید اما در نسخه حرفهای Docker تمام این موارد به صورت کامل در اختیار شما قرار میگیرد.
بخشهای اصلی اکوسیستم Docker
مجموعه ابزارها و سرویسهای Docker را میتوان در سه بخش اصلی دستهبندی کرد:
- ساخت:تولید یک docker image که یک برنامه کاربردی به همراه تمام وابستگیهای آن را در خود دارد. هر image معمولاً با ساز و کار docker build از روی یک Dockerfile و با اضافه کردن یک یا چند برنامه کاربردی به یک base image ساخته میشود.
- اجرا: containerها که در واقع imageهای در حال اجرا هستند را میتوان به سادگی و با سرعت زیاد در تعداد بالا ایجاد و سپس متوقف و یا کاملاً حذف کرد. مزیت اصلی Docker در این بخش جداسازی کامل این Containerها از یکدیگر در زمان اجراست، بطوریکه هر یک از آنها گمان میکنند روی یک سیستمعامل کاملاً جداگانه اجرا شدهاند.
- انتشار:تصاویر تولید شده در داکر از طریق سرویسی به نام registry و با کمک دستوراتdocker push و docker pull به آسانی قابل انتشار و به اشتراکگذاری هستند. همچنین سرویس آنلاین Docker Hub یک نمونه از این registry است که برای مصارف عمومی بصورت رایگان در اختیار کاربران قرار داده شده است.
برای اینکه بتوانید با این سه جنبه از Docker کار کنید نیاز دارید برنامه موتور Docker به نام docker daemon را روی سیستم خودتان یا در یک ماشین مجازی اجرا کنید. این برنامه در واقع تمام عملیاتهای درخواست شده از Docker برای ساخت، اجرا و انتشار Containerها را انجام میدهد. علاوه بر این، شما به یک برنامه دیگر به نام docker client نیاز دارید که دستورات را از خط فرمان میگیرد و به موتور Docker منتقل میکند. در سیستمعامل لینوکس هر دو این برنامهها در قالب یک فایل اجرایی به نام docker به شما ارائه میشود. اما در سیستمعاملهای دیگر مانند ویندوز و Mac OS X تنها بخش client در فایل اجرایی docker وجود دارد و شما نیاز دارید سرویس docker daemon را در یک سیستمعامل جداگانه، که در حال حاضر باید حتماً لینوکس باشد، اجرا کنید. ابزار docker machine در این مورد به شما کمک میکند.
به طور کلی هر زمان که با دستور docker run شما Containerی را اجرا میکنید، موتور Docker ابتدا image مورد نظر را از یک registry، مانند Docker Hub، دانلود میکند و سپس یک container جدید از آن image ایجاد میکند. البته اگر دوباره اقدام به ساخت یک container از روی همان Container کنید دیگر نیازی به دانلود کردن آن نیست و بنابراین دفعات بعدی این کار با سرعت بالاتری انجام میشود.
اجزای اصلی Docker
در ادامه این مطلب داکر چیست به شما میگوییم که اجزای اصلی Docker چیست؟
اجزای اصلی Docker که اصطلاحاً به آنها Docker Component میگوییم عبارتند از:
Docker Daemon
Docker Daemon یا سرویسدهنده docker برای مدیریت containerهای Docker از LXC استفاده شده و روی میزبان اجرا میشود و به درخواستهای سرویسها پاسخ میدهد. سرویسدهنده docker با توجه به درخواستهای رسیده ازAPI[4] (رابطهای برنامهنویسی اپلیکیشن) مربوط به خود، image، container و تمام موارد دیگر را مدیریت میکند. کنترل، مدیریت و استفاده از docker از این طریق میسر میباشد.
Docker Engine
همانطور که پیشتر نیز اشاره شد، در واقع Docker Engine یا موتور اصلی Docker جایگزین نرمافزار Hypervisor ما میشود و این کار یعنی کارایی سیستم ما به شدت افزایش مییابد زیرا یک لایه واسط به نام Hypervisor حذف شده و نرمافزار بصورت مستقیم با هسته اصلی سیستمعامل کار میکند با این تفاوت که کاملاً ایزوله شده است. Docker Engine در واقعی بخشی از Docker است که وظیفه ایجاد و اجرای Docker Containerها را برعهده دارد. یک Docker Container نیز یک نمونه از اجرای زنده یک Docker image میباشد. Docker image نیز یک فایل است که شما برای ایجاد و اجرای یک سرویس یا برنامه خاص در یک OS خاص دارید.
Docker Client
Docker Client در واقع رابط بین سرویسدهنده docker با کاربران استفاده کننده ازdocker میباشد. یعنی به صورت خلاصه دستورات کاربران را به سرویسدهنده docker از طریق API منتقل میکند و سرویسدهنده هم آنها را انجام میدهد. Docker Client میتواند با یک یا چند تا سرویسدهنده docker ارتباط داشته باشد.
Docker Engine یک نرمافزار Client\Serverی است که کامپوننتهای اصلی آن: یک سروری است از نوع برنامه اجرایی طولانی مدت که اصطلاحاً یک demon process نامیده میشود. برنامهها میتوانند از طریق یک REST API با این demon صحبت کنند و با آن در تعامل باشند. یک Docker Client نیز کلاینتی است که میتواند با Docker Engine ارتباط برقرار کرده و دستورات Docker را که اصطلاحاً به آنها Docker CLI command میگویند را از راهدور بر روی آن اجرا کند.
Docker Container
کل عملیات انتقال برنامهها که با Docker انجام میشود متکی بر Containerهای Docker هستند (Containerها شامل هر برنامه کاربردی شما مثل سیستمعاملها و برنامههای کاربردی هستند.). Containerهای Docker اساساً دایرکتوریهایی هستند که میتوانند بستهبندی شده و بعد به اشتراک گذاشته یا روی ماشینمجازیهای مختلف با پلتفرمهای مختلف اجرا شوند و تنها وابستگیای که دارند این است که میزبان باید برای اجرای Containerها تنظیم شده باشد (به عبارتی Docker روی میزبان نصب شده باشد).
در واقع میتوان گفت Container ظرفی است که Imageها را در آن اجرا میکنند. Containerها از روی Imageها ایجاد میشوند و به وظایف خود عمل میکنند. مثلاً فرض کنید از یک CentOS چند Container میسازیم و در هر کدام تغییرات متفاوتی اعمال میکنیم.
یک Container از اجرای یک یا چند پردازه بر روی فایلهای یک image بدست میآید. Docker اطلاعات بیشتری مانند اینکه کدام پورتهای شبکه باید در اختیار این پردازهها قرار بگیرد را هم مدیریت میکند. از مهمترین نکات این است که تغییراتی که هر Container روی فایلهای خود ایجاد میکند بصورت جداگانه و در یک لایه جدید ذخیره میشود و به این ترتیب image اصلی هیچگاه تغییر نمیکند.
با توقف یک Container با استفاده از دستور docker stop پردازههای آن متوقف میشوند ولی تغییرات فایلهای آن همچنان قابل بازیابی هستند تا زمانیکه لایههای متعلق به آن Container با دستور docker rm کاملاً حذف شوند.
همانطور که گفته شد مزیت اصلی Docker در جداسازی کامل فضای پردازههای Containerهای مختلف از یکدیگر است، بطوریکه هر Container تصور میکند تنها پردازههای خودش در حال حاضر در حال اجرا هستند. این جداسازی همچنین شامل فایل سیستم، فضای کاربری، پشته شبکه و بخشهای دیگری از سیستمعامل میشود. از این طریق Docker امکان قرار دادن محدودیتهای گوناگون روی دسترسی هر Container به منابع مشترک سیستم را فراهم میکند.
Containerهای Docker چندین ویژگی خاص دارند. آنها اجازه:
- قابلیت حمل نرمافزار
- جداسازی فرآیندها
- مدیریت مصرف منابع
و نیاز به منابع کمتر به نسبت روشهای سنتی مجازیسازی را میدهند و اجازه:
- تداخل با دیگر فرآیندها
- ایجاد وابستگی
- کار نکردن روی یک سیستم دیگر
- آسیبپذیری در برابر حملهها
سوء استفاده از منابع تمام سیستم و… را نمیدهند.
هر Container مثل یک لایه پیاز است و هر کاری که روی یک Container انجام میشود در بالای دیگری قرار میگیرد. ابزار و تنظیمات مختلف در این مجموعه باعث شده که کار بصورت هماهنگ انجام شود (به عبارتی مانند یک فایل سیستم).
از آنجاییکه هر چیزی مبتنی بر سیستمفایل است، گرفتنsnapshot ها و انجامroll-back ها در هر لحظه به راحتی انجام میشود (شبیه VCS).
هر Docker Container از یک Docker Image شروع میشود که فرم پایهای برای دیگر برنامهها و لایهها است.
Docker image
imageهایی از Containerها یا خود imageهای سیستمعامل (از جمله: CentOS، Ubuntu و…) که کمک میکنند Containerهای Docker اجرا شوند (Launch شوند). Docker Imageها اساس Containerهای Docker هستند چرا که هر چیزی از آن آغاز میشود. آنها بسیار شبیه imageهای سیستمعامل هستند که برای اجرای برنامهها روی سرورها یا کامپیوترها بکار میروند. گرفتن این imageها (مثلاً Ubuntu) اجازه قابلیت حمل را در سراسر سیستم فراهم میکند. همه اجازههایی که پیشتر اشاره شد توسط imageهای Docker برای Containerها فراهم میشود.
اگر image اولیهای که از سرور میگیرید خود سیستمعامل باشد، با اضافه کردن هر برنامه بر روی سرور، imageهای جدیدی میتوانید بگیرید که این تغییرات را شامل شوند.
همانطور در شکل زیر مشاهده میکنید، یک Base Image مانند Debian روی این Docker نصب شده است و روی آن Imageهای دیگر را نصب کردهایم.
هر Docker Imageها را پس از دریافت اجرا میکنیم. Imageها پس از پایان به حالت اولیه خود باز میگردند چون همانطور از نام آنها مشخص است تنها یک تصویری از Package اصلی هستند. برای حذف تغییرات Image میتوان حالت آنها را با دستورات خاصی ذخیره کرد.
هر Docker Imageها را پس از دریافت اجرا میکنیم.
ساختار Docker Image
هر docker image از یکسری لایه تشکیل شده است که هر لایه تنها شامل تغییرات نسبت به لایه قبلیست. موتور Docker در زمان اجرا از فایل سیستمهایی استفاده میکند که این امکان را فراهم میکنند تا تمامی این لایهها بصورت یک ساختار فایل یکپارچه در اختیار Container قرار داده شود.
یکی از برتریهای Docker نسبت به فناوری ماشینهای مجازی استفاده از همین ساختار لایهای برای imageهاست. این لایهبندی باعث میشود زمانیکه شما یک image جدید را از روی یک image قبلی میسازید نیازی به کپی کردن همه فایلهای image قبلی ندارد و تنها کافیست که لایه جدید، شامل تغییرات فایلها را، بسازد. به این ترتیب هر لایه پس از یکبار ساخته شدن دیگر تغییر نمیکند و به راحتی میتوان آن را بین image گوناگون به اشتراک گذاشت بدون اینکه نیاز باشد Docker کاری برای جلوگیری از تداخل فایلها انجام دهد. این روش مصرف دیسک سخت را به میزان زیادی بهینه میکند.
در این مدل هر docker image از یک base imageساخته میشود. این base image ممکن است یک سیستمعامل سبک مانند لینوکس Debian یا Alpine باشد، ولی حتی میتوان از یک سیستمعامل بزرگ مانند Ubuntu شروع کرد، اگر چه این کار معمولاً توصیه نمیشود. این image در صورتیکه از قبل روی سیستم شما وجود نداشته باشد در زمان اولین ساخت از docker hub دانلود میشود. سپس شما میتوانید imageهای بعدی را حتی از روی imageهایی که خودتان قبلاً تولید کردهاید بسازید.
به عنوان مثال شما میتوانید از یک Debian image شروع کنید و سپس با نصب محیط اجرایی جاوا و یک وب سرور مانند Tomcat روی آن، imageی بسازید که base image بعدی شما شود. برای این کار نیاز به نوشتن یک فایل به نام Dockerfile دارید که شامل یک base image و سپس دستوراتی برای نصب برنامهها، اضافه کردن فایلها و در انتها مشخص کردن دستوریست که در زمان ایجاد Container اجرا خواهد شد. در نهایت وقتی شما با استفاده از دستور docker build درخواست تولید این image را صادر میکنید docker دستورات داخل این فایل را اجرا میکند و به این ترتیب لایههای جدیدی برای image شما تولید میشود. سپس شما میتوانید این image را با دستور docker push به یک registry بفرستید و نام آن را با دیگران به اشتراک بگذارید تا به راحتی بتوانند آن را دانلود و اجرا کنند. (در ادامه مطالب این فصل با دستورات docker آشنا خواهید شد).
Dockerfile
اسکریپتهایی که فرآیند ساخت imageها را خودکارسازی میکنند. همانطور که پیشتر نیز اشاره کردیم، فایلهای Docker اسکریپتهایی هستند که حاوی یکسری دستورالعمل و راهنماییاند که برای ایجاد یک image جدید میتوانند اجرا شوند. اساس کار آنها به اینصورت است که فرآیندهایی که قرار است مکرراً یا بصورت دستی اجرا شوند را اجرا کنند. زمانیکه اجرای یک فایل Docker خاتمه یافت، شما با یک image جدید روبرو هستید که میتوانید از آن برای ساخت یک Container جدید استفاده کنید.
قبل از اینکه وارد بحث تعامل بین اجزا و عناصر Docker شویم اجازه دهید کمی در مورد آنچه Docker را میسازد بیشتر صحبت کنیم.
Docker ویژگیهای زیر از سیستمعامل را بکار میگیرد تا Containerسازی کارآمدتری ارائه دهد:
- فضاهای نام یا اصطلاحاً namespaceها به عنوان اولین سطح از ایزولهسازی: اطمینان حاصل میکند که یک فرآیند در حال اجرا در یک Container، نمیتواند از بیرون دیده شود یا تغییر کند.
- گروههای کنترل یا اصطلاحاً cgroupها، مؤلفه اصلی ازLXC ، حساب منابع و محدودسازی آنها را برعهده دارند.
- فایل سیستمهای یکتا که به عنوان یک ساختمان بلوک از ظروف عمل میکنند. لایهها را ایجاد میکند بنابراین باعث میشوند Docker سبک و سریع عمل کند.
Docker CLI
برای برقراری ارتباط بین Daemonهای Docker بکار میرود. در واقع Docker CLIها همان دستورات خط فرمان Docker هستند که جهت ایجاد و مدیریت Containerها، imageها و… بکار میروند. توجه کنید که دستورات Docker معمولاً با کلمه کلیدی docker آغاز میشوند، مانند: docker run، docker images، docker attach و…
Registry Docker
Docker Registry محلی برای نگهداری imageهای docker است. یکسری مخزن عمومی (Public Registry) داریم که قرار دادن و دریافت image از آنها آزاد و رایگان بوده و بدون نیاز به دسترسی خاصی میباشد. اما معمولاً هر شرکت و یا ارائه کننده سرویس برای خود مخازن خصوصی (Private Registry) راهاندازی میکند تا imageهای خاص و مهم خود را در آنها نگهداری و در مواقع لزوم استفاده کند. برای استفاده از این مخازن نیاز به دسترسی میباشد و معمولاً اطلاعات آنها به صورت عمومی منتشر نمیشود.
شرکت docker یکی از بهترین مخازن عمومی یعنی Docker Hub را ارائه میکند اما برای IPهایی که از کشور ایران باشد به دلیل تحریمها مسدود بوده که برای استفاده از آن باید از روشهای دیگری استفاده کرد که در ادامه مطالب این فصل راهکارهای گریز از تحریم آن را توضیح خواهیم داد.
Docker Swarm
برای مقیاسپذیریcontainer ها نیاز است تا از چندین سرویسدهنده docker استفاده کرد. سرویس Swarm میتواند با چندین سرویسدهنده docker ارتباط برقرار کند و از آنها به عنوانهای مختلف اعم از کارگر (Worker) و مدیر (Manager) سرویس استفاده کند. سرویس Swarm با استفاده از API با سرویسدهنده docker ارتباط برقرار میکند. این امکان از نسخه 1.12 و بالاتر در docker موجود میباشد.
Docker Machine
این ابزار برای راهاندازی یه ماشین مخصوص کار با docker میباشد. با استفاده از این ابزار شما یک ماشین مجازی (VPS) راهاندازی خواهید کرد و تمام موارد مربوط به docker را در آن خواهید داشت. با استفاده از این ابزار میتوانید ماشینهای مختلف را مدیریت کرده و انواع اقدامات اعم از بروزرسانی، start، stop، restart و اقدامات دیگر را بر روی ماشینها انجام دهید. این ابزار واسطی بین سرویسدهنده docker و محیط نصب آن با محیط کاری شما میباشد. برای زمانهایی که نیاز دارید با سرویس docker کار کنید اما سیستمعاملی که دارید ویندوز یا Mac OS میباشد این امکان را فراهم میکند که بتوانید سرویس docker را داشته باشید.
در واقع Docker Machine یک ابزار جانبی است که ایجاد و مدیریت موتورهای docker روی رایانههای شخصی یا سرویسهای ابری را تسهیل میکند. به طور مختصر این ابزار امکان ایجاد سرورهایی را فراهم میکند که موتور docker را بر روی خود دارند و به سادگی اجازه میدهد از طریق پیکربندی docker client روی ماشین خودتان به این سرورها متصل شوید و با موتور docker کار کنید.
Docker Hub چیست؟
یک سرویس اشتراکگذاری تهیه شده توسط شرکت Docker است که شامل مخزنی از imageهای آماده برای Docker میباشد. این مخزن حاوی دهها هزار برنامه و سیستمعامل است که میتوان به آن imageهایی را هم اضافه کرد. جهت دسترسی به سایت Docker Hub به نشانی زیر مراجعه نمایید:
پشتیبانی از Docker در سیستمعاملهای جدید
- پشتیبانی از RHEL 7 از قابلیت Linux Containers
یکی از مهمترین قابلیتهای معرفی شده در RHEL 7 قابلیت Linux Container است که با استفاده از Docker روی سیستمعامل RedHat Enterprise پیادهسازی میشود. Linux Container و تکنولوژی Docker نوعی از مجازیسازی است که در لایه Application صورت میگیرد. این تکنولوژی برای هر Application بر روی هر Single Host یک محیط ایزوله و کاملاً جدا از بقیه سیستم ایجاد کرده و با سطوح دسترسی و میزان مصرف منابع سختافزاری مورد نیاز برای Application، امکان اجرای هر Applicationی را بر روی یک سیستم لینوکس فراهم میکند. Docker حتی قابلیت اجرای چندین باره یک نرمافزار را با process و منابع مجزا را دارا میباشد.
- پشتیبانی Windows Server 2016/2019/2022 از قابلیت Docker Engine
این روزها مایکروسافت بیشتر تبلیغات خود را روی زندگی در محیط ابری تحت موبایل متمرکز کرده است، اما در این دنیا هنوز هم جایی برای ویندوز سرور باقی مانده است. قابلیتهای جدیدی در ویندوز سرور 2016/2019/2022 گنجانده شده است که از جمله آنها میتوان به ارتقای سطح امنیت و ابزارهای شبکهسازی و همچنین پشتیبانی بهتر از کلاسترینگ نام برد. دو قابلیت برجسته نیز در این نسخه به چشم میخورد، یکی اضافه شدن گزینه Nano Server که یک نسخه سطح پایینتر از این سیستمعامل برای استفاده در Cloud و دیگری پشتیبانی داخلی از Containerهاست.
مایکروسافت قبلاً اعلام کرده بود که از Docker Engine برای کار با Containerها در ویندوز سرور 2016/2019/2022 استفاده خواهد کرد. علاوه بر این، این دو شرکت اعلام کردند که مشارکت فعلی خود را گسترش خواهند داد و مایکروسافت به طور رسمی و تجاری و بدون دریافت هزینه اضافی از مشتریان Docker Engine در ویندوز سرور 2016/2019/2022 پشتیبانی خواهد کرد. خود مایکروسافت اغلب پشتیبانیهای پایه را برعهده خواهد گرفت و مسائل پیچیدهتر را به Docker Engine خواهد سپرد. مایکروسافت میگوید از راهکار مراکز داده Docker برای حرفهایهای دنیای IT به عنوان راهکاری برای افزایش امنیت زنجیره تأمین نرمافزار ویندوز و مدیریت حجم کاری Containerی ویندوز چه در محل، در Cloud یا محیطهای ترکیبی استفاده خواهد کرد.
این همکاری نزدیک بین Docker و مایکروسافت یک بار دیگر این سوال را مطرح میکند که آیا مایکروسافت درنهایت مالکیت Docker را هم از آن خود خواهد کرد. سابقه نداشته که مایکروسافت به طور مستقیم از این حجم از ابزارهای ثالث در پرچمداران سرور خود استفاده کند. علاوه بر ویندوز سرور 2016/2019/2022، System Center 2016/2019 که چندان ربطی هم به نام خود ندارد سرویسی از این شرکت است که کار مدیریت مراکز داده و تأمین و مدیریت سختافزار و ماشینهای مجازی (شامل ماشینهای ویندوز سرور، لینوکس و ماشینهایی که VMWare یا Hyper-V را اجرا میکنند) را برعهده دارد.
Containerها یکی از جدیدترین ابزارها در تکنولوژی IT میباشند. شما در Containerها میتوانید برنامههای بیشتری را نسبت بهVirtual Machine اجرا کنید. تکنولوژی Containerها از قبیل Docker میتواند در Cloud یاDatacenter ها تکنولوژی ماشینمجازی (VM) را از کار بر کنار کند. ماشینهای مجازی زیاد از منابع سختافزاری استفاده میکنند. چون ماشینهای مجازی از کل سختافزارهای مورد نیاز یک سیستمعامل بطور مجازی کپی میگیرند اماContainers ها فقط سیستمعامل را اجرا کرده به همین دلیل ماشینهای مجازی از CPU و RAM بیشتری استفاده میکنند. Containerها شما را قادر میسازند تا نرمافزارها را از اساس سیستمعامل جدا کنید که این موضوع بکارگیری و قابلیت اطمینان را در نرمافزار افزایش میدهد.
Docker یک موتور متن باز (Open Source) است که در ساختن، اجرای کردن و مدیریت Containerها استفاده میشود. در اصل Docker Container برای لینوکس ساخته شده بود اما در نسخه ویندوز سرور 2016/2019/2022 از Docker به عنوان یک جزء داخلی حمایت میشود. یک پروژه جدید متن باز موتور Docker برای ویندوز سرور 2016/2019/2022 ساخته شده است که مایکروسافت به عنوان یکی از اعضای فعال در انجمن متن باز (Open Source) فعالیت میکند. شما میتوانید از Docker برای مدیریت Containerها و Hyper-V Containerها ویندوز سرور 2016/2019/2022 استفاده کنید.
ویندوز سرور 2016/2019/2022 از دو نوع Container را بصورت طبیعی پشتیبانی میکند یکیWindows Server Containers و دوHyper-V Containers میباشد.Container های ویندوز سرور از یک دیگر جدا میباشند و بصورت مستقیم در خود سیستمعامل ویندوز سرور اجرا شده اماContainer های Hyper-V بصورت افزایش یافته جدا میشوند چون Containerها از یک ماشینمجازی Hyper-V اجرا میشوند.
همانطور که پیشتر اشاره شد، شما میتوانید Docker را بر روی پتلفرمهای مختلفی از جمله: ویندوز، لینوکس و یا حتی سیستمعامل Mac OS نیز نصب نمایید. معماری Docker بر روی سیستمعاملهای ویندوز و Mac OS شبیه یکدیگر میباشد. در واقع Docker Host شما در این سیستمعاملها بصورت مجازی بر روی یک Linux VM نصب خواهد شد (چرا که base ابزار Docker متن باز و لینوکسی است) اما در سیستمعامل لینوکس و توزیعهای مختلف آن، Docker Host میتواند بصورت Bare-Metal بر روی سختافزار سیستم/سرور شما نصب و راهاندازی شود و نیازی به استفاده ماشین مجازی برای آن نخواهید داشت.
Containerهای لینوکس (LXC)
Containerهای لینوکس به عنوان ترکیبی از ویژگیهای مختلف در سطح هسته تعریف میشود (یعنی چیزهایی که Kernel لینوکس میتواند انجام دهد) که اجازه مدیریت برنامههای (و منابعی که آنها را بکار میبرند) Container شده با محیطشان را میدهد. با استفاده از ویژگیهای خاص مانند namespaceها، chrootها، Cgroupها و…، LXC برنامهها را اجرا کرده و کمک میکند تا با مدیریت خودشان از طریق محدود ساختن منابع، اجازه نداشته باشند به خارج از فایل سیستم خودشان دسترسی داشته باشند (دسترسی به فضای نام پدر). Docker با Containerهایش از LXC استفاده میکند.
اکوسیستم Docker: آشنایی با مفاهیم پایهای
Containerization به فرآیند توزیع و پیادهسازی برنامهها به یک روش قابل حمل و قابل پیشبینی گفته میشود. این کار با بستهبندی برنامهها و وابستگیهای آنها در یک بسته استاندارد، ایزوله و سبک به نام Container انجام میشود. سازمانهای امروز علاقهمندند برنامهها و سرویسهای طراحی شده توسط آنها، به سادگی روی سیستمهای توزیع شده پیاده شوند، مقیاس سیستم به سادگی افزایش یابد و برنامهها در صورت بروز خطا روی سرورها، همچنان به کار خود ادامه دهند. Docker یک پلتفورم برای عملیات Containerization است که با هدف سادگی و استاندارد بودن شیوه پیادهسازیها در محیطهای مختلف طراحی و ساخته شده است و امروز، نقش زیادی در همهگیر شدن مفاهیم Container و معماری سرویسگرا و ترغیب جامعه به استفاده از این روش توسعه داشته است.
Docker و Containerization
در حال حاضر Docker معروفترین نرمافزار مورد استفاده برای Containerization است. نرمافزارهای دیگری هم در این زمینه ساخته شدهاند، اما سادگی ساخت و مدیریت Containerها در Docker و استفاده از Docker در بسیاری از نرمافزارهای متنباز، آن را به محبوبترین ابزار در این حوزه بدل کرده است.
در شکل فوق میتوانید رابطه Containerها با سیستم میزبان (Host) را مشاهده نمایید. Containerها، برنامههای مختلف را درون خود ایزوله کرده و از منابع سیستمعامل استفاده میکنند و Docker عمل مدیریت، ساخت و کنترل آنها را برعهده دارد. در نمای بازتر در سمت راست، میتوانیم مشاهده کنیم که Containerها بصورت لایهای، روی چند Container به اشتراک گذاشته شده هم میتوانند ساخته شوند و به این شیوه استفاده از منابع بسیار کاهش مییابد.
مهمترین مزایای Docker
- بهرهبرداری بهینه از منایع: به جای مجازیسازی یک سیستمعامل کامل، Containerها در تمامی مراحل پردازش، از سیستمعامل میزبان استفاده میکنند.
- قابلیت انتقال: تمام وابستگیهای یک برنامهی Containerize شده، درون Container آن قرار میگیرد و میتوان آن Container را در هر میزبانی که روی خود Docker دارد، اجرا کرد.
- پیشبینی پذیری: با استفاده از Docker، برای میزبان مهم نیست که چه Containerهایی درون آن اجرا میشود و همچنین برای Container هم اهمیتی ندارد که روی چه میزبانی درحال اجراست. واسط استانداردی برای روابط وجود دارد و روابط قابل پیشبینی هستند و در هر میزبانی یکسان عمل میکنند.
معمولاً وقتی یک برنامه یا سرویس برای استفاده از Docker طراحی میشود، شکستن Functionalityهای مختلف به برنامهها و سرویسهای کوچکتر، هر کدام درون یک Container و ساختن کل سیستم از Containerهای مجزا یک امر طبیعی است که به این شیوه معماری سرویسگرا میگویند. این قابلیت به شما این امکان را میدهد که کامپوننتهای مختلف سیستم را به راحتی آپدیت کنید، یا مقیاس آن را در آینده تغییر دهید. این قابلیت یکی از ویژگیهای مهم میباشد که افراد را علاقهمند به توسعه برنامههایشان روی Docker کرده است.
سرویس Discover و ذخیره عمومی کانفیگها
سرویس Discovery، بطور کلی یکی از استراتژیهاییست که برای پیادهسازی قابلیت مقیاسپذیری و انعطاف در فرآیند پیادهسازی Containerها مورد استفاده قرار میگیرد. کار سرویس Discovery اینست که شرایطی را فرآهم آورد که Containerها، بدون دخالت مدیران سیستم همواره به هم معرفی شوند و همدیگر را پیدا کنند و بشناسند. Containerها با این ابزارها میتوانند اطلاعات ارتباطی Containerهایی که میخواهند از آنها استفاده کنند را بیابند و همچنین میتوانند خودشان را در سیستم ثبت کنند که دیگر Containerها بدانند که آنها در دسترسند. این ابزارها همچنین به عنوان ابزار ذخیره عمومی کانفیگهایی که تنظیمات کلی مورد نظر شما را برای همه نرمافزارها در زیرساخت شما هستند را فراهم میکنند.
در شکل فوق، میتوانید چگونگی فرآیند درخواست یک Connection از طرف یک Container و رجیستر کردن آدرس توسط برنامه سرویس Discovery و ارسال تنظیم به برنامه درخواست دهنده را مشاهده نمایید. یک Container درخواست میکند، بقیه میتوانند از سیستم سرویس Discovery اطلاعات Connection را پیدا کنند.
ابزارهای سرویس Discovery معمولاً به عنوان یک سیستم ذخیرهسازی key-value که توزیع شده هستند، ساخته میشوند. معمولاً این سیستم ذخیرهسازی یک API روی HTTP برای درخواست ذخیره و دریافت اطلاعات فرآهم میآورد. بعضی از این ابزارها امکانات بیشتر همچون رمزگذاری محتوا و مکانیزمهای کنترل دسترسی را همراه خود فرآهم میکنند. سیستمهای ذخیرهسازی توزیع شده، اساس مدیریت میزبانهای کلاستر شده Docker، به علاوه ابزار مدیریت کانفیگها برای مدیریت Containerهای جدیدی که خودشان generate میشوند، هستند.
برخی از مسئولیتهای ذخیرهسازهای سرویس Discovery
- به برنامهها، دسترسی لازم را برای دریافت اطلاعات Containerهایی که به آنها وابستهاند را بدهد.
- به برنامهها اجازه رجیستر کردن اطلاعات خود برای دستیابی توسط بقیه برنامهها را بدهد.
- یک محل عمومی برای ذخیره کانفیگها فرآهم کنند.
- اطلاعات مورد نیاز ابزارهای مدیریت کلاستر در مورد کلاسترها و اعضایشان را بتوان در آن ذخیره کرد.
معروفترین ابزارهای سرویس Discovery
- etcd: سرویس دیسکاوری \ ذخیره عمومی کانفیگها
- consul: سرویس دیسکاوری \ ذخیرهی عمومی کانفیگها
- zookeeper:سرویس دیسکاوری \ ذخیره عمومی کانفیگها
- crypt: ابزاری برای رمزگذاری محتوای etcd
- confd: رصد سیستمهای ذخیرهساز key-value برای تغییرات و پیکربندی مجدد سرویسها با اطلاعات جدید
ابزارهای شبکه
Containerization برنامهها در معماری سرویس گرا به شما اجازه میدهد که آنها را به قسمتهای کوچکتر تقسیم و به کامپوننتهای جدا تبدیل کنید. هرچند که این کار مدیریت مقیاسپذیری برنامهها را آسانتر میکند، اما نیاز به دقت و توجه بیشتری برای پایداری ارتباطات شبکه بین کامپوننتها برای یافتن یکدیگر دارد. docker بصورت درونی امکانات پایه شبکه را که برای ارتباطات container به container و container به host نیاز است، فرآهم میکند.
امکانات درونی docker برای شبکه، دو مکانیزم برای اتصال containerها به هم فرآهم میکند. اولین روش باز کردن پورتهای container و آدرسدهی به میزبان برای مسیریابی بیرونی است. میتوانید پورت میزبان را برای آدرسدهی انتخاب کنید یا به docker اجازه استفاده از پورتهای باز را بصورت تصادفی بدهید. این یک روش عمومی برای فرآهم کردن دسترسی به یک containerی که برای مقاصد مختلف کار میکند، است.
روش دیگر، برقراری ارتباط بین containerها با docker links است. یک پیوند containerی، اطلاعات مربوط به connection همتای خود را دریافت میکند و اجازه ارتباط به آن را، اگر تنظیم شده باشد میدهد. این روش اجازه ارتباط بین containerهای روی یک میزبان را بدون دانستن شماره پورت یا آدرس سرویس، میدهد.
این بخش از ارتباط شبکه برای سرویسهای روی یک میزبان بسیار مناسب است. با این حال، اکوسیستم docker در حال توسعه پروژههای فراوانی برای توسعه قابلیتهای در دسترس Networking، برای اپراتورها و توسعهدهندگان است. برخی قابلیتها در زمینه شبکه که از طریق نصب ابزارهای اضافی روی docker قابل استفادهاند:
- پوشش شبکه برای سادهسازی، یکپارچهسازی و متحدکردن فضای آدرس روی میزبانهای مختلف
- ایجاد شبکه خصوصی مجازی (VPN) بهبود یافته برای ارتباط امن بین کامپوننتهای مختلف
- اختصاص سابنت بر اساس میزبان یا بر اساس برنامه
- پایداری اترنت مجازی برای ارتباطات
- تنظیم MAC آدرس، Gateway و… برای هر container
چند پروژه برای بهبود قابلیت شبکه در Docker
- flannel
- weave
- pipework
Scheduling، مدیریت کلاسترها و Orchestration
یکی دیگر از ابزارهای مورد نیاز برای مدیریت Containerهای کلاستر شده، Schedulerها هستند. Schedulerها مسئولیت شروع Containerها روی hostهای در دسترس را برعهده دارند.
شکل فوق یک تصمیمگیری ساده برای Scheduling را نشان میدهد. درخواست روی یک API یا یک ابزار مدیریت گرفته میشود. از آنجا به بعد، Scheduler به بررسی شروط و میزبانهای در دسترس میپردازد. در این مثال، Scheduler اطلاعات مربوط به ظرفیت Container را از سرویس Discovery دریافت نموده و میتواند برنامه را روی میزبانی که کمترین ترافیک و شلوغی را دارد، اجرا کند.
عملیات انتخاب میزبان مناسب یکی از وظایف Scheduler است. معمولاً، Scheduler توابعی برای اتوماتیک کردن این فرآیند دارد که به مدیران سیستم هم امکان تعریف محدودیتهایی را میدهد. برخی از این محدودیتها ممکن است موارد زیر باشند:
- راهاندازی یک container، روی میزبانی که یک container دیگر هم روی آن است.
- اطمینان از قرار نگرفتن یک container روی میزبانی که container دیگر روی آن قرار دارد.
- قرار دادن container روی میزبانی که برچسب یا metadataی خاصی روی خود دارد.
- قرار دادن container روی خلوتترین میزبان
- اجرای container روی تمامی میزبانهای درون کلاستر
به این دلیل که Scheduler باید با تمام میزبانهای حاضر در گروه در ارتباط باشد، نیاز است به ابزارهای مدیریت کلاسترها دسترسی داشته باشد. این کار به Scheduler امکان دریافت اطلاعات درباره اعضاء و انجام عملیاتهای مدیریت روی کلاسترها را میدهد. Orchestration، به ترکیب عملیات Container Scheduling و مدیریت میزبانها گفته میشود.
برخی پروژههای معروف در زمینه Scheduling و مدیریت fleet
- fleet: Scheduler و ابزار مدیریت کلاسترها
- marathon: Scheduler و ابزار مدیریت سرویسها
- swarm: Scheduler و ابزار مدیریت سرویسها
- mesos: سرویس تجرید میزبان برای تلفیق منابع میزبان برای Scheduler
- kubernetes: Scheduler پیشرفته و ابزاری قدرتمند برای مدیریت گروههای Container
- compose: ابزار Container Orchestration برای ساخت گروههای Container
تا اینجا انتظار میرود با بیشتر ابزارهایی که در اکوسیستم Docker مورد استفاده قرار میگیرد، آشنایی مختصری یافته باشید. Docker و تمام ابزارهایی که از آن پشتیبانی میکنند، یک اکوسیستم قدرتمند برای مدیریت، طراحی و پیادهسازی استراتژیهایی برای پیادهسازی مقیاسپذیری زیاد در نرمافزارها را ممکن میسازند. با درک درست و استفاده از تواناییهای پروژههای مختلف، میتوانید پیادهسازی برنامههای پیچیده، برای مدیریت عملیاتهای مختلف، ساده و منعطف کنید.
ابزار Docker Toolbox
این ابزار تجمیع تمام ابزارهای زیر است و تمام آنها را در خود دارد و با نصب آن بر روی ویندوز یا Mac OS میتوانید تمام این ابزارها را یکجا داشته باشید.
- Docker Engine
- Docker Machine
- Docker Compose
- Kitematic
- VirtualBox
نصب Docker روی ویندوز
برای نصب Docker از این لینک زیر استفاده کنید. اگر این لینک فعال نبود در گوگل جستجو کنید: docker toolbox. نسخه مخصوص ویندوز این نرمافزار را دانلود و روی فایل نصب کلید کنید.
https://docs.docker.com/engine/installation/windows/
نکته: قبل از نصب Docker توجه داشته باشید که باید قابلیت مجازیسازی پردازنده خود را فعال کنید.
بستهای که نصب کردید علاوه بر Docker نرمافزارهای جانبی دیگری نظیر VirtualBox و Git Bash را نصب میکند. پس از نصب نرمافزار Docker روی آیکون Docker Quickstart Terminal کلیک کنید. منتظر بمانید تا مراحل نصب و فعالسازی تنها برای نخستین بار کامل شود.
پس از تکمیل فرآیند صفحهای مانند شکل زیر را مشاهده خواهید کرد. این صفحه یک ترمینال با نام Git Bash است. Git Bash در واقع شبیهساز ترمینال لینوکس برای ویندوز است. اکثر دستورات لینوکس در این ترمینال قابل دسترسی هستند.
در این ترمینال دستور زیر را وارد کنید:
$ docker run hello-world
با پیغام زیر مواجه میشویم. این پیغام به این معناست که imageی با نام hello-world موجود نیست و باید از اینترنت دریافت شود.
Unable to find image ‘hello-world:latest’ locally
توجه داشته باشید برای گرفتن بستههای نرمافزاری از docker به دلیل مسائل تحریم با مشکل مواجه میشویم. به همین دلیل مجبور به استفاده از نرمافزاری هستیم که IP ما را به یک IP خارجی تغییر دهد (فیلترشکن). پس از دریافت کامل این بسته با تایپ عبارت dockerrun hello-world متون زیر نمایش داده میشود.
استفاده از Kitematic در Docker
Kitematic یک پروژه جداگانه بوده که برای مدیریت بستهها مورد استفاده قرار میگرفته است. اکنون Kitematic به پروژه Docker اضافه شده و استفاده از Docker را سادهتر کرده است. با استفاده از این ابزار به راحتی میتوان با سرویسدهنده docker ارتباط گرفت و تمام مواردیکه در Docker Client با استفاده از دستور (Command) به سرویسدهنده docker ارسال میشد با استفاده از GUI بسیار زیبای این نرمافزار انجام داد. Kitematic بسیار رابط کاربری عالی داشته و به خوبی میشود با این نرمافزار تمام اتفاقاتی که سمت Client باید انجام شود را بررسی و مدیریت کرد. این ابزار ابتدا برای استفاده در سیستمعامل Mac OS توسعه داده شده بود که بعد از آن برای سیستمعاملهای ویندوز و لینوکس نیز توسعه داده شد. بصورت پیشفرض به مخزن Docker Hub نیز متصل میشود و با استفاده از رابط کاربری آن میتوان در این مخزن imageهای مورد نظر خود را بررسی و از آنها استفاده کرد. برخی از قابلیتهای مهم برای اجرا کردن containerها که شما باید در رابط خط فرمان (CLI) به آنها توجه کنید در این ابزار به خوبی و سادگی با استفاده از واسط گرافیکی کاربر (GUI) برای شما محیا شده است. به عنوان مثال تغییر و تنظیم volumeهای داخل container، مشاهده log مربوط به container بصورت live، ایجاد و تغییر پورتها و… . توجه کنید استفاده از این نرمافزار نیز نیازمند فیلترشکن است.
پیشنهاد میکنم این است که در ابتدا برای یادگیری بهتر و آشنایی بیشتر با سرویس docker و دستورات مورد استفاده در آن از این ابزار استفاده کنید تا مشاهده دقیقتری از اتفاقات صورت گرفته داشته باشید و بعد از اینکه به دستورات سرویس docker مسلط شدید دیگر نیازی به استفاده از Kitematic ندارید.
به عنوان مثال در کادر جستو عبارت Hello world را جستجو کرده و Create را انتخاب میکنیم.
پس از نصب این بسته صفحه شکل زیر ظاهر میشود.
همانطور که مشاهده میکنید امکان Start و Restart برای بسته دانلودی موجود است. اجرای برنامه نیز در همین صفحه نمایش داده شده است.
آنچه در این مقاله مطالعه کردید پاسخ بسیار جامعی بود به این پرسش که داکر چیست؟ سپس دانستید که مکانیزم کاری Docker چیست و چرا از آن استفاده میشود.