داکر (Docker) به توسعه دهندگان کمک می کند تا بسته های نرم افزاری سبکی بسازند که توسعه، آزمایش و گسترش آن ها را ساده تر می کند. 

داکر (Docker) چیست؟

Docker یک پلتفرم نرم افزاری برای ساخت برنامه های کاربردی مبتنی بر Container است. کانتینرها محیط های کوچک، سبک و ایزوله ای هستند که از یک سیستم عامل مشترک استفاده می کنند اما جدا از یکدیگر برنامه های شان را اجرا می کنند.

در گذشته زمانی که می خواستید یک برنامه وب را اجرا کنید، سرور می خریدید، سیستم عامل لینوکس را بر روی آن نصب می کردید و سپس اپلیکیشن مورد نظرتان را اجرا می کردید. اگر اپلیکیشن یا برنامه شما مورد استقبال افراد بیشتری قرار می گرفت، سپس سرور دومی برای آن راه اندازی می کردید تا بار ترافیک حاصل از برنامه را بین سرورها تقسیم و مانع خرابی سرور شوید.

اما زمان تغییر کرده است و به جای تمرکز بر روی سرورهای تکی، دنیای اینترنت به مجموعه ای از سرورها به نام سیستم "ابری" وابسته شده است. به لطف نوآوری ها می توان سرور را از محدودیت های سخت افزاری جدا کرد و آن را به یک نرم افزار تبدیل کرد. با همه این توضیحات حالا می توان گفت که این سرورهای مبتنی بر نرم افزار، Container نامیده می شوند و ترکیبی از سیستم عامل لینوکس هستند که روی آن اجرا می شوند.

تاریخچه مختصری از Docker

داکر در سال 2008 با نام DotCloud توسط Solomon Hykes در پاریس تاسیس شد. به عنوان یک پلتفرم (PaaS) شروع به کار کرد تا اینکه در سال 2013 تمرکز خود را بر روی ایجاد Container های نرم افزاری کرد تا پلتفرم خود را روی آن ها اجرا کند.

زمانی که Docker متولد شد و از آنجایی که منبع باز بود، به سرعت مورد توجه توسعه دهندگان قرار گرفت و توجه شرکت های بزرگی چون مایکروسافت، IBM و REDHat و همچنین سرمایه گذاران ریسک پذیر را نیز به خود جلب کرد.

منظور از کانتینر (Container) چیست؟

کانتینر چیست

Containerها، واحدهای نرم افزاری مستقلی هستند که می توانید آن ها را از یک سرور به سرور دیگری منتقل کنید. برای مثال آن ها را می توانید از لپ تاپ خود به یک سرور غول پیکر فیزیکی انتقال دهید و در آن جا برنامه ها را اجرا کنید. برنامه ها به صورت ایزوله منتقل و هر فایل سیستم مخصوص خود را برای اجرا دارد.

در دنیای ماشین مجازی (Virtual Machine) این کار را می توان با جدا نگهداشتن برنامه ها در حین اجرا بر روی یک سخت افزار یکسان انجام داد، اما هر ماشین مجازی به سیستم عامل خاص خودش نیاز دارد. اما سخت افزاری که ماشین مجازی را بر روی خود دارد بسیار سنگین و دست و پا گیر است و بسیار کند راه اندازی می شود. 

اما از طریق داکر و کانتینرها می توان این کار را به شیوه ای سبک و سریع توسط توسعه دهندگان انجام داد.

به زبان ساده تر کانتینر (Container) برای متخصصان IT یا توسعه دهندگان این امکان را فراهم می کند تا بسته کاملی از برنامه های خود را همراه با تمامی بخش های مورد نیاز آن ایجاد کنند و همه این موارد را به صورت یک بسته کامل ارسال کنند.

برای مثال، تصور کنید که چندین خرید مختلف داشته اید و می خواهید آن ها را همزمان با هم به یک آدرس پست کنید؛ برای اینکه خریدها یکباره و یکجا ارسال شوند همه شان را درون یک بسته قرار می دهید و سپس جعبه را به پست تحویل می دهید.

اجزای سازنده داکر

اجزای مختلف داکر

Docker از اجزای مختلفی تشکیل شده است که هر کدام را در ادامه بررسی می کنیم:

Dockerfile: هر کانتینر Docker با یک Dockerfile شروع می شود. این فایل متنی، مجموعه‌ای از دستورالعمل ‌ها را برای ساخت یک image Docker ارائه می ‌کند، که دستورات شامل سیستم عامل، زبان ‌ها، متغیرهای محیطی، مکان ‌های فایل، پورت‌ های شبکه و هر مؤلفه دیگری که برای اجرا نیاز دارد است.

Docker image: یک فایل قابل حمل (پرتابل)، خواندنی و قابل اجرا است که حاوی دستورالعمل‌ هایی برای ایجاد یک کانتینر است.

ابزار اجرای Docker: فرمانی است که یک Container را راه اندازی می کند. هر Container نمونه ای از یک Image است و چندین نمونه از یک تصویر را می توان به طور همزمان اجرا کرد.

Docker Hub: یک مخزن است که در آن می توان تصاویر کانتینر را ذخیره کرد، به اشتراک گذاشت و مدیریت کرد. همانند GitHub برای برنامه نویسان، اما Docker Hub به طور خاص برای کانتینرها طراحی شده است.

Docker Engine: هسته داکر است. این موتور زیربنای فناوری ارتباط بین مشتری و سرور است که کانتینرها را ایجاد و اجرا می کند. Docker Engine شامل یک فرآیند شبیه سازی شده به نام dockerd برای مدیریت کانتینرها است، یعنی APIهایی که به برنامه‌ ها اجازه می ‌دهند با داکر ارتباط برقرار کنند و یک رابط خط فرمان داشته باشند.

Docker Compose: یک ابزار خط فرمان است که از فایل‌های YAML برای تعریف و اجرای برنامه ‌های Docker چند کانتینری استفاده می ‌کند. این ابزار اجازه می دهد تمام سرویس ها را از پیکربندی خود ایجاد، شروع، متوقف و بازسازی کنید و وضعیت و گزارش خروجی همه سرویس های در حال اجرا را مشاهده کنید.

Docker Desktop: همه این قطعات در برنامه Docker’s Desktop طراحی شده‌اند و راهی برای ساختن و اشتراک‌ گذاری برنامه ‌های کانتینری و میکرو سرویس‌ ها ارائه می ‌کنند.

اصطلاحات مرتبط با داکر

Docker daemon: یا شبح داکر، سرویسی است که روی سیستم عامل شما مانند ویندوز، MacOS، یا IOS اجرا می شود. این سرویس Docker Image را با استفاده از دستورات مشتری (Client) ایجاد و مدیریت می کند و به عنوان مرکز کنترل اجرای داکر عمل می کند.

Docker registry: یک سیستم ذخیره سازی و توزیع برای تصاویر داکر است. رجیستری به شما این امکان را می دهد تا تصاویر را در مخزن با استفاده از تگ (Tag) گذاری شناسایی و ردیابی کنید. این کار با استفاده از Git، یک ابزار کنترل نسخه انجام می شود.

نحوه کار داکر

مزایای Docker

کانتینرهای داکر به شیوه ای آسانتر از روش های گذشته، جمع آوری، نگهداری و جا به جایی برنامه ها را برای توسعه دهندگان فراهم می کنند. علاوه بر این ها Docker مزایای بیشتری دارد که با هم بررسی می کنیم.

کانتینرهای Docker بسیار ساده هستند و قابلیت انتقال برنامه ها را امکان پذیر می کنند. داکر به برنامه ها و محیط آن ها اجازه می دهد تا با ایزوله شدن از دیگر برنامه ها جدا نگه داشته شوند و به این شیوه بتوان کنترل دقیق تری بر انتقال شان داشت و فرایند مانیتورینگ را نیز ساده تر می کنند.

کانتینرهای داکر قابلیت ترکیب پذیری دارند. Containerها ساخت اجزای سازنده یک برنامه را در یک واحد ماژولار، از طریق تعویض راحت این اجزا برای توسعه دهندگان آسان تر کرده است، این کار توسعه، انتشار ویژگی های برنامه و رفع اشکالات را سریع تر کرده است.

کانتینرهای داکر هماهنگی و مقیاس بندی را آسان می کنند. از آنجایی که این Containerها از نظر حجمی سبک هستند، توسعه دهندگان می توانند تعداد زیادی از آن ها را برای ارائه خدمات بهتر راه اندازی کنند. بعد از راه اندازی، این کانتینرها باید با هم هماهنگ شوند که برای این هماهنگی به Kubernetes نیاز است. 

Kubernetes با حذف پیچیدگی های مدیریتی، باعث افزایش عملکرد کانتینرها می شود.

معایب داکر

Containerها بسیاری از مشکلات توسعه دهندگان را حل می کنند اما نه همه شان را.

کانتینرهای Docker، ماشین مجازی نیستند. بر خلاف ماشین مجازی، کانتینرها از بخش های کنترل شده ای در سرور استفاده می کنند، به این معنی که عناصر موجود در آن ها به اندازه ماشین مجازی از هم جدا و ایزوله نیستند.

کانتینرهای داکر سرعت کمتری از سخت افزارهای فلزی دارند. کانتینرها به اندازه قابل توجهی سبک هستند و سرعت بهتری هم نسبت به ماشین مجازی دارند اما حجم فعالیت شان زیاد است. اگر حجم کاری که انجام می دهید بالاست و نیاز به سرعت یک سخت افزار دارید، کانتینرها می توانند کار را برای تان انجام دهند اما نه به اندازه سرعت سرور فیزیکی.

کانتینرهای Docker تغییر ناپذیرند. کانتینرها از طریق یک Image که محتویات داخل شان را بیان می کند، اجرا می شوند. این Image به طور پیش فرض تغییر ناپذیر است. اما کانتینرها بعد از انتقال، وقتی که از حافظه سیستم حذف می شوند برای همیشه از بین می روند. اگر می خواهید کانتینرهای تان در تمام انتقال ها همانند ماشین مجازی، در همان حال باقی بمانند، باید در زمان طراحی شان به ثابت و ماندگار بودن شان دقت کنید.

آیا استفاده از Docker محدودیت هایی دارد؟

داکر به تنهایی می تواند تک کانیتنرها را مدیریت کند، اما زمانی که تعداد این کانتینرها به صدها قطعه یا بیشتر می رسد، مدیریت شان سخت تر می شود. برای راحت کردن کار، باید Containerها را براساس خدماتی که ارائه می دهند مانند شبکه، امنیت، تله متری یا دیگر موارد دسته بندی کنید. همانطور که در بالاتر هم گفتیم، این کار را می توان با استفاده از Kubernetes انجام داد.