مقدمه
امروزه اکثر شرکتهای نرمافزاری به نحوی از container ها استفاده میکنند. تعداد نرمافزارهایی که برای اجرا نیاز به تکنولوژیهای کانتینر دارند روز به روز بیشتر میشود و کمتر برنامهنویسی هست که اسم docker به گوشش نخورده باشه. این جا به معرفی containerization و docker میپردازیم و برخی از ابزارهای معروف این حوزه را بررسی میکنیم.
معرفی Container و مزایای آن:
فناوری کانتینر در سال 1979 با یونیکس 7 و chroot system پدید آمد. سیستم chroot میتوانست محیطی ایزوله برای یک پردازش و زیرپردازشهای مرتبط با آن بر روی سیستم فراهم کند.
کانتینر در معنای عمومی به جعبه هایی گفته میشه که کالاهارو برای جابجایی هوایی یا دریایی یا ... در داخل اون قرار میدن تا به صورت یکپارچه دربیان و حمل و نقل شون راحت تر باشه و راحت روی همدیگه قرار بگیرن و چیدمان مناسبی داشته باشن. اما در دنیای کامپیوتر چطور معنا میشه؟ در دنیای کامپیوتر به مجموعه ای مستقل و ایزوله از فایل های اجرایی برنامه، کتابخانه های مورد نیازش و هر چیزی که برای اجرا نیاز داره و قابل جابجایی و اجراست و مثل یک جعبه سربسته هست کانتینر میگن. در واقع یک نوع مجازی سازی در سطح سیستم عامل هست. یک محیط ایزوله از سیستم عامل به نام کانتینر در اختیار برنامه قرار میگیره که در ادامه قراره در مورد مزیت هاش صحبت کنیم. گفتیم که در دنیای واقعی از کانتینر برای جابجایی راحت استفاده میشه پس در دنیای کامپیوتر هم مهم ترین ویژگیش قابل انتقال بودن وسادگی اون هست برای مثال اگه یکی از سرورها خراب شه یا به مشکل بخوره ما باید بتونیم به راحتی و با سرعت برنامه رو در سرور دیگه ای اجرا کنیم، اگه لازم باشه تنظیمات زیادی انجام بشه یا نیازمندی های زیادی برطرف بشه خیلی زمانبر خواهد بود پس خوبه که نرم افزارو با تمام متعلقاتش به صورت سازگار داشته باشیم. از مزیت های دیگۀ کانتینر میشه به کاهش احتمال رخ دادن خطا اشاره کرد، مثلا سیستم تمام دولوپرها ممکنه از نظر سیستم عامل و کتابخانه های نصب شده یا حتی نسخۀ ابزارهای مورد نیاز با سرور محیط عملیاتی سازگار نباشه و موقع اجرا به مشکل و خطا بخوریم ولی با وجود کانتینر و ایزوله شدنش این اتفاق نمی افته(شباهت محیط اجرا و محیط توسعه نرم افزار). مزیت بعدی در مورد امنیت هست اینکه اگر بخشی دچار بحث امنیتی شد آیا باید روی بقیه هم تاثیر بزاره؟ اگرتا حد امکان کوچک و ایزوله باشن این مشکل به وجود نمیاد.
برخلاف VM که مجازیسازی سختافزار را فراهم میکند، یک کانتینر مجازیسازی در سطح سیستم عامل را با انتزاع فضای کاربر فراهم میکند.
برای همه مقاصد، کانتینرها شبیه ماشین مجازی هستند. به عنوان مثال، آنها فضای خصوصی برای پردازش دارند، می توانند دستورات را به صورت root اجرا کنند، دارای یک رابط شبکه خصوصی و آدرس IP هستند، مسیرهای سفارشی و قوانین iptables را مجاز می کنند، می توانند سیستم های فایل را نصب کنند و غیره. یک تفاوت بزرگ بین کانتینرها و ماشین های مجازی این است که کانتینرها هسته سیستم میزبان را با سایر کانتینرها به اشتراک می گذارند.
به طور خلاصه:
کار کانتینرها عبارت است از جداسازی یک برنامه کاربردی و وابستگی های آن در یک واحد مستقل که می تواند در هر جایی اجرا شود.
علاوه بر این، کانتینرها نیاز به سختافزار فیزیکی را از بین میبرند و امکان استفاده کارآمدتر از منابع محاسباتی را، هم از نظر مصرف انرژی و هم از نظر اثربخشی هزینه، فراهم میکنند.
داکر:
با اینکه فناوری کانتینر و ابزارهای ایزولهسازی در دهه اول قرن 21 پیشرفتهای چشمگیری داشته ولی این داکر بود که ورق را برگردوند. در سال 2010 سالامون هایکس و سباستین پال، بنیانگذاران شرکت Dot Cloud، کار ساخت داکر را شروع کردند و در سال 2011 داکر رسماً در پروژههای این شرکت استفاده شد.
اگر یک برنامه نویس یا متخصص هستید، به احتمال زیاد حداقل نام Docker را شنیدید. ابزاری مفید برای بسته بندی، جابجایی و اجرای برنامه ها در "کانتینرها".
داکر یکی از معروفترین ابزارهای تولید و اجرای کانتینر است. قبل از داکر تکنولوژیهای مختلفی برای Containerazion وجود داشت اما داکر اولین ابزاری بود که امکان جابجایی کانتینرها بر روی سیستمهای مختلف را به راحتی فراهم کرد. همچنین داکر فرایند ساخت کانتینر را بسیار سادهتر کرد و همهی اینها باعث موفقیت چشمگیر داکر شد. تا حدی که خیلیا کانتینرها رو با داکر میشناسن.
تکنولوژی زیرساخت داکر:
داکر با زبان برنامهنویسی Go طراحی شده و از مزایای کرنل لینوکس برای فعالیت استفاده میکنه. همچنین داکر از یک تکنولوژي تحت عنوان namespaces برای ایجاد فضاهای کاری ایزوله شده تحت عنوان کانتینر استفاده میکنه. زمانی که یک کانتینر اجرا کنید، داکر مجموعهای از Namespaceهای مختلف را برای آن کانتینر ایجاد میکنه. این Namespaceها لایهای از ایزولاسیون را در اختیار شما قرار میدن.
مزیت داکر نسبت به ماشین مجازی:
تصویر زیر را در نظر بگیرید. یک سیستم با 16 گیگ رم در دسترس است و باید 3 ماشین مجازی روی آن اجرا بشه. برای اجرای موازی ماشینهای مجازی، باید RAM بین ماشینهای مجازی تقسیم بشه. فرض کنید تخصیص به شکل زیر باشه:
6 گیگابایت رم به اولین ماشین مجازی ،4 گیگابایت رم به ماشین مجازی دوم و6 گیگابایت به ماشین مجازی سوم.
در این صورت، دیگر فضای RAMباقی نمیماند، اگر استفاده از آن به صورت زیر باشه:
اولین ماشین مجازی فقط از 4 گیگابایت رم استفاده کند ==> 2 گیگابایت استفاده نشده و مسدود شده
ماشین مجازی دوم فقط از 3 گیگابایت رم استفاده کند ==> 1 گیگابایت استفاده نشده و مسدود شده
ماشین مجازی سوم فقط از 2 گیگابایت رم استفاده کند ==> 4 گیگابایت استفاده نشده و مسدود شده
بنابراین در کل 7 گیگابایت (2 گیگابایت + 1 گیگابایت + 4 گیگابایت) رم هدر خواهد رفت و نمیشه یک ماشین مجازی جدید راه اندازی کرد و این یک مشکل اساسی است .
چگونه می توانم از این مشکل جلوگیری کرد؟
اگر از Docker استفاده بشه، CPU دقیقاً مقدار حافظه مورد نیاز Container را اختصاص می ده.
ظرف اول فقط از 4 گیگابایت رم استفاده می کند ==> 0 گیگابایت استفاده نشده و مسدود شده
ظرف دوم فقط از 3 گیگابایت رم استفاده می کند==> 0 گیگابایت استفاده نشده و مسدود شده
ظرف سوم فقط از 2 گیگابایت رم استفاده می کند ==> 0 گیگابایت استفاده نشده و مسدود شده
از آنجایی که هیچ حافظه اختصاصی (RAM) استفاده نشده ای وجود ندارد، با استفاده از Docker Container، 7 گیگابایت (4 – 3 – 2) رم ذخیره خواهد شد.
دلایل افزایش استفاده از داکر(مزیت ها):
با استفاده از کانتینرهای داکر میشه کدهای بیشتری را روی یک سرور اجرا کرد که باعث صرفه جویی در هزینهها میشه
2.سرعت:
داکرها بسیار سریع هستند. از آنجایی که کانتینرها فقط محیط سندباکس(محیط سندباکس یک فضای مجازی است که در آن کدهای کامپیوتری به صورت مجزا و بدون تأثیر بر شبکه اطراف یا برنامه های کاربردی آن اجرا می شود) هستند که روی هسته اجرا می شوند، منابع کمتری را اشغال می کنند. شما می توانید ظرف چند ثانیه داکر را ایجاد و اجرا کنید در حالی که ماشین های مجازی ممکنه بیشتر طول بکشه چون هر بار باید یک سیستم عامل مجازی کامل را راه اندازی بشه.
3.لایبرریهای مشترک:
کاربر میتونه به رجیستریهای متن باز که شامل هزاران کانتینر از قبل طراحی شده هستش دسترسی داشته باشه.
4. ماژولار بودن و مقیاس پذیری:
داکر به راحتی میتونه عملکرد برنامه شما را در کانتینرهای جداگانه تقسیم کنه. برای مثال، ممکنه که پایگاه داده Postgres شما در یک کانتینر و سرور Redis شما در کانتینر دیگه اجرا بشه و همچنین برنامه Node.js شما در کانتینر دیگه ای باشه. با Docker، ربط دادن این کانتینرها به یکدیگر برای ایجاد برنامهتان آسانتر میشه و در آینده بهروزرسانی مستقل اجزا را آسانتر میکنه.
معایب داکر:
1. مشکلات مربوط به مستندات
داکر بهسرعت در حال رشد و پیشرفت است و دائما بهروزرسانی میشود. همین مسئله باعث شده تا شکافی بین مستندات آن و تغییرات و بهروزرسانیهای آن پیش بیاد. با اینکه همین حالا هم مستندات فنی خوبی از docker وجود داره ولی به نظر میرسه هنوز در بعضی از جاها مثل کار با داکر بر روی مک یا ویندوز مشکلاتی از نظر مستندات فنی وجود داشته باشه.
2.مشکلات عملکردی در محیطهای غیربومی
با اینکه مک بر پایه لایه یونیکسی بومی قرار داره، docker برای اینکه عملیاتهایش را انجام بده همچنان به کرنل لینوکسی واقعی نیاز داره. برای کار با داکر بر روی مک کاری که میشه انجام داد اینه که ماشین مجازی حاوی کرنل درست کرد. در این حالت بهجای اینکه با این کرنل تعامل مستقیم وجود داشته باشه با کانتیرهای درون VM تعامل اتفاق میفته.
3.مسائل مربوط به یادگیری کار با داکر
یادگیری کار با داکر میتواند زمان بر باشه. مفاهیم بسیار زیادی در این حوزه وجود داره که فرد باید با آن آشنایی داشته باشه. حتی تفکیک بعصی از مفاهیم با مفاهیم ماشین مجازی ممکنه که سخت باشه.
اجزایی که برای ایجاد برنامههای حاوی Docker استفاده میشه:
1. Docker file:
به طور کلی داکر فایل یک فایل متنیه که با الگوی خاصی نوشته میشه تا با استفاده از آن بتونیم ایمیجهای داکر خودمون رو بسازیم و توی داکرهای خودمون به صورت اتوماتیک استفاده کنیم تا درخواست ما از یک داکر برآورده بشه.
هر کانتینر داکر با یک Docker file شروع میشه Docker file یک فایل متنیه که به صورت ساده و قابل فهم نوشته شده و شامل دستورالعملهای ساختDocker Image میشه.
در واقع Docker file نوع سیستم عامل را مشخص میکنه و نشون میده که توی سیستم عامل چه زبانها، متغیرهای محیطی، مکان فایلها، پورتهای شبکه و… استفاده بشه. جدا از اینها، داکرفایل تعیین میکنه که پس از اینکه کانتینر اجرا شد، چه کارهایی را باید انجام بده.
2. Docker image
هنگامی کهDocker file را نوشتید، قابلیتی به نام Docker Build را فراخوانی میکنید. این قابلیت وظیفه داره که یک Image بر اساس محتویاتDocker file شما بسازه. داکرفایل حاوی یک سری دستورالعمل برای ساختن یکImage است، در حالی که Docker Image یک فایل قابل حمله که یک سری دستورالعمل داره و مشخص میکنه که کانتینر، کدام کامپوننتهای نرم افزاری را اجرا کنه و این اجرا چطور باشه.
3. Docker run
این کامپوننت در واقع یک ابزار دستوریه که یک کانتینر را راهاندازی میکنه. هر کانتینر، نمونهای از یک تصویره و کانتینرها بهصورت گذرا و موقتی طراحی شدن اما میشه آنها رو متوقف و دوباره راهاندازی کرد. همچنین، چندین نمونه کانتینر از یک تصویر به طور همزمان میشه اجرا کرد (به شرطی که هر کانتینر یک نام خاص داشته باشه).
4. Docker Hub
ساخت کانتینرها کار بسیار راحتیه Docker Hub یک مخزن SaaS برای به اشتراکگذاری و مدیریت کانتینرها در اختیار شما قرار میده. در این قسمت میتونید ایمیجهای رسمی داکر که در اغلب اوقات به صورتOpen source هستند را پیدا کنید. همچنین میتوانید ایمیجهای کانتینر حاوی کدهای مفید را دانلود کنید یا آنها را به صورت آزادانه به اشتراک بگذارید.
5. Docker Engine
موتور داکر هم مثل موتور ماشین، مهمترین بخش داکره. در واقع Docker Engine هسته اصلی داکر و مغز داکره.
یک فناوری کلاینت – سرور که کانتینرها را ایجاد و اجرا میکنه. به طور کلی، وقتی کسی درباره داکر حرف میزنه، در مورد شرکت یا پروژه کلی صحبت نمیکنه، منظورش همین Docker Engine است. دو نسخه مختلف ازDocker Engine در دسترسه Docker Engine Enterprise و Docker Engine Community
شرکتهای ایرانی که سرویس داکر ارائه میکنند:
چابکان، میزبان پایتخت و زیرساخت ابری هایو، از جمله شرکت های ابری هستند که خدمات داکر و کانتینر ارائه میدهند.
منابع:
https://hamravesh.com/blog/what-is-docker/
https://www.ibm.com/topics/containerization
https://docker.ir/articles/what-is-docker/
https://www.edureka.co/blog/what-is-docker-container
https://www.analyticsvidhya.com/blog/2022/06/writing-dockerfile-is-simple/
https://parspack.com/blog/hosting/docker-tutorial/kubernetes-vs-docker
«این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است»