در فرآیند توسعه نرمافزار، یکی از چالشهای همیشگی تیمهای فنی این است که کد نوشتهشده در یک محیط، هنگام اجرا در محیطی دیگر با خطا و ناسازگاری مواجه میشود. تفاوت نسخه زبانهای برنامهنویسی، کتابخانهها، تنظیمات سیستمعامل و حتی پیکربندی شبکه باعث میشود نرمافزاری که روی لپتاپ توسعهدهنده بهدرستی اجرا میشود، روی سرور تست یا محیط عملیاتی با مشکل روبهرو شود. دقیقا در پاسخ به همین چالش است که این سؤال مطرح میشود که داکر چیست و چرا تا این حد در توسعه نرمافزار مدرن اهمیت پیدا کرده است؟
داکر (Docker) یک پلتفرم متنباز است که امکان بستهبندی برنامهها را به همراه تمام وابستگیها، کتابخانهها و تنظیمات موردنیاز آنها در واحدهایی به نام Container فراهم میکند. این Containerها مستقل از محیط اجرا عمل میکنند؛ به این معنا که یک نرمافزار میتواند بدون تغییر، در محیطهای مختلفی مانند سیستم توسعهدهنده، سرور تست، زیرساخت ابری یا سرورهای سنتی اجرا شود. بههمین دلیل، داکر به راهحلی مؤثر برای حذف جمله معروف «روی سیستم من کار میکند» تبدیل شده است.
با استفاده از داکر، تیمهای توسعه، تست و عملیات میتوانند روی یک خروجی واحد کار کنند، بدون آنکه نیاز باشد در هر مرحله کتابخانهها و پیشنیازهای نرمافزار را بهصورت جداگانه نصب و پیکربندی کنند. این موضوع نهتنها همکاری بین تیمها را سادهتر میکند، بلکه سرعت توسعه، استقرار و مقیاسپذیری نرمافزارها را به شکل قابلتوجهی افزایش میدهد. در ادامه این مقاله بررسی میکنیم داکر چیست، چگونه کار میکند و چرا به یکی از ابزارهای کلیدی در معماری نرمافزارهای امروزی تبدیل شده است.
Docker چیست؟
داکر Docker با هدف استانداردسازی نحوه ساخت، توزیع و اجرای نرمافزارها طراحی شده است. داکر به توسعهدهندگان و تیمهای فنی اجازه میدهد برنامههای خود را بهگونهای بستهبندی کنند که مستقل از محیط اجرا باشند، به این معنا که نرمافزار، به همراه تمام وابستگیها، کتابخانهها، ابزارهای سیستمی و تنظیمات موردنیاز، در قالب یک واحد قابلحمل اجرا شود و در محیطهای مختلف رفتاری یکسان داشته باشد.
ایده اصلی داکر بر پایه این واقعیت شکل گرفته است که بخش بزرگی از مشکلات توسعه و استقرار نرمافزار نه به منطق برنامه، بلکه به تفاوت محیطهای اجرا بازمیگردد. تفاوت نسخه زبانهای برنامهنویسی، کتابخانهها، سیستمعاملها و تنظیمات زیرساختی باعث میشود نرمافزاری که در یک محیط بدون مشکل اجرا میشود، در محیطی دیگر دچار خطا شود. داکر این مشکل را با ایجاد یک لایه انتزاعی بین نرمافزار و سیستم میزبان حل میکند.
در داکر، هر نرمافزار در قالب یک Container اجرا میشود. این Container شامل کد برنامه و تمام پیشنیازهای اجرای آن است و مستقیماً از کرنل سیستمعامل میزبان استفاده میکند. برخلاف ماشینهای مجازی که یک سیستمعامل کامل را شبیهسازی میکنند، داکر با اشتراکگذاری کرنل، محیطی سبکتر، سریعتر و کمهزینهتر فراهم میکند. همین تفاوت باعث شده است داکر برای اجرای همزمان تعداد زیادی سرویس، مقیاسپذیری سریع و استقرار مداوم نرمافزار بسیار مناسب باشد. به عنوان نمونه به تصویر زیر توجه کنید.
این تصویر نحوه اجرای برنامهها در معماری مبتنی بر Docker را نشان میدهد. در پایینترین لایه، زیرساخت (Infrastructure) قرار دارد که شامل سرور فیزیکی یا منابع ابری مانند CPU، حافظه و دیسک است. روی این زیرساخت، سیستمعامل میزبان (Host Operating System) اجرا میشود که کرنل آن بین تمام Containerها به اشتراک گذاشته میشود.
در لایه بالاتر، Docker قرار دارد که وظیفه مدیریت Containerها را بر عهده دارد. داکر منابع سیستم را بین Containerها تخصیص میدهد، ایزولهسازی پردازهها را انجام میدهد و امکان اجرای همزمان چند برنامه را بدون تداخل فراهم میکند.
در بالاترین بخش تصویر، چندین برنامه کانتینریشده Containerized Applications مانند App A تا App F نمایش داده شدهاند. هر یک از این برنامهها داخل Container مخصوص به خود اجرا میشود و شامل کد برنامه و تمام وابستگیهای موردنیاز آن است. با وجود اجرای همزمان روی یک سیستمعامل، هر Container کاملا ایزوله بوده و بر عملکرد سایر Containerها تأثیری ندارد.
این معماری نشان میدهد که داکر چگونه بدون نیاز به اجرای چند سیستمعامل مجزا مانند ماشینهای مجازی، امکان اجرای چندین برنامه مستقل را روی یک Host فراهم میکند. نتیجه این رویکرد، مصرف کمتر منابع، سرعت اجرای بالاتر و سهولت در استقرار و مقیاسپذیری نرمافزارها است.
یکی از مهمترین فاکتورهایی که Docker دارد Open Source بودن آن است. این یعنی هر کسی میتواند Docker را تهیه و source آن را تغییر بدهد و یک محصول جدید معرفی کند و یا اینکه قابلیتهای جدیدی به آن اضافه کند که تا به حال بر روی آن وجود نداشته است.
Docker توسط زبان برنامهنویسی Go نوشته شده است و میتوان را بر روی سیستمعاملهای لینوکس و ویندوز نصب و راهاندازی نمود. Docker مبتنی بر لایسنس Apache License 2.0 بوده و سایت رسمی آن در نشانی زیر قرار دارد:
ttps://www.docker.com/
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 شود.
Container در داکر چیست؟
Container یک واحد استاندارد نرمافزاری است که یک برنامه را بههمراه تمام وابستگیهای موردنیاز آن مانند کتابخانهها، ابزارهای سیستمی و تنظیمات در قالب یک محیط ایزوله اجرا میکند. Containerها بهگونهای طراحی شدهاند که مستقل از محیط اجرا باشند و بتوانند بدون تغییر، روی سیستمهای مختلف اجرا شوند.
برخلاف ماشینهای مجازی که یک سیستمعامل کامل را شبیهسازی میکنند، Containerها مستقیما از کرنل سیستمعامل میزبان استفاده میکنند. این رویکرد باعث میشود Containerها سبکتر، سریعتر و کممصرفتر باشند و امکان اجرای تعداد زیادی برنامه ایزوله روی یک سیستم واحد فراهم شود.
Containerها این مشکل رایج را حل میکنند که نرمافزارها در محیطهای مختلف رفتار متفاوتی داشته باشند. با بستهبندی برنامه و وابستگیهای آن در یک Container، اطمینان حاصل میشود که نرمافزار در محیط توسعه، تست و استقرار دقیقاً به یک شکل اجرا میشود.
چرا Docker و Containerization بهوجود آمدند؟
در روشهای سنتی نصب نرمافزار، هر برنامه به مجموعهای از پیشنیازها، کتابخانهها و تنظیمات وابسته است که باید بهصورت دستی روی سیستم نصب شوند. تفاوت نسخهها و تداخل وابستگیها باعث میشود نصب و نگهداری نرمافزارها بهمرور زمان پیچیده و پرخطا شود، بهخصوص زمانی که نیاز به اجرای همزمان چند نسخه از یک نرمافزار یا ابزار وجود داشته باشد.
ماشینهای مجازی و تکنولوژی مجازی سازی تا حدی این مشکل را حل کردند و امکان اجرای برنامهها در محیطهای ایزوله را فراهم آوردند، اما سربار بالا، مصرف زیاد منابع و سرعت پایین راهاندازی باعث شد این روش برای بسیاری از سناریوهای توسعه و استقرار، بهینه نباشد.
Containerization با رویکردی متفاوت وارد شد. در این مدل، بهجای شبیهسازی یک سیستمعامل کامل، تنها برنامه و وابستگیهای آن بستهبندی میشود و مستقیما روی سیستمعامل میزبان اجرا میگردد. این کار باعث کاهش چشمگیر مصرف منابع، افزایش سرعت اجرا و امکان اجرای تعداد زیادی سرویس مستقل روی یک سیستم واحد میشود.
Docker با سادهسازی استفاده از Containerها، این فناوری را به ابزاری عملی برای توسعهدهندگان تبدیل کرد. بهکمک Docker، نرمافزارها میتوانند بدون وابستگی به محیط اجرا، بهصورت قابلاعتماد در مراحل توسعه، تست و استقرار استفاده شوند و همین ویژگی، داکر را به یکی از پایههای اصلی معماریهای مدرن و DevOps تبدیل کرده است.
تفاوت Docker و Virtual Machine
در تصویر بالا، تفاوت دو روش اجرای نرمافزار یعنی ماشین مجازی و Containerها در Docker نمایش داده شده است. این مقایسه بهخوبی نشان میدهد که چرا Docker بهعنوان یک راهکار مدرنتر نسبت به ماشینهای مجازی مطرح شده است.
در سمت چپ تصویر، معماری ماشین مجازی دیده میشود. در این مدل، هر برنامه بههمراه کتابخانههای موردنیاز خود داخل یک سیستمعامل کامل Guest OS اجرا میشود. این سیستمعاملها روی یک Hypervisor قرار دارند و هرکدام بهصورت مستقل عمل میکنند. هرچند این روش ایزولهسازی مناسبی ایجاد میکند، اما باعث مصرف بالای منابع، حجم زیاد و زمان راهاندازی طولانیتر میشود.
در سمت راست تصویر، معماری Containerها در Docker نمایش داده شده است. در این روش، همه برنامهها از سیستمعامل میزبان مشترک استفاده میکنند و دیگر نیازی به اجرای سیستمعامل جداگانه برای هر برنامه نیست. هر Container فقط شامل خود برنامه و وابستگیهای آن است و به همین دلیل بسیار سبکتر و سریعتر اجرا میشود. Docker با استفاده از Container Engine، این محیطها را مدیریت میکند و از تداخل آنها جلوگیری مینماید.
بهطور خلاصه، تفاوت داکر و ماشین مجازی در این است که ماشینهای مجازی یک سیستمعامل کامل را شبیهسازی میکنند، اما Docker تنها برنامه و وابستگیهای آن را ایزوله میکند. همین تفاوت باعث شده Docker برای توسعه سریع، تست نرمافزار، استقرار مداوم و معماریهای مدرن گزینهای بسیار کارآمدتر باشد.
Docker ابزاری است که هم برای برنامهنویسان و هم برای مدیران سیستم و شبکه کاربرد دارد و به همین دلیل معمولاً در کنار مفهومی به نام DevOps مطرح میشود. DevOps ترکیبی از دو نقش Developer و Operations است و Docker یکی از ابزارهای اصلی این رویکرد به شمار میرود.
برای برنامهنویسان، Docker این مزیت را دارد که تمرکز اصلی روی کدنویسی باقی بماند. بهجای درگیری با تفاوت سیستمعاملها، نسخه کتابخانهها و تنظیمات محیط اجرا، برنامهنویس میتواند نرمافزار خود را داخل یک Container اجرا کند و مطمئن باشد که همان برنامه در محیط تست و سرور نهایی نیز دقیقاً به همان شکل اجرا خواهد شد.
برای مدیران سیستم و متخصصان IT، Docker امکان استفاده سریع و ساده از هزاران نرمافزار آماده را فراهم میکند که بهصورت Container طراحی شدهاند. این نرمافزارها بدون نیاز به نصب پیچیده، تنها با اجرای یک Container قابل استفاده هستند و در صورت عدم نیاز، بهراحتی حذف میشوند بدون اینکه اثری روی سیستم باقی بگذارند.
در محیطهای عملیاتی، Docker این قابلیت را ایجاد میکند که چندین برنامه بهصورت همزمان روی یک سیستم فیزیکی اجرا شوند، بدون اینکه با یکدیگر تداخلی داشته باشند. هر برنامه در Container مخصوص به خود اجرا میشود و بهصورت کامل ایزوله است. این ویژگی باعث استفاده بهینهتر از منابع، افزایش پایداری سرویسها و سادهتر شدن مدیریت زیرساخت میشود.
مکانیزم کاری 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 و Containerization
Docker یک فناوری ناگهانی یا مستقل نبوده، بلکه نتیجه سالها توسعه و تکامل مفهوم ایزولهسازی در سیستمعاملهاست. در اوایل دهه ۲۰۰۰، اولین تلاشها برای ایزولهسازی برنامهها در سطح سیستمعامل آغاز شد. در سال ۲۰۰۰، فناوری Jails در سیستمعامل FreeBSD معرفی شد که امکان جداسازی محیط اجرای برنامهها را فراهم میکرد. کمی بعد، در لینوکس نیز مفاهیم اولیهای برای جداسازی کرنل و پردازهها شکل گرفت.
در سالهای بعد، فناوریهایی مانند Solaris Zones و سپس cgroups و namespaces در لینوکس معرفی شدند. این قابلیتها اجازه میدادند منابع سیستم مانند CPU، حافظه و پردازهها بهصورت جداگانه مدیریت شوند. در واقع، این مفاهیم پایههای اصلی Containerها در لینوکس هستند.
در سال ۲۰۰۸، پروژه LXC (Linux Containers) معرفی شد که اولین پیادهسازی عملی و جدی Containerها در لینوکس بهشمار میرفت. LXC امکان ساخت محیطهای ایزوله را فراهم میکرد، اما استفاده از آن هنوز پیچیده و مناسب کاربران عادی نبود.
نقطه عطف اصلی در سال ۲۰۱۳ اتفاق افتاد؛ زمانی که Docker معرفی شد. Docker تمام این مفاهیم فنی و پیچیده را در قالب ابزارهایی ساده، استاندارد و قابلاستفاده ارائه کرد. به همین دلیل Containerها از یک مفهوم تخصصی و محدود، به ابزاری عمومی برای توسعه، تست و استقرار نرمافزار تبدیل شدند.
بهطور خلاصه، این تصویر نشان میدهد که Docker حاصل سالها پیشرفت در فناوری Containerization است و نقش اصلی آن، سادهسازی استفاده از Containerها و فراگیر کردن این فناوری بوده است.
پایه فنی Docker چیست؟
Docker بر پایه مفهومی به نام مجازیسازی در سطح سیستمعامل OS Level Virtualization ساخته شده است. در این نوع مجازیسازی، برخلاف ماشینهای مجازی سنتی، برای هر برنامه یک سیستمعامل جداگانه اجرا نمیشود. بلکه همه برنامهها از یک هسته مشترک سیستمعامل استفاده میکنند و فقط در محیطهای ایزوله اجرا میشوند.
در OS Level Virtualization، سیستمعامل میزبان این امکان را فراهم میکند که چندین محیط کاملا جدا از هم ایجاد شوند که به آنها Container گفته میشود. هر Container احساس داشتن یک سیستم مستقل را میدهد، اما در واقع وابسته به Kernel سیستمعامل اصلی است. همین موضوع باعث میشود مصرف منابع بسیار کمتر باشد و برنامهها با سرعت بالاتری اجرا شوند.
Docker با سادهسازی این مدل مجازیسازی، استفاده از Containerها را عملی و قابلدسترس کرد. بهجای درگیری با جزئیات فنی Kernel، ایزولهسازی و مدیریت منابع، Docker این پیچیدگیها را پنهان کرده و یک راهکار استاندارد برای اجرای نرمافزارها در قالب Container ارائه میدهد. به همین دلیل، Docker بهعنوان یکی از مهمترین پیادهسازیهای OS Level Virtualization شناخته میشود.
نسخههای مختلف Docker
Docker دارای یک هسته اصلی به نام Docker Engine است که بهصورت متنباز و رایگان در اختیار کاربران قرار میگیرد. این بخش مسئول ساخت Image و اجرای Containerهاست و برای همه کاربران یکسان است.
در کنار Docker Engine، شرکت Docker برای ابزارها و سرویسهای جانبی مانند Docker Desktop، Docker Hub و قابلیتهای تیمی و امنیتی، پلنهای اشتراکی مختلفی ارائه میدهد. این پلنها بیشتر به مدل استفاده و نیاز کاربران مربوط میشوند و نه به تفاوت در خود Docker Engine.
برای اغلب توسعهدهندگان، تیمهای کوچک و پروژههای آموزشی، نسخه رایگان Docker Personal کاملاً کافی است. پلنهای پولی Docker بیشتر برای تیمها و سازمانهایی طراحی شدهاند که به امکاناتی مانند مدیریت کاربران، امنیت پیشرفته و پشتیبانی رسمی نیاز دارند.
اجزای اصلی 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 برای بسته دانلودی موجود است. اجرای برنامه نیز در همین صفحه نمایش داده شده است.
سوالات متداول
داکر چیست و چه کاربردی دارد؟
داکر ابزاری برای اجرای برنامهها در قالب کانتینر است که وابستگیها را ایزوله میکند و فرآیند توسعه و استقرار را سادهتر میکند.
کانتینر در داکر چیست؟
کانتینر یک محیط سبک و ایزوله برای اجرای برنامه است. برای یادگیری عملی این مفهوم میتوانید مقاله آموزش کار با کانتینر در داکر را بخوانید.
آیا یادگیری دستورات داکر ضروری است؟
بله. بدون تسلط بر دستورات داکر عملا استفاده حرفهای از داکر امکانپذیر نیست.






























