این روزها صحبت داکر (Docker) در محافل فناوری داغ است و به احتمال زیاد از گوشه و کنار تعریفهای داکر به گوش شما نیز رسیده است. حتی آمارهای سایت DataLog هم گواهی بر این موضوع است. همانطور که در نمودار زیر میبینید، از سال 2015 به بعد، تعداد مشتریانی که از Docker استفاده میکنند، بهشدت افزایش یافته است.
پس بیایید با هم ببینیم که داکر چیست و چرا در سالهای اخیر اینقدر محبوبیت پیدا کرده است؟
در این مقاله با مروری بر تاریخچه Docker شروع میکنیم و بعد به امکانات و ویژگیهای داکر و اصطلاحات کاربردی آن میپردازیم.
مرور کوتاهی بر تاریخچه داکر
حدود ۵ سال پیش فردی با نام سالامان هایکز (Solomon Hykes)، سازوکاری با نام داکر را راهاندازی کرد. هدف از این کار تعامل راحتتر با کانتینرها (Containers) بود. خلاصه بگوییم که این ایده با موفقیت روبرو شد و در سال ۲۰۱۴ پس از انتشار داکر نسخه ۱.۰ شاهد افزایش محبوبیت آن بودیم.
در نتیجه شرکتها یکی پس از دیگری اپلیکیشنهای تحت سرور را به جای ماشینهای مجازی در بستر داکر راهاندازی کردند. جالب است بدانید چندین بانک بزرگ در زمانی که داکر هنوز در نسخه ۱.۰ به سر میبرد از این فناوری کمک گرفتند. این اتفاق نشان میداد که این فناوری نوپا که در نسخه اولیه قرار دارد، از امنیت بالایی برخوردار است!
این روزها Docker and Moby که به عنوان مجموعه بالاسری داکر شناخته میشود، مخاطبین بسیار زیادی جذب کرده و بنا به گزارش داکر بیشتر از ۳.۵ اپلیکیشن در کانتینرها از طریق فناوری داکر قرار دارند و بیشتر از ۳.۷ میلیارد اپلیکیشن هم از این طریق دانلود شده است.
جالب است بدانید که بزرگانی مانند ردهت، کنونیکال، اوراکل و مایکروسافت نیز به استفاده از داکر گرایش پیدا کردهاند و در حال حاضر هم تقریباً تمام کمپانیهای حاضر در بستر رایانش ابری، به نوعی از داکر استفاده میکنند.
پیشنهاد میکنیم اگر با رایانش ابری آشنایی کاملی ندارید، به مقاله رایانش ابری چیست را بخوانید.
حالا برویم سراغ بررسی ماهیت داکر.
داکر (Docker) چیست؟
داکر امکانی را فراهم آورده است که پروسهها و نرمافزارها به صورت مجزا در محیط کاملا ایزولهای بر روی کرنل لینوکس راهاندازی شوند؛ به این محیط و بستۀ ایزوله، کانتینر (Container) میگویند.
کانتینر این امکان را برای برنامهنویسان و توسعهدهندگان اپلیکیشنها فراهم میکند که یک برنامه را با تمام ماژولها و کامپوننتهای وابسته آن (مانند کتابخانهها، توابع و …) یکی کرده و به صورت یک پکیج درآورند تا آن برنامه تولید شده در پلتفرمها و سیستمهای مختلف بدون مشکل اجرا شود.
در حقیقت هدف این است که بدون نگرانی از تنظیمات و وابستگیهای یک Application خاص در پلتفرمهای دیگر، آن برنامه در هر محیطی اجرا شود. پس اگر برنامه نویسی می کنید حتما استفاده از داکر را به شما توصیه می کنیم.
داکر که در بالا به آن اشاره شد وظیفه مدیریت کانتینرها را به عهده دارد و بیشتر شبیه یک ماشین مجازی عمل میکند.
تفاوت داکر و ماشین مجازی چیست؟
تفاوت داکر با ماشین مجازی در این است که در VM (یا ماشین مجازی) برای اجرای اپلیکیشن و برنامههای مختلف که بخواهیم به صورت ایزوله و مجزا از هم کار کنند باید VM های مختلف ساخته شود که همین موضوع بار پردازشی و هدر رفت منابع سیستمی را روی سرور به همراه دارد.
ولی در Docker روی یک VM خاص که میتواند دارای سیستم عامل ویندوز یا لینوکس باشد، ماژول داکر نصب شده و سپس روی سرویس داکر، کانتینرهای مختلف حاوی برنامهها و اپلیکیشنهای مختلف نصب و اجرا میشوند؛ بدون اینکه کانتینرها به هم دسترسی داشته باشند. بدین صورت کانتینرها از هم ایزوله هستند و نیاز ما برای ایجاد چندین VM را مرتفع میسازند.
در تصویر زیر نیز میتوانید تفاوت ماشین مجازی و کانتینر را ببینید. 👇
همانطور که پیداست، داکر روی LXC سوار میشود و همانند سایر کانتینرها به فایلهای سیستمی، فضای ذخیرهسازی، پردازنده، رم و دیگر منابع به صورت اختصاصی دسترسی دارد. به این ترتیب میتوان تفاوت اصلی میان کانتینرها و ماشینهای مجازی (VM)، را در این دانست که وقتی هایپروایزر (Hypervisor) به صورت انتزاعی تمام یک سیستم را ایجاد میکند، کانتینرها تنها به صورت انتزاعی کرنل سیستمعامل را ایجاد میکنند.
این امر میلیونها دلار صرفهجویی را برای شرکتهای ارائهدهنده خدمات رایانشابری به دنبال دارد و به همین دلیل است که غولهای فناوری به سرعت به سمت داکر پیش رفتهاند.
دلایل محبوبیت داکر چیست؟
استفاده از داکر، مزایایی را برای توسعهدهندگان به همراه دارد که در این بخش به آن میپردازیم.
1. محیط ایزوله و پایدار
با استفاده از کانتینر، توسعهدهندهها میتوانند محیطهایی ایزوله و قایل پیشبینی را ایجاد کنند که از دیگر برنامهها جدا شدهاند. بدون در نظر گرفتن اینکه برنامه در کجا مستقر شده است، همهچیز پایدار است و این موضوع منجر به افزایش بهرهوری میشود. چگونه؟ در واقع شما با کاهش زمانی که برای دیباگ کردن میگذارید، زمان بیشتری برای لانچ کردن فیچرهای جدید خواهید داشت.
2. هزینه مناسب و استقرار سریع
کانتینرهای مجهز به داکر، از نظر کاهش زمان استقرار زبانزد هستند و با هر استانداری که حساب کنید، این کاهش زمان (تا چند ثانیه) یک شاهکار به حساب میآید!
در حالت سنتی، مواردی مانند تهیه، راهاندازی سختافزار و اجرا، چند روز زمان لازم دارد؛ بهعلاوه، شما با کارهای اضافه بر سازمان هم باید سروکله بزنید. اما وقتی که یک فرایند درون کانتینر قرار میگیرد، میشود آن را با برنامههای جدید هم به اشتراک گذاشت. این کار چه کمکی میکند؟
فرآیند استقرار سریعتر میشود و در زمان و هزینه صرفهجویی میکنید.
3. پرتابل بودن و قابلیت اجرا در هر مکان
داکر ایمیجها محدودیت محیطی ندارند و این موضع باعث میشود که هرگونه استقراری، پایدار، پرتابل (قابل حمل) و مقیاسپذیر باشد. به علاوه، کانتینرها میتوانند در هر مکانی، بر اساس سیستمعامل (Win ،Mac OS ،Linux ،VMs ،On-prem ، در Public Cloud) اجرا شوند؛ که این ویژگی مهمی برای توسعه و استقرار است.
داکر توسعهدهندگان را قادر میسازد تا اپلیکیشنهای خود را راحت و سریع با حجم کمتری به صورت قابل حمل و پرتابل در یک کانتینر قرار دهند. این اپلیکیشنهابه صورت مجازی از هر جایی قابل اجرا هستند.
این فرآیند از طریق مجزا کردن کدها در داخل یک کانتینر واحد انجام میشود. کاملاً مشخص است چنین کاری بهینهسازی و آپدیت برنامه را سادهتر میکند. از آنجایی که شرکتهای فعال در عرصه فناوری به دنبال راههای بیشتری برای ساخت اپلیکشنهای پرتابل میگردند داکر روزبهروز طرفداران جدیدی پیدا میکند.
4. قابلیت خوکارسازی (اتوماسیون)
کد زدن با زیرساخت و پیکربندی تکرارپذیر، سرعت توسعه شما را چندین برابر میکند. از طرف دیگر، تصاویر داکر (Docker Images) اغلب حجم کمی دارند، پس در نتیجه تحویل استقرار آنها در کانتینر برنامههای جدید در مدت زمان کمی انجام میگیرد.
مزیت دیگر تعمیر و نگهداری مستقیم است. هنگامی که یک برنامه وارد Container میشود، از سایر برنامههای در حال اجرا در داخل سیستم، جدا میشود. به عبارت دیگر ، برنامهها با هم مخلوط نمیشوند و به همین دلیل، تعمیر و نگهداری آنها به طور قابل توجهی آسانتر میشود. با اتومات شدن فرایندها، سرعت بیشتر و اشتباهات کمتری خواهید داشت.
5. انعطافپذیری
اگر در چرخۀ انتشار یک محصول، نیاز به ارتقاء پیدا کنید، داکر کار را برایتان سادهتر میکند. چطور؟
شما میتوانید تغییرات مورد نیاز را در کانتینرهای داکر ایجاد کرده، آنها را تست کنید و در نهایت از کانتینرهای جدید رونمایی کنید. در واقع این ویژگی کلیدی (یعنی انعطافپذیری بالای داکر) به شما اجازه میدهد که Image های جدیدی را ساخته، تست و منتشر و کنید که در چندین سرور مختلف میتوانند مستقر شوند.
با داکر میتوان پروژه را روی چند سرور جدید و مختلف آزمایش کرد و تمامی اعضای گروه بر روی یک پروژه واحد با تنظیمات همانند قادر به همکاری هستند. این کار توسعهدهندگان را قادر میسازد تا نسخههای جدید برنامه خود را به سرعت آزمایش کرده و از عملکرد صحیح آن اطمینان خاطر حاصل کنند.
6. مقیاسپذیری
متد کانتینرسازی در داکر، به شما اجازه میدهد که برنامه را بخشبندی کرده و سپس بخشهای مختلف آن را رفرش، پاکسازی یا تعمیر کنید؛ بدون آنکه نیاز باشد کل برنامه متوقف شود!
علاوهبراین، با Docker میتوانید معماری برنامه را بر اساس فرایندهای کوچکی که از طریق API با هم در ارتباط هستند بسازید. حالا فرض کنید توسعهدهندهها با همکاری هم مشغول توسعه و حل مشکلات این فرایندها باشند؛ اینطوری چرخه توسعه با سرعت پیش میرود، مسائل راحتتر حل میشوند و در زمان و هزینه صرفهجویی میکنید.
7. بهینه بودن
اگر با مجازی سازی آشنا باشید حتماً میدانید که مجازیسازهایی مانند Hyper-V، KVM و Xen، سختافزار را به صورت مجازی در اختیار مدیران شبکه قرار میدهند. در نتیجه این سازوکارها نیازمند منابع سختافزاری قوی هستند.
از طرف دیگر کانتینرها از سیستمعاملهای به اشتراکگذاری شده بهره میگیرند. در نتیجه با روش کارآمدتری طرف هستیم که منابع سیستم را بهینهتر استفاده میکند. بر خلاف مجازیسازی سختافزار، کانتینرها بر بالای یک اینستنس (Instance) لینوکس قرار میگیرند و فضایی کوچک و جمعوجور را برای اپلیکیشنهای فراهم میکنند.
به لطف این ویژگی چیزی حدود ۴ تا ۶ برابر اینستنس بیشتری نسبت به فناوری Xen یا KVM VM بر روی یک سختافزار واحد اجرا میشود. از طرف دیگر کانتینرها به توسعهدهندگان کمک میکنند تا کدهای خود را داخل یک مخزن مشترک قرار دهند. این امر فرآیند کدنویسی را سرعت میبخشد و کدها عملکرد بهتری خواهند داشت.
در این بین اگر با گیتهاب آشنا باشید حتماً به خوبی میدانید که این بستر شرایط همکاری برای بهاشتراک گذاشتن کدها میان توسعهدهندگان را فراهم کرده است. از این لحاظ میتوان داکر را به نوعی شبیه به گیتهاب دانست؛ چراکه مخزن رسمی گیتهاب به شرکتهای تجاری کمک میکند تا نرمافزارهای خود را بهینهتر کرده و اجرا و مدیریت آنها را ارتقا دهند.
8. چابکی
کانتینرهای داکر به راحتی در فضای رایانش ابری قرار میگیرد و به نوعی طراحی شده که تقریباً تمامی اپلیکشنهایی که از متدولوژی دواپس (DevOps) بهره میگیرند با داکر تعامل داشته باشند.
داکر محیطی لوکال را برای توسعه فراهم میکند که این محیط دقیقاً عملکرد یک سرور را در اختیار توسعهدهندگان قرار میدهد. این امر برای روش توسعه CI/CD کاربرد زیادی دارد. از این طریق میتوان چندین محیط توسعه را از یک هاست مشخص با یک نرمافزار، سیستمعامل و تنظیمات واحد اجرا کرد.
پیشنهاد میکنیم مقاله دواپس چیست را مطالعه کنید.
9. استانداردسازی کانتینرها
داکر امکانات جدیدی در اختیار شرکتها قرار داد که پیش از این شاهد آنها نبودیم. در این زمینه میتوان به سادهسازی اجرا و استفاده آن اشاره کرد. از طرف دیگر داکر با کانتینرهای دیگری از کنونیکال، گوگل و ردهت همکاری دارد و در نتیجه استانداردسازی خوبی را برای کانتینرها شاهد هستیم.
همچنین داکر روی سیستمعاملهای مختلف هم قابل اجراست و همین نکته آن را به یک محصول بیرقیب تبدیل کرده است.
10. نظارت و مدیریت کانتینرها
تمامی زیرساختهای IT نیازمند مدیریت و نظارت هستند و در همین راستا کانتینرها نیز باید مانیتور شوند و در حالت کنترلشدهای قرار بگیرند. در غیر این صورت مشخص نخواهد شد سرور چه برنامههایی را اجرا میکند.
خوشبختانه از برنامههای دواپس میتوان برای مانیتور کانتینرهای داکر کمک گرفت؛ اما به این نکته نیز باید اشاره کرد که این برنامهها برای کانتینرها بهینه نشدهاند. اینجاست که باید سراغ ابزارهای مدیریت و نظارت رایانش ابری را بگیرید.
ابزارهایی مانند Docker Swarm, Kubernetes و Mesosphere در این زمینه گزینههای خوبی بهنظر میرسند و تجربه نشان داده است در بین این ابزارها Kubernetes قابلیتهای بیشتری دارد.
با اطلاحات کلیدی در داکر آشنا شوید
موقع تحقیق درباره داکر یا استفاده کردن از آن، ممکن است با کلماتی برخورد کنید که شاید در ابتدا کمی برایتان گنگ باشند. در این بخش این اصلاحات را توضیح میدهیم.
Docker Hub
یک مخزن یا منبع است که توسط Docker راهاندازی شده. تیمها میتوانند با استفاده از داکر هاب به جستجو Container Image ها بپردازد یا آنها را با یکدیگر، مشتریان یا اعضای داکر هاب به اشتراک بگذارند.
Image
تصویر داکر یا Docker Image یک فایل باینری است که تمام موارد لازم برای اجرای یک کانتینر را دربرمیگیرد. یک Image شامل همه چیزهایی است که برای اجرای یک برنامه مورد نیاز است؛ از جمله کد اجرایی برنامه، هر نرمافزاری که برنامه به آن وابستگی دارد و هرگونه تنظیمات پیکربندی مورد نیاز.
شما میتوانید Image های دلخواه خودتان را با استفاده از Dockerfile بسازید یا از تصاویری استفاده کنید که توسط دیگران ساخته شده و سپس در Docker Hub به اشتراک گذاشته شده است.
برای ساختن تصویر از Dockerfile از دستور build docker استفاده میشود.
برای اجرای Image در یک کانتینر از دستور docker run استفاده میشود.
Container
نمونهای از یک تصویر در زمان اجرا است.
بهطور معمول، یک کانتینر کاملاً از محیط میزبان جدا شده و فقط زمانی به پروندهها و پورتهای میزبان دسترسی پیدا میکند که برای این کار پیکربندی شده باشد.
برای اجرای Image در یک کانتینر از دستور docker run استفاده میشود.
Dockerfile
یک سند متنی، حاوی دستورات (Commands) لازم برای ساختن Docker Image است.
این دستورات از سطح مبتدی (کپی کردن فایلها از یک دایرکتوری به دایرکتوری دیگر) تا پیچیده (تعین یک Image بهعنوان عنصر ثابت) را در برمیگیرند. به عنوان مثال،شما میتوانید یک Dockerfile ایجاد کنید که از تصویر ubuntu به عنوان پایه استفاده میکند؛ اما همزمان وب سرور Apache، برنامه شما و سایر موارد موردنیاز پیکربندی را نصب میکند.
آموزش نصب داکر بر روی ویندوز را نیز میتوانید در وبلاگ ایرانسرور بخوانید.
Docker Store
داکر استور هم مشابه داکر هاب است؛ ولی Image های موجود در Docker Store را نهادهای تجاریِ تایید شده توسط Docker ارائه میکنند.
سخن پایانی
همانگونه که در بالا هم اشاره شد داکر اجازه اجرای اپلیکیشنهای بیشتری را نسبت به سایر تکنولوژیها با یک سختافزار مشخص میدهد و این امر ساخت و مدیریت اپلیکیشنها را سادهتر میکند.
در پایان پیشنهاد میکنیم اگر شما هم به فناوریهای جدید علاقه دارید و تاکنون از داکر استفاده کردهاید. در قسمت نظرات ما و سایر کاربران را در جریان تجربههای مفید خود قرار دهید. در صورتی هم که دوست دارید بیشتر مطالعه کنید، پیشنهاد میکنیم مقاله ردیس (Redis) چیست؟ را بخوانید.
منابع کمکی [zdnet.com] و [Microfocus.com]