داکر یک پلتفرم نرم افزاری برای ساخت اپلیکیشنهای مبتنی بر Container است. محیطهای اجرایی کوچک و\ سبک که به طور مشترک از هسته سیستم عامل استفاده میکنند اما در عین حال در یک محیط ایزوله و کاملا جدا از هم قرار دارند. هر چند مفهوم container یا نگهدارنده از مدتها قبل در حوزه IT مطرح بود اما داکر به عنوان یک پروژه متن باز در سال ۲۰۱۳ معرفی و عرضه شد. در واقع داکر باعث شد container جان تازه ای بگیرد و دوباره محبوب شود. توسعه نرم افزار به سمت استفاده از Container و میکرو سرویسها رفت و بعدها به عنوان توسعه ابری یا Cloud-native Development شناخته شد. شاید بعضی از مفاهیم که تا اینجا گفته شد را نشناسید اما اصلا نگران نباشید چون تمام این موارد را تا انتهای مطلب با هم مرور خواهیم کرد و در پایان متوجه خواهیم شد که داکر چیست و چه کاربردهایی دارد.
یکی از اهدافی که سیستمهای جدید توسعه نرم افزار دنبال میکنند، این است که برنامهها در یک محیط، اما به صورت ایزوله و جدا از هم نگهداری شوند. به این ترتیب فعالیت آنها بر روی یکدیگر تاثیر نداشته و جدا از هم کار میکنند. البته اجرای این فرآیند به خاطر استفاده از پکیج ها، کتابخانهها و دیگر کامپونتتهای نرم افزاری میتواند پیچیده شود.
یکی از راههای پیاده کردن این تکنولوژی استفاده از ماشین مجازی (Virtual Machine) است که برنامهها را روی یک سخت افزار اما کاملا جدا از هم نگه میدارد. پس در این حالت کامپوننتهای ما تداخل خاصی با هم نداشته و رقابت برای استفاده از منابع سخت افزاری هم به حداقل میرسد. اما ماشینهای مجازی مشکلاتی هم دارند. اول از همه اینکه نرم افزارهای سنگینی بوده و سخت افزار نسبتا قدرتمندی میخواهند. همینطور هر برنامه نیاز به سیستم عامل جداگانه دارد که ممکن است این سیستم عاملها حجمهای چند گیگابایتی داشته باشند. و اینکه ممکن است نگهداری و بروزرسانی آنها دشوار شود.
در مقابلContainer قرار دارد که میتواند جایگزین مناسبی برای ماشینهای مجازی باشد. Container محیطهای اجرایی را جدا کرده و هسته سیستم عامل را به اشتراک میگذارد. حجم آنها معمولا به مگابایت بوده و نسبت به ماشینهای مجازی از منابع کمتری استفاده میکند. همینطور برخلاف ماشینهای مجازی که برای اجرا نیاز به زمان نسبتا زیادی دارند، Containerها بلافاصله اجرا میشوند.
زمانی که Container را با ماشین مجازی مقایسه میکنیم یعنی با یک شبیه ساز طرف حساب هستیم. اما دقیقا چه چیزی را شبیه سازی میکنیم؟ برای درک بهتر موضوع بهتر است از یک مثال استفاده کنیم. فرض کنید در شرکتی مشغول به کار هستید و ناهار خود را هر روز در خانه درست کرده و آن را داخل یک ظرف به شرکت میبرید تا آنجا میل بفرمایید. دیگر لازم نیست داخل شرکت شروع به پختن غذا کنید چون احتمالا زمان زیادی را از شما میگیرد. کار Container هم تا حدودی شبیه به این است. شما پروژه خود را (غذا) داخل Container (ظرف غذا) قرار داده و آن را هر کجا که دوست داشتید (مثلا شرکت) میبرید.
داکر یک پروژه متن باز است که اجازه میدهد Container یا برنامههای مبتنی بر Container بسازید. با اینکه داکر در شروع کار برای لینوکس ساخته شد اما امروزه به خوبی در ویندوز وMacOS هم اجرا میشود. برای ساخت یک برنامه با داکر باید از کامپوننتهای مختلفی استفاده کنیم. حالا برای درک بهتر مفهوم داکر بهتر است سراغ این کامپوننتها رفته و آنها را بررسی کنیم:
هرContainer داکر با یک فایل داکر شروع به کار میکند. Dockerfile یک فایل متنی بوده که داخل آن با یک سینتکس ساده و قابل فهم دستورالعملهای ساخت Docker Image قرار داده شده است (کمی جلوتر این مفهوم را بررسی خواهیم کرد) این فایل اطلاعات بسیار مهمی را در برمی گیرد که برای راه اندازی داکر استفاده از آنها ضروری است. در واقع Dockerfile مشخص میکند که پشتContainer ما چه سیستم عاملی قرار بگیرد، همینطور از چه زبان ها، متغیرهای محلی، پورتهای شبکه یا غیره استفاده شود. و مهمتر از همه اینکه مشخص کندContainer ما بعد از اینکه واقعا اجرا شد قرار است چه کاری انجام دهد.
در واقع زمانی که کار نوشتن Dockerfile را تمام کردید، یک قابلیت به اسم Docker Build را فراخوانی میکنید که وظیفه دارد یک Image بر اساس محتویات Dockerfile شما بسازد. Dockerfile شامل یک سری دستورالعمل برای ساختن یکImage است، در حالی که Docker Image یک فایل قابل حمل است که شامل یک سری دستورالعمل بوده که مشخص میکندContainer کدام کامپوننتهای نرم افزاری را اجرا کند و اینکه چطور آنها اجرا شوند. به احتمال زیاد Dockerfile بخواهد تعدادی فایل را از مخزنهای مختلف (Repository) دانلود کند و اینجا باید به طور واضح مشخص کنید که کدام نسخهها دریافت شوند. همینطورImage ساخته شده استاتیک میباشد، یعنی یک بار ساختن آن کافی بوده و نیازی به تغییر آن ندارید. همانطور که از اسم آنها میتوانید حدس بزنید، Image یک تصویر از سیستم عامل اصلی میباشد.
قابلیت Docker run در واقع یک دستور است کهContainer را راه اندازی میکند. میدانیم که هرContainer یک instance یا نمونه ازImage است و ماهیت Container به صورت موقتی میباشد. اما با این حال میتوان آنها را متوقف (Stop) یا راه اندازی مجدد (Restart) کرد. هرImage میتواند تعداد زیادی Container داشته باشد (تا زمانی که هر کدام نام منحصر به فردی داشته باشند)
هر چند ساختContainerها کار راحتی است، اما لزومی ندارد برای هرImage از اول Container بسازید. Docker Hub یک مخزنSaas برای به اشتراک گذاری و مدیریتContainerها است. در آنجا میتوانیدImageهای رسمی داکر که معمولا به صورت متن باز هستند را پیدا کنید. همینطور عموم مردم هم پروژههای خود را به اینRepository اضافه میکنند.
مغز متفکر و هسته اصلی داکر به حساب میآید. یک تکنولوژی کلاینت/سرور که Containerها را ساخته و آنها را اجرا میکند. در واقع اگر کسی درباره داکر صحبت کرده و منظورش شرکت داکر یا پروژه داکر نباشد، یعنی دارد درباره Docker Engine حرف میزند. این موتور در دو نسخه Enterprise یاCommunity عرضه میشود. نسخه Community به طور متن باز و کاملا رایگان قابل استفاده است در حالی که نسخه Enterprise یک سری قابلیتهای اضافه داشته و سالانه برای هر Node نزدیک به 1500 دلار هزینه دارد.
تمام این نکات را گفتیم تا به این بخش رسیده و بفهمیم داکر چیست و چطور کار میکند. داکر را میتوانیم یک مجازی ساز در نظر بگیریم، اما نه به شکلی که ماشینهای مجازی کار میکنند. این سرویس به شما کمک میکند یک محیط را به چند بخش تقسیم کرده و و در هر بخش یک برنامه مجزا اجرا کنید. برای درک بهتر موضوع یک لحظه داکر را شبیه به ماشین مجازی در نظر بگیرید، میدانیم که ماشینهای مجازی با Hypervisor عملیات شبیه سازی را انجام میدهند اما در داکر این لایه حذف شده و ما مستقیم با هسته سیستم عامل کار میکنیم. این کار بازدهی سیستم را بسیار بالا میبرد.
ما به جای اینکه چند سیستم عامل را داخل یک شبیه ساز نصب کنیم یک بار داکر را نصب میکنیم. این فرآیند را شبیه به نصب یک نرم افزار عادی در نظر بگیرید. بعد داکر محیطهای مستقلی به نام Container ایجاد میکند که هر Container میتواند شامل بستههای نرم افزاری مختلفی باشد. حالا میتوانید داخل داکرContainerهای مختلفی ایجاد کنید و پروژههای خود را به طور مستقل روی هر کدام اجرا نمایید.
داکر یک ابزار اوپن سورس برای طراحی و ساخت برنامهها به کمکContainer است. Container به برنامه نویس کمک میکند که پروژه خود را با تمام بخش هایی که دارد (مثل کتابخانه ها، وابستگیها و غیره) به صورت یک پکیج دربیاورد. به لطف این تکنیک، برنامه نویس خیالش راحت است که برنامه او میتواند در سیستمهای دیگر بدون نیاز به تنظیمات خاص یا ابزارهای جانبی اجرا شود. داکر را شبیه به ماشین مجازی در نظر بگیرید، با این تفاوت که بازدهی بسیار بالاتری دارد.