داکر (Docker) یک بستر اوپنسورس برای ساخت، استقرار و مدیریت برنامههای کانتینرشده (Containerized) است. در این مقاله در مورد کانتینرها، شباهتها و تفاوتهای آنها با ماشینهای مجازی (Virtual Machines) میآموزید و دلیل محبوبیت داکر را درمییابید.
داکر چیست؟
داکر یک پلتفرم اوپنسورس برای ساختن کانتینر است. برنامهنویسان میتوانند با استفاده از داکر اپلیکیشنهای خود را در قالب کانتینرها سازماندهی کنند. کانتینرها اجزای استانداردشدهی قابل اجرایی هستند که سورسکد برنامه را با پیشنیازهای (Dependencies) اجرای کد در هر محیطی ترکیب، و اجرای این برنامههای توزیع شده را ساده میکنند. با تغییر جهت سازمانها به سمت توسعه اپلیکیشنهای Cloud-Native و محیطهای چند-ابری، استفاده از داکر نیز رواج یافته است.
با این که برنامهنویسان میتوانند کانتینرها را بدون استفاده از داکر نیز بسازند، ولی استفاده از داکر فرایند ساخت و مدیریت کانتینرها را سادهتر و امنتر میکند. در واقع داکر ابزاری اساسی برای برنامهنویسان است تا بتوانند با فرمانهای ساده و سرراست و با استفاده از یک API واحد، کانتینرهای مورد نظر خود را بسازند، اجرا و بهروزرسانی و یا متوقف کنند.
نام «داکر» برای شرکت داکر (Docker, Inc.) نیز به کار میرود که نسخهی تجاری داکر را میفروشد. در عین حال نام پروژهای اوپنسورس نیز هست که شرکت داکر به همراه سایر سازمانها و افراد در آن مشارکت فعال دارند.
کانتینرها چگونه کار میکنند و چرا تا این اندازه محبوبند؟
امکان ایجاد کانتینرها به لطف قابلیت ایزولهکردن پروسسها و قابلیتهای مجازیسازی موجود در کرنل لینوکس فراهم شده است. این قابلیتها – مثلا گروههای کنترل (Control groups) برای تخصیص و تقسیم منابع میان پروسسها، و استفاده از namespace ها برای محدودکردن امکان دسترسی یا نمایش یک پروسس برای منابع یا بخشهای دیگر سیستم – اجازه میدهند چندین اپلیکیشن از منابع موجود در یک میزبان (Host) مشترک استفاده کنند؛ همانطور که یک hypervisor اجازه میدهد چند ماشین مجازی به یک CPU، حافظه و سایر منابع یک سرور سختافزاری دسترسی داشته باشند.
در نتیجه، استفاده از فناوری کانتینر تمام مزایا و قابلیتهای ماشینهای مجازی مانند ایزوله کردن اپلیکیشن، مقیاسپذیری مقرونبهصرفه و حذف راحت اپلیکیشنهای معیوب و جایگزینی بیدردسر با نسخههای سالم را در اختیار ما قرار میدهد. افزون بر این:
- کانتینرها سبکترند: برخلاف ماشینهای مجازی، کانتینرها به اندازه سیستمعاملها سنگین نیستند. کانتینرها صرفا پیشنیازها و کامپوننتهای ضروری برای اجرای کد را با خود دارند. اندازه کانتینرها در حجم مگابایت است (در مقایسه با حجم گیگابایتی ماشینهای مجازی) در نتیجه سختافزار راحتتر کار میکند و سرعت راهاندازی برنامهها بالاتر میرود.
- کانتینرها در استفاده از منابع بهینهترند: با استفاده از کانتینرها، همانند ماشینهای مجازی، میتوانید هر تعداد کپی از نرمافزارها را هر چند بار که میخواهید، روی سختافزار اجرا کنید. این قابلیت میزان استفاده از فضای ابری را کاهش میدهد.
- افزایش بهرهوری برنامهنویس: استقرار، فراهمسازی منابع و راهاندازی مجدد کانتینرها در مقایسه با ماشینهای مجازی سریعتر و راحتتر است. این ویژگی کانتینرها را به گزینهای ایدهآل برای استفاده در خط لولههای CI/CD تبدیل میکند. به همین خاطر است که داکر برای تیمهای توسعهای که در چارچوب Agile کار میکنند و فرهنگ DevOps را به کار گرفتهاند، جذابیت زیادی دارد.
شرکتهایی که از کانتینرها استفاده میکنند، مزایای دیگری از جمله بهبود کیفیت اپلیکیشنها، امکان پاسخگویی سریعتر به تغییرات بازار و موارد زیاد دیگری از این دست را نیز گزارش کردهاند.
چرا از داکر استفاده کنیم؟
امروزه استفاده از داکر به قدری متداول شده است که خیلی اوقات کلمات «داکر» و «کانتینر» به جای هم به کار میروند. ولی استفاده از تکنولوژیهایی که داکر بر مبنای آنها ساخته شده، به سالها و حتی دهه ها قبل از استفاده گسترده از داکر برمیگردد.
در سال 2008، LinuxContainers (LXC) در کرنل لینوکس به صورت کامل اجرا شد و امکان مجازیسازی روی لینوکس را فراهم کرد. با این که همچنان از LXC استفاده میشود، ولی تکنولوژیهای جدیدتری که از کرنل لینوکس استفاده میکنند نیز به وجود آمدهاند. مثلا Ubuntu که یک سیستمعامل مدرن و اوپنسورس لینوکسی است نیز این قابلیت را فراهم میکند.
داکر با اضافه کردن تکنولوژیهایی قابلیت ایجاد کانتینر برای لینوکس را فراهم میکند. این تکنولوژیها مزایای زیادی برای تیمهای توسعه دارند؛ از جمله:
- تطابق بهتر و بیدردسر با بسترهای گوناگون: درحالی که برای استفاده از کانتینرهای LXC معمولا به شرایط خاصی نیاز است که به دستگاه بستگی دارند، کانتینرهای داکر بدون نیاز به شرایط خاصی در سیستمها، دیتاسنترها و فضاهای ابری مختلف اجرا میشوند.
- حجم کمتر و بهروزرسانیهای ساختارمند: با استفاده از LXC، چندین پروسس میتوانند در یک کانتینر ترکیب شوند. با استفاده از کانتینرهای داکر، فقط یک پروسس در هر کانتینر اجرا میشود. به واسطهی این ویژگی وقتی برخی از قسمتهای یک اپلیکیشن دچار مشکل میشوند یا تحت تعمیر یا به روزرسانی قرار میگیرند، بقیهی قسمتها بدون هیچ مشکلی به کار خود ادامه میدهند.
- تولید خودکار کانتینر: داکر میتواند به صورت خودکار و از روی سورسکد اپلیکیشن، کانتینر بسازد.
- نسخهبندی: داکر این قابلیت را به ما میدهد که تمامی نسخههای یک ایمیج داکر را ردیابی کرده و یا حتی نسخههای قبلی را بازیابی کنیم و بفهمیم هر نسخه را چه کسی و چطور بهروز کرده است. با استفاده از این بستر میتوان نسخهی جدید را بر کانتینر موجود ایجاد کرد.
- استفاده مجدد از کانتینر: کانتینرهای موجود میتوانند به عنوان قالبی برای ایجاد کانتینرهای جدید استفاده شوند.
- استفاده از کتابخانههای مشترک کانتینرها: برنامهنویسان میتوانند به رجیستری اوپنسورس داکر دسترسی داشته باشند؛ این رجیستری حاوی هزاران کانتینر است که توسط کاربران این بستر و به صورت داوطلبانه توسعه داده شدهاند.
امروزه استفاده از داکر برای ساخت کانتینر، حتی در سرورهای ویندوزی نیز رواج پیدا کرده است. اکثر تامینکنندگان سرویسهای ابری نیز خدمات ویژهای را برای ساخت و اجرای برنامههای کانتینرشده با داکر به برنامهنویسان ارائه میدهند. همین مزیتهاست که باعث شده استفاده از داکر به شدت رواج یابد. شرکت داکر در گزارشی استفاده یازده میلیون برنامهنویس از این بستر و دانلود 13 میلیارد کانتینر را در هر ماه ثبت کرده است.
جعبه ابزار داکر
بعضی از ابزارها و مفاهیمی که هنگام استفاده از داکر به آن برمیخورید، عبارتند از:
داکر فایل (DockerFile)
هر کانتینر داکر با یک فایل متنی ساده شروع میشود که شامل دستورالعملهای ساخت image کانتینر داکر است. داکرفایل فرایند ساخت image داکر را به صورت خودکار درمیآورد. اساسا داکرفایل لیستی از دستورات خط فرمان است که موتور داکر آنها را اجرا میکند و از این طریق image را میسازد.
ایمیج داکر (Docker Images)
ایمیج داکر شامل سورسکد برنامههای قابل اجرا و همچنین کتابخانهها، ابزارها و پیشنیازهایی (Dependencies) است که برنامه برای اجرا شدن به آنها نیاز دارد. هنگامی که شما ایمیج داکر را اجرا میکنید، این ایمیج تبدیل به یک نمونه (instance) از کانتینر میشود.
با اینکه میتوان یک ایمیج داکر را از صفر ساخت، اما اکثر برنامهنویسان ایمیجها را از مخازن اشتراکی دریافت میکنند. از یک ایمیج پایه، میتوان چندین ایمیج داکر تولید کرد، و در این ایمیجها، استک تکنولوژی استفادهشده در ایمیج پایه یکسان خواهد بود.
هر ایمیج داکر از چندین لایه یا Layer تشکیل شده است و هر لایه مربوط به یک نسخه از ایمیج است. هر زمان که برنامهنویس تغییری در ایمیج ایجاد کند، یک لایه روی لایههای قبلی ایجاد میشود و نسخهی ایمیج را تغییر میدهد. لایههای قبلی برای بازگشت به نسخههای قبلی یا استفاده مجدد در پروژه های دیگر ذخیره میشوند.
هر بار که یک کانتینر از یک ایمیج داکر ایجاد میشود، یک لایه جدید دیگر به نام لایه کانتینر ایجاد میشود. تغییرات ایجاد شده در کانتینر- مانند افزودن یا حذف فایلها- فقط در لایه کانتینر ذخیره میشوند و فقط در حین اجرای کانتینر وجود دارند. این فرایند ایجاد ایمیج تکراری باعث افزایش بهرهوری کلی میشود زیرا چندین نمونه (instance) از کانتینر در حال اجرا میتوانند فقط از یک ایمیج پایه اجرا شوند، و هنگامی که این کار را انجام میدهند، از یک استک مشترک استفاده میکنند.
کانتینرهای داکر
کانتینرهای داکر نمونهها یا instance های در حال اجرا از ایمیج داکر هستند. فایلهای ایمیج داکر صرفاً قابل خواندن (Read-Only) هستند، اما کانتینرهای داکر قابلیت اجرا دارند، کاربران میتوانند با آنها تعامل داشته باشند و ادمینها میتوانند تنظیمات و شرایط خود را با استفاده از دستورات داکر روی آنها اعمال کنند.
داکر هاب (Docker Hub)
داکرهاب یک ریپازیتوری عمومی از ایمیجهای داکر است که خود را «بزرگترین کتابخانه و کامیونیتی جهان برای ایمیجهای کانتینر» مینامد. این برنامه بیش از صد هزار ایمیج کانتینر را که از فروشندگان نرمافزارهای تجاری، پروژههای اوپنسورس و توسعهدهندگان مستقل تهیه شده است، در خود جای داده است. این رپیازیتوری در کنار هزاران ایمیج مختلف، ایمیجهایی را نیز در خود جای داده است که توسط شرکت داکر تایید شدهاند و متعلق به رجیستری قابل اطمینان داکر هستند.
تمام کاربران Docker Hub میتوانند ایمیجهای خود را روی این ریپازیتوری به دلخواه به اشتراک بگذارند. کاربران همچنین میتوانند ایمیجهای پایهی آماده را از فایلسیستم داکر بارگیری کنند و از آنها به عنوان نقطه شروع برای ایجاد کانتینرهای جدید استفاده کنند.
Docker Daemon
Docker daemon سرویسی است که روی سیستمعامل شما -مانند Microsoft Windows یا Apple MacOS- اجرا میشود. این سرویس با استفاده از دستورات کلاینت، ایمیجهای داکر شما را ایجاد و مدیریت میکند و در واقع به عنوان مرکز کنترل سیستم داکر شما عمل میکند.
Docker Registry
رجیستری داکر یک سیستم ذخیرهسازی و توزیع اوپنسورس و مقیاسپذیر برای ایمیجهای داکر است. رجیستری داکر به شما امکان میدهد که ایمیجها را برچسبگذاری کنید تا بتوانید آنها را به راحتی از یکدیگر تشخیص داده و نسخهی هر ایمیج را به آسانی دنبال کنید. این کار با استفاده از git، ابزار کنترل نسخه، انجام میشود.
استقرار (Deployment) و ارکستراسیون داکر
اگر فقط چند کانتینر (container) محدود دارید، مدیریت اپلیکیشنها در موتور داکر سادهتر است. اما اگر هزاران کانتینر و صدها سرویس دیپلوی کرده باشید، مدیریت آن بدون کمک این ابزارهای اختصاصی تقریباً غیرممکن است.
Docker Compose
اگر میخواهید از پروسسهای چندین کانتینر روی یک هاست، اپلیکیشنی تولید کنید، میتوانید از Docker Compose برای مدیریت معماری اپلیکیشن مورد نظر استفاده کنید.
Docker Compose یک فایل YAML تولید میکند. این فایل مشخص میکند کدام سرویسها در اپلیکیشن وجود دارند و میتوانند کانتینرها را با یک فرمان دیپلوی و اجرا کنند. با استفاده از Docker Compose میتوانید ظرفیت مشخصی را برای ذخیره و نگهداری تعریف کرده و نودهای اصلی (Base Nodes) و جزییات سرویس را مشخص و مستند کنید.
کوبرنتیس (Kubernetes)
برای مانیتور و مدیریت چرخه عمر کانتینرها در محیطهای پیچیدهتر، به ابزارهایی برای ارکستراسیون کانتینر نیاز دارید. با وجود اینکه داکر ابزار ارکستراسیون مخصوص به خودش را دارد (Docker Swarm) بیشتر توسعهدهندگان کوبرنتیس را ترجیح میدهند.
کوبرنتیس یک پلتفرم اوپنسورس مدیریت کانتینر است که در دل یکی از پروژههای داخلی گوگل تولید شده است. کوبرنتیس وظایف مرتبط با مدیریت معماریهای مبتنی بر کانتینر، از جمله استقرار کانتینر، بهروزرسانی، کشف سرویس (service discovery)، تأمین ظرفیت، لود بالانسینگ، مانیتورینگ عملکرد و موارد دیگر را زمانبندی میکند و به صورت خودکار درمیآورد. علاوه بر این، فضای اوپنسورس ابزارهای کوبرنتیس (ابزارهایی مثل Istio و Knative) امکان استقرار یک بستر به عنوان سرویس (PaaS) با بهرهوری بالا برای کانتینر کردن برنامهها و دسترسی سریعتر به تکنولوژی serverless computing را برای سازمانها فراهم میکند.
سلام من میخوام یک پروژه x-ui رو به عنوان ایمیج بسازم که همیشه بتونم ازش استفاده کنم ! متاسفانه این پروژه نسخه چینیش تو هاب هست و اینم هم نسخه ای که من میخوام لطفا راهنمایی کنید چطوری اینو بسازم!!!
bash <(curl -Ls https://raw.githubusercontent.com/NidukaAkalanka/x-ui-english/master/install.sh)
و این هم پیج اسکریپت
https://github.com/NidukaAkalanka/x-ui-english