داکر یک انقلاب بزرگ در صنعت نرم‌افزار بوده و هست. برای این که اهمیتش رو بیشتر درک کنیم، بیاید راجع به ورک‌فلو‌هایی که قدیمی‌ترها انجام می‌دادند صحبت کنیم. ببینیم روال آپدیت نرم‌افزار چطوری بوده و بدون داکر چه مصیبت‌هایی رو متحمل می‌شدند.

باشد که رستگار شویم.

دوران قبل از داکر

من چند سالی تو یک شرکت نرم‌افزاری کار کردم. نرم‌افزاری که می‌نوشتیم یک نرم‌افزار حسابداری بود. اون زمان به یک عالمه Dependency (وابستگی) برای نصب نیاز داشت. این وابستگی‌ها چه چیزهایی بودند؟

اولاً که حتماً باید روی ویندوز نصب می‌شد. اون هم نه لزوماً همه نسخه‌های ویندوز. یادمه که با دستگاه‌های پوز (POS) زیادی ارتباط گرفته بودیم و DLLشون رو اضافه کرده بودیم و از توابع‌شون استفاده می‌کردیم.

مسئله هم این بود که می‌خواستیم مبلغ از سیستم حسابداری روی دستگاه نمایش داده بشه و بعد از پرداخت، اتوماتیک فاکتورش ثبت بشه. اون زمان هنوز (مثل الان) انقدر باب نشده بود و کمتر فروشگاهی این ویژگی رو داشت.

خلاصه هر کدوم از این دستگاه‌های پوز ساز خودشون رو می‌زدند؛ چون هر کدوم نسخه مجزایی از DLL داشتند. یکی می‌گفت که باید حداقل .Net Framework 4 داشته باشید. یکی دیگه می‌گفت حداقل باید دات‌نت فریم‌ورک ۴.۵ داشته باشید.

نصب .Net Framework هم جدا از زمانی که خودش تلف می‌کرد، محدودیت داشت. مثلاً یادمه که ویندوز XP، بیشتر از ۳.۵ ساپورت نمی‌کرد! حالا این بماند که روی بعضی سیستم‌ها به دلایلی (که هیچ وقت نفهمیدیم) اصلاً نصب نمی‌شد و تهش باید ویندوز رو مجدداً نصب می‌کردیم.

پس عملاً بعضی وقت‌ها اگر مشتری می‌خواست دستگاه پوز داشته باشه، باید ویندوزش رو هم عوض می‌کرد. حالا مشتری باید شانس می‌آورد که سیستمش انقدر قدیمی نباشه که ویندوزهای جدیدتر رو نتونه تحمل کنه. اصلاً شاید مجبور میشد که سیستم جدید بخره :)

جدای از این بحث، نیاز بود که حتماً یکی بره روی سیستم مشتری و نرم‌افزارها و پیش‌نیازهاش رو نصب کنه.

شما در نظر بگیرید از SQL Server که باید روی سرور نصب می‌شد و نصبش کلی طول می‌کشید. در نظر بگیرید که نصب SQL-Server واقعاً شبیه حل کردن یک عدد انتگرال سه گانه بود. اولین نرم‌افزاری بود که بدون دیدن «آموزش نصب» نتونستم به درستی نصبش کنم.

دلم براتون بگه که نرم‌افزارهای پیش‌نیاز خیلی زیاد بود. یادمه یه پوشه‌ای داشتیم که به پشتیبان‌ها داده بودیم باید تک‌به‌تک نصب می‌کردند. مثلاً برای گزارش‌گیری از Stimul Report استفاده می‌کردیم. Crystal Report هم باید نصب می‌شد؛ چون یه سری از گزارش‌های قدیمی‌تر با اون نوشته شده بود. حتی فونت‌های سیستم رو هم باید دستی نصب می‌کردیم.

به طور خاص یک روز به نام «روز نصب» داشتیم که پشتیبان‌ها می‌رفتند در محل مشتری و کل روز کارشون این بود که سیستم‌ها رو نصب کنند. شما در نظر بگیرید که هر سیستم تقریباً ۱ ساعت طول می‌کشید و خیلی عادی بود که ۷ ۸ تا سیستم داشته باشند :) مغز آدم از این حجم دوباره‌کاری می‌ترکه.

خیلی وقت‌ها هم مجبور می‌شدیم برای مشتری ویندوز نصب کنیم؛ چون یک چیزی تو ویندوزش مشکل داشت و چون ما حوصله نداشتیم (و بلد هم نبودیم) که برای هر مشتری بریم جداگانه ببینیم ویندوز چه مشکلی داره، ویندوز رو از نو نصب می‌کردیم.

راجع به آپدیت هم که اصلاً نگید. مشتری‌ها انقدر تجربه آپدیت بد داشتند که از آپدیت می‌ترسیدند. همه این داستان‌ها به خاطر این بود که روال درست حسابی‌ای برای هیچ کدوم از این کارها نداشتیم.

قاعدتاً یه راه‌حل منطقی برای رفع این مشکلات درست‌کردن یک Installer تر تمیز بود که هیچ‌وقت در اولویت قرار نمی‌گرفت. جدای از اون به نظرم این وظیفه سیستم‌عامل هست که «مدیریت پکیج» رو به درستی انجام بده.

مک و لینوکس اینکار رو به مراتب بهتر از ویندوز انجام میدن و مایکروسافت کلاً این قضیه رو از سر خودش باز کرده. هنوز هم که هنوزه، خیلی از نرم‌افزارها (و بازی‌ها) به درستی روی سیستم نصب نمی‌شن و به دلایل نامعلومی بالا نمیان.

دوران بعد از داکر

خب حالا داکر چه تغییری در اینها ایجاد کرد؟

داکر ایده‌اش این بود که برنامه‌نویس صرفاً یک بار خود برنامه و چیزهایی که برای برنامه‌اش نیازه رو تعریف کنه و داخل یک Image بگذاره. بعد از اون صرفاً هر جا لازم بود از این Image استفاده بشه. خلاص.

این‌طوری چند تا مزیت خیلی خوب بوجود اومد. یکی این که مستقل از سیستم عامل عمل می‌کنه و روی هر سیستم عاملی می‌تونه بالا بیاد. علتش هم اینه که هیچ فرضی راجع به سیستم عامل نمی‌کنه.

الان ما می‌تونیم روی یک سرور هزاران سرویس کاملاً مستقل از هم داشته باشیم و هر کدوم کار مختص خودشون رو انجام بدن. اینطوری نه نیازی به نصب ده‌ها ابزار مختلف روی سیستم‌عامل هست. نه نیازی هست که حرص و جوش بخوریم که فلان نسخه از فلان پکیج با فلان کتابخانه سازگار نیست.

فکر می‌کنم تصویر زیر گویای مطلب هست. یک عالمه سرویس (محموله) روی یک سرور (کشتی) داریم که همگی از هم کاملاً مستقل هستند.

البته هنوز هم چون همه سرویس‌ها، پروسس‌هایی داخل یک سیستم‌عامل هستند، ممکنه که با هم وارد رقابت در منابع سیستمی (مثل RAM و CPU و …) بشن. اما اون بحث مجزایی هست.

آپدیت هم با داکر خیلی ساده شده! یک ایمیج داکر میاد و جایگزین ایمیج قبلی میشه و کار رو حل می‌کنه! نیازی به نصب هیچ نر‌م‌افزار دیگه‌ای هم نیست.

از مهم‌ترین بحث‌هایی که این سال‌ها خیلی رواج پیدا کرده CI/CD هست که به نظرم بدون داکر تقریباً غیرممکن بود. الان تا این حد پیش رفتیم که برنامه نویس یک خط کد رو آپدیت می‌کنه و پوش می‌کنه داخل گیت. بعد از اون تست‌ها اجرا میشه و اگر همگی اوکی بودند، برنامه می‌تونه روی سیستم همه مشتری‌ها بصورت همزمان آپدیت بشه و بدون هیچ مشکلی به کارش ادامه بده. زیبا نیست؟

یکی از مشکلات دیگه‌ای که داشتیم این بود که روی سیستم ما کار می‌کرد ولی روی سیستم مشتری کار نمی‌کرد! داکر این مشکل رو هم به زیبایی حل کرد.

خلاصه به نظرم داکر خداوندگار زمان ماست. سعی می‌کنم که هر چیزی رو می‌نویسم داکرایز (Dockerize) کنم! سعی می‌کنم همه چیز داکر باشه چون در نهایت همه ما می‌میریم ولی داکر است که زنده می‌ماند!

ولی هیچ تکنولوژی‌ای بدون ایراد نیست.

ایراد داکر اینه که تعاملش با سیستم‌عامل صرفاً تعاملی از طریق فایل یا پورت هست. این برای کاربردهایی نظیر وب‌ اپلیکیشن یا دیتابیس عالیه ولی برای اپلیکیشنی که Native UI بخواد، مناسب نیست.

مثلاً تلگرام وب رو میشه با داکر بالا آورد (و تقریباً مطمئن هستم که با داکر بالا آوردند) ولی تلگرام دستکاپ رو باید جداگانه براش کد نوشت و همه مشکلاتی که گفتم رو باید جداگانه بشینه حل کنه (که به بهترین شکل ممکن حل کرده).

کاش میشد که UI هم به طریقی داخل داکر بیاد که اونوقت دیگه تحول مجدد در صنعت نرم‌افزار داریم. کلاً بحث سیستم‌عامل کمرنگ‌تر از همیشه میشه.

البته می‌دونم بعضی ابزارها مثل الکترون Electron سعی کردند که کاری کنند که یک بار کد بنویسیم و داخل تمام سیستم عامل‌ها ازشون استفاده کنیم. ولی هنوز چندان به بلوغ نرسیدند و نمی‌تونند از قابلیت‌های سیستم‌عامل به خوبی استفاده کنند. رم رو هم که الی ماشاءالله می‌بلعند.


اگر برنامه‌نویس هستید و داکر غلغلک‌تون میده، این دو تا کورس رو از دست ندید که بسیار زیبا و کاربردی هستند: