Docker داکر چیست؟ خوش و بشی با داکر Docker

مبحثی که در موردش میخایم شروع به صحبت کنیم، در مورد Container ها و علی الخصوص داکر (Docker) هستش که به صورت کلی و مختصر به تعریف و توضیح کوتاهی در موردشون می پردازیم. لازم به گفتن میدونم که بعضی از تعاریف برای سادگی به شکل دیگه ای بیان میشه و سعی میکنم زیاد ریز بینانه وارد نشم تا مبحث ویژگی فهم عمومی داشته باشه.
Container چیست؟
خب اول از همه بریم سراغ Container و ببینیم چی هست و کجا استفاده مون میشه.
به زبان خیلی ساده میشه گفت Container به گروهی از پروسس ها میگن که داخل یک فضای ایزوله شده قرار گرفتهاند (البته ما در docker سراغ این میریم که microprocess ها رو داشته باشیم و در هر کانینر یک پروسس اصلی رو اجرا کنیم).
از نگاهی دیگه میشه گفتش که مدلی از مجازی سازی در لایه ی سیستم عامل هستش که هسته ی سیستم عامل این قابلیت رو به ما میده که تعدادی فضای ایزوله رو کاربر بتونه ایجاد کنه.
اینجا سؤال پیش میادش که فضای ایزوله ای که ازش اسم بردیم چی هستش؟ چه قابلیتی از سیستم عامل هستش که این ویژگی رو به ما داده؟
در سیستم عامل لینوکس، یکی از مزیتهای هسته، Namespace هستش که منابع سیستمی رو برای ما به صورتی کاملاً مجزا جدا و شبیه سازی میکنن. مثلاً Process ID، دسترسی شبکه یا حتی فایل سیستم و یا ارتباطات داخلی پروسس ها، پس اینطوری ما با استفاده از Namespace یک فضای ایزوله برای کارمون ایجاد کردیم.
خب، دوباره تعریف سادمون از Container رو اینجا باز گو میکنم: Container به گروهی از پروسس ها میگن که داخل یک فضای ایزوله شده قرار گرفته و هر Container میتونه قابلیتهای Namespace رو که چندتاشون رو نام بردیم داشته باشه.

داکر (Docker)
وقتش رسیده که بریم سراغ Docker و ببینیم نهنگ آبی و خندون داکر کی هستش و چی هست و رسالتش چیه.
هستهی داکر که میتونیم بهش Docker Engine بگیم، یک نرمافزار متن باز هستش که روی سیستم عامل نصب میشه و به ما اجازه ی ساخت، پیادهسازی و مدیریت Container ها رو میده. این برنامه توسط تیم داکر و یا dotCloud نوشته شده و در اختیار من و شما قرار گرفته. Docker به ما این قابلیت رو میده که برنامههای خودمون رو به صورت اتوماتیک پیادهسازی کنیم و در قالب microprocess هر container رو دربیاریم و استفاده کنیم.
بزرگترین مزیتی که Docker بهمون ارایه میده این هستش که به سرعت میتونین کار development خودتون رو باهاش تست کنین، جلو ببرین و به حالت production برسونینش. ازین باحال تر این هستش که دیگه مثله نیازمندی های KVM، VMware و … به سیستم عجیب و غریبی نیاز نداریم؛ در واقع بسادگی میتونین روی سیستمی که دارین (که شاید RAM و CPU بالایی نداشته باشه)، داکِر رو نصب و ازش استفاده کنین.

موارد کاربردی داکر
در مورد مزیتی که اول گفتم (تسریع در Development) بگذارین یک مثال تجربیِ کوچیک بزنم:
امروز میخاستم یک اسکریپت کامپایل Nginx با OpenSSL ورژن 1.0.2j و یک سری enable/disable کردنهای دیگه درست کنم. روال کار برای من اینجوری بودش:
- نصب پیش نیاز ها
- دانلود nginx و openssl
- کامپایل openssl
- کامپایل nginx
اگه تا به حال کامپایل انجام داده باشین، متوجه میشین بعضی وقتا حوصله سَربَر میشه، مخصوصاً زمانی که بخواین پکیج رو کم و زیاد کنین یا موقغی که بلا به دور با نقص پیش نیاز مواجه بشین.
۲ تا حالت رو با هم بررسی میکنیم. یکی حالت معمولی و روی یک سیستم عامل معمولی که میخایم یک template تر و تمیز بسازیم. و حالت بعدی استفاده از docker که میخایم یک کانتینر ازش بسازیم.
حالت عادی
فرض کنید اسکریپت ما تا مرحله ۴ رو کامل هر بار جلو میره و یک زمان زیادی رو کامپایل OpenSSL ازمون میگیره و بعدش میرسه به Nginx. حالا توی Nginx به ایراد میخورید و برطرفش میکنیم. اسکریپت با comment کردن کارای قبل تست اولیه میشه و بعدش از comment برای تست نهایی خارجش میکنیم و باز میبینیم یک feature زیاده و باز دوباره از اول. فرض کنین چند بار این اتفاق بیوفته. شما یک صبح کاری رو به همین سادگی از دست میدین. این صبح کاری به ساخت یک اسکریپ نصب گذشت که هر بار برای تست نهایی ۳ مرحله ابتدایی رو دوباره اجرا میکردش.
حالت دوم – استفاده از DOCKER
در این روال داکر برای هر مرحلهای که جلو میریم یک لایه در نظر میگیره. اینطور فرض کنید که از هر جای این ۴ مرحله میتونیم کار رو ادامه بدیم. اسکریپتمون مثل قبل تا مرحله ۴ میره و در مرحله ۴ ما شروع به enable/disable کردن ها میکنیم. اما اینجا کامپایلمون یک تفاوتی داره. دیگه نیازی به کامنت کردن نداریم. هر بار اجرا کنیم، چون ۳ مرحله ی قبلی تکراری هستن، از مرحله ۴ به بعد ادامه پیدا میکنه و زمان ۳ مرحله قبل رو (مخصوصاً کامپایل OpenSSL که طولانی هستش) میخریم و هر بار فقط مرحله ۴ تکرار میشه.
این یک مثال خیلی خیلی کوچیک اما ملموس و دم دستی بود که گفتم.
از مزیتهای دیگه ای که Docker-Container بهمون میده، میتونیم به این اشاره کنیم که Image ها (فعلاً فرض رو بر این میگذاریم که Image مثل Template در دنیای مجازی سازی هستش) حجم های بسیار کمی دارن. مثلاً Image سیستم عامل Debian حدود 123 مگابایت هستش. ولی شما وقتی یک Debian روی سیستم نصب میکنید حدود 4 گیگابایت (تا جایی که یادمه) ازتون فضا میگیره … دلیلش رو اینطور فرض کنید که Image حداقل نیاز خود سیستم عامل مورد نظر بدون هیچ Kernel ای از خودش هست. چون Container گفتیم که از Kernel سیستم عامل اصلی استفاده میکنه، پس این مزیت تأکید بر حجم داشتش.

یک مزیت بزرگی که داکر بهمون میده، Registry اون هستش. Registry رو به چشم Repository ای از Image های مختلف ببینین. میشه گفت بزرگترین Registry مربوط میشه به Docker Hub که انواع و اقسام Image ها رو میشه داخلش پیدا کرد.
از ویژگیهایی که مربوط به داکر میشه، به Swarm میتونم اشاره کنم که قابلیت مدیریت چند سیستم دارای Docker رو بهمون ارایه میده و میتونیم از یک نقطه به صورت توزیع شده Application خودمون رو پیادهسازی کینم و دیگه به این فکر نکنیم که الان باید روی کدوم سیستم Container رو بالا بیارم.
مزیت دیگه میشه به HealthCheck اشاره کردش که با وجود Swarm دیگه نگرانی این رو نداریم که اگر Application از دسترس خارج شد، دیگه Application از کار بیوفته. با وجود این ویژگی در اسرع زمان، در یکی از نقاط در دسترس Application به صورت اتوماتیک اجرا میشه