در مسیر توسعه نرمافزار، یکی از رایجترین مشکلات این است که یک برنامه در یک محیط بهخوبی اجرا میشود اما در محیطی دیگر دچار خطا میشود. برنامهای که روی سیستم توسعهدهنده بدون مشکل کار میکند، ممکن است روی سرور، سیستم همکار یا محیط ابری اجرا نشود. دلیل این اتفاق معمولاً خود برنامه نیست، بلکه تفاوت در تنظیمات، وابستگیها و محیط اجراست.
داکر بهعنوان یک راهحل عملی برای این مشکل بهوجود آمده است. راهحلی که تمرکزش نه روی تغییر کد، بلکه روی یکسانسازی محیط اجرای نرمافزار است. به همین دلیل، داکر امروز به یکی از پایههای اصلی توسعه و استقرار نرمافزارهای مدرن تبدیل شده و در پروژههای کوچک تا سیستمهای بزرگ مقیاسپذیر مورد استفاده قرار میگیرد.
داکر چیست؟
داکر یک ابزار است که کمک میکند نرمافزارها را بهصورت قابلحمل و قابلاعتماد اجرا کنیم. بهجای اینکه یک برنامه برای اجرا به تنظیمات خاص هر سیستم وابسته باشد، داکر آن برنامه را بههمراه تمام چیزهایی که نیاز دارد، در یک واحد مستقل قرار میدهد؛ واحدی که «کانتینر» نام دارد.
کانتینر را میتوان مثل یک محیط اجرای آماده در نظر گرفت. داخل آن، خود برنامه وجود دارد، بههمراه کتابخانهها، تنظیمات و وابستگیهایی که بدون آنها برنامه اجرا نمیشود. نتیجه این است که وقتی یک کانتینر ساخته شد، میتوان آن را روی هر سیستمی اجرا کرد و مطمئن بود که رفتار برنامه تغییر نمیکند؛ فرقی ندارد این سیستم لپتاپ توسعهدهنده باشد یا یک سرور در فضای ابری.
نکته مهم اینجاست که کانتینرهای داکر سبک هستند. آنها برخلاف ماشینهای مجازی، سیستمعامل جداگانهای ندارند و از هستهی سیستمعامل میزبان استفاده میکنند. به همین دلیل سریع اجرا میشوند، منابع کمتری مصرف میکنند و مدیریت آنها سادهتر است.
بهطور خلاصه، داکر مشکل «ناسازگاری محیط اجرا» را حل میکند. یعنی همان جایی که معمولاً میشنویم: «روی سیستم من کار میکند، ولی روی سرور نه». داکر کاری میکند این جمله عملاً بیمعنا شود.

منظور از Container چیست؟
یکی از اهدافی که سیستم های جدید توسعه نرم افزار دنبال می کنند، این است که برنامه ها در یک محیط، اما به صورت ایزوله و جدا از هم نگهداری شوند. به این ترتیب فعالیت آنها بر روی یکدیگر تاثیر نداشته و جدا از هم کار می کنند. البته اجرای این فرآیند به خاطر استفاده از پکیج ها، کتابخانه ها و دیگر کامپونتت های نرم افزاری می تواند پیچیده شود.
یکی از راه های پیاده کردن این تکنولوژی استفاده از ماشین مجازی (Virtual Machine) است که برنامه ها را روی یک سخت افزار اما کاملا جدا از هم نگه می دارد. پس در این حالت کامپوننت های ما تداخل خاصی با هم نداشته و رقابت برای استفاده از منابع سخت افزاری هم به حداقل می رسد. اما ماشین های مجازی مشکلاتی هم دارند. اول از همه اینکه نرم افزارهای سنگینی بوده و سخت افزار نسبتا قدرتمندی می خواهند. همینطور هر برنامه نیاز به سیستم عامل جداگانه دارد که ممکن است این سیستم عامل ها حجم های چند گیگابایتی داشته باشند. و اینکه ممکن است نگهداری و بروزرسانی آنها دشوار شود.
بررسی عمیق تر Container به همراه یک مثال
در مقابل Container قرار دارد که می تواند جایگزین مناسبی برای ماشین های مجازی باشد. Container محیط های اجرایی را جدا کرده و هسته سیستم عامل را به اشتراک می گذارد. حجم آنها معمولا به مگابایت بوده و نسبت به ماشین های مجازی از منابع کمتری استفاده می کند. همینطور برخلاف ماشین های مجازی که برای اجرا نیاز به زمان نسبتا زیادی دارند، Containerها بلافاصله اجرا می شوند.
زمانی که Container را با ماشین مجازی مقایسه می کنیم یعنی با یک شبیه ساز طرف حساب هستیم. اما دقیقا چه چیزی را شبیه سازی می کنیم؟ برای درک بهتر موضوع بهتر است از یک مثال استفاده کنیم. فرض کنید در شرکتی مشغول به کار هستید و ناهار خود را هر روز در خانه درست کرده و آن را داخل یک ظرف به شرکت می برید تا آنجا میل بفرمایید. دیگر لازم نیست داخل شرکت شروع به پختن غذا کنید چون احتمالا زمان زیادی را از شما می گیرد. کار Container هم تا حدودی شبیه به این است. شما پروژه خود را (غذا) داخل Container (ظرف غذا) قرار داده و آن را هر کجا که دوست داشتید (مثلا شرکت) می برید.
اجزای اصلی داکر
برای ساخت یک برنامه با داکر باید از کامپوننت های مختلفی استفاده کنیم. حالا برای درک بهتر مفهوم داکر بهتر است سراغ این کامپوننت ها رفته و آن ها را بررسی کنیم:
Dockerfile
هر Container داکر با یک فایل داکر شروع به کار می کند. Dockerfile یک فایل متنی بوده که داخل آن با یک سینتکس ساده و قابل فهم دستورالعمل های ساخت Docker Image قرار داده شده است (کمی جلوتر این مفهوم را بررسی خواهیم کرد) این فایل اطلاعات بسیار مهمی را در برمی گیرد که برای راه اندازی داکر استفاده از آنها ضروری است. در واقع Dockerfile مشخص می کند که پشت Container ما چه سیستم عاملی قرار بگیرد، همینطور از چه زبان ها، متغیرهای محلی، پورت های شبکه یا غیره استفاده شود. و مهم تر از همه اینکه مشخص کند Container ما بعد از اینکه واقعا اجرا شد قرار است چه کاری انجام دهد.
Docker image
در واقع زمانی که کار نوشتن Dockerfile را تمام کردید، یک قابلیت به اسم Docker Build را فراخوانی می کنید که وظیفه دارد یک Image بر اساس محتویات Dockerfile شما بسازد. Dockerfile شامل یک سری دستورالعمل برای ساختن یک Image است، در حالی که Docker Image یک فایل قابل حمل است که شامل یک سری دستورالعمل بوده که مشخص می کند Container کدام کامپوننت های نرم افزاری را اجرا کند و اینکه چطور آنها اجرا شوند. به احتمال زیاد Dockerfile بخواهد تعدادی فایل را از مخزن های مختلف (Repository) دانلود کند و اینجا باید به طور واضح مشخص کنید که کدام نسخه ها دریافت شوند. همینطور Image ساخته شده استاتیک می باشد، یعنی یک بار ساختن آن کافی بوده و نیازی به تغییر آن ندارید. همانطور که از اسم آنها می توانید حدس بزنید، Image یک تصویر از سیستم عامل اصلی می باشد.

در فایل چیت شیت Sql server به بررسی مجموعه دستورات این نرم افزار مدیریت پایگاه داده پرداختیم
دانلود
Docker run
قابلیت Docker run در واقع یک دستور است که Container را راه اندازی می کند. می دانیم که هر Container یک instance یا نمونه از Image است و ماهیت Container به صورت موقتی می باشد. اما با این حال می توان آنها را متوقف (Stop) یا راه اندازی مجدد (Restart) کرد. هر Image می تواند تعداد زیادی Container داشته باشد (تا زمانی که هر کدام نام منحصر به فردی داشته باشند)
Docker Hub
هر چند ساخت Containerها کار راحتی است، اما لزومی ندارد برای هر Image از اول Container بسازید. Docker Hub یک مخزن Saas برای به اشتراک گذاری و مدیریت Containerها است. در آنجا می توانید Imageهای رسمی داکر که معمولا به صورت متن باز هستند را پیدا کنید. همینطور عموم مردم هم پروژه های خود را به این Repository اضافه می کنند.
Docker Engine
مغز متفکر و هسته اصلی داکر به حساب می آید. یک تکنولوژی کلاینت/سرور که Containerها را ساخته و آنها را اجرا می کند. در واقع اگر کسی درباره داکر صحبت کرده و منظورش شرکت داکر یا پروژه داکر نباشد، یعنی دارد درباره Docker Engine حرف می زند. این موتور در دو نسخه Enterprise یا Community عرضه می شود. نسخه Community به طور متن باز و کاملا رایگان قابل استفاده است در حالی که نسخه Enterprise یک سری قابلیت های اضافه داشته و سالانه برای هر Node نزدیک به 1500 دلار هزینه دارد. برای آشنایی بیشتر با مفهوم کلاینت و مدل کلاینت/سرور پیشنهاد می کنیم مطلب زیر را مطالعه بفرمایید:
بیشتر بخوانید: کلاینت چیست؟ (مقایسه انواع Client ها و معرفی آنها)
داکر چطور کار می کند؟
تمام این نکات را گفتیم تا به این بخش رسیده و بفهمیم داکر چیست و چطور کار می کند. داکر را می توانیم یک مجازی ساز در نظر بگیریم، اما نه به شکلی که ماشین های مجازی کار می کنند. این سرویس به شما کمک می کند یک محیط را به چند بخش تقسیم کرده و و در هر بخش یک برنامه مجزا اجرا کنید. برای درک بهتر موضوع یک لحظه داکر را شبیه به ماشین مجازی در نظر بگیرید، می دانیم که ماشین های مجازی با Hypervisor عملیات شبیه سازی را انجام می دهند اما در داکر این لایه حذف شده و ما مستقیم با هسته سیستم عامل کار می کنیم. این کار بازدهی سیستم را بسیار بالا می برد.
ما به جای اینکه چند سیستم عامل را داخل یک شبیه ساز نصب کنیم یک بار داکر را نصب می کنیم. این فرآیند را شبیه به نصب یک نرم افزار عادی در نظر بگیرید. بعد داکر محیط های مستقلی به نام Container ایجاد می کند که هر Container می تواند شامل بسته های نرم افزاری مختلفی باشد. حالا می توانید داخل داکر Containerهای مختلفی ایجاد کنید و پروژه های خود را به طور مستقل روی هر کدام اجرا نمایید.
نتیجه گیری
داکر یک ابزار اوپن سورس برای طراحی و ساخت برنامه ها به کمک Container است. Container به برنامه نویس کمک می کند که پروژه خود را با تمام بخش هایی که دارد (مثل کتابخانه ها، وابستگی ها و غیره) به صورت یک پکیج دربیاورد. به لطف این تکنیک، برنامه نویس خیالش راحت است که برنامه او می تواند در سیستم های دیگر بدون نیاز به تنظیمات خاص یا ابزارهای جانبی اجرا شود. داکر را شبیه به ماشین مجازی در نظر بگیرید، با این تفاوت که بازدهی بسیار بالاتری دارد. اگر قبلا تجربه استفاده از Docker را داشته اید، آن را با ما و کاربران سون لرن به اشتراک بگذارید.
خلاصه و مفید بود .ممنون.
توضیحات کامل و فوق العاده بود
خیلی روون و ساده توضیح دادین??
خوب و خلاصه و مفید البته بهتر بود بیشتر از مثال ها و تصاویر استفاده میشد.
با تشکر یک دانشجوی اسبق جناب آوند.
سلام،ممنون خلاصه و مفید نوشته بودی
خیلی خوب بود این مثال هایی که در متن زده شده بود به فهمیدن کمک کرد
سپاسگزارم.
بسیار مفید بود.