توی مقاله قبلی به این سوال پاسخ دادم که آیا یه فرانتکار نیازه الگوریتم بلد باشه؟ الان با همون رویکرد میخوایم ببینیم چرا یادگیری (یا حداقل آشنایی) با Docker برای تیم فرانتاند نیازه؛ بدونیم از کجا شروع کنیم و تا کجا ادامه بدیم.

توی این مقاله نمیخوام خیلی وارد این موضوع بشم چون بهش زیاد پرداخته شده. اما بد نیست اگه یه خلاصهای ازش به زبون ساده گفته بگم.
قبل از داکر، نرمافزارهایی که نوشته میشدن، برای Deploy، به عنوان یک سرویس توی سیستمعاملِ سرور تعریف میشدن(دیگه الان به اون سرورای فیزیکی میگیم Bare Metal). این مساله چالشهای زیادی داره. مثلا:
هر برنامه وابستگیهایی داره که مدیریت اون وابستگیها برای سرویسهای مختلف روی یک سرور دشواره. مثلا فرض کنید دوتا سرویس Node.js داریم که یکی با ورژن 18 کار میکنه و دیگری با ورژن 20. مدیریت اینکه هرکدوم از نسخه مطلوب Node استفاده کنن چالش داره.
یه فضای مشترک بین سرویسهای سیستمعامل وجود داره که ممکنه روی هم اثر بگذارند. مثلا، Environment variableها در سطح سیستم عامل مشترکن و هر سرویسی میتونه اونارو بخونه و اگر دسترسیهای لازم رو داشته باشه میتونه اونا رو تغییر بده. این مساله جدا از بحث conflict، میتونه مشکل امنیتی هم داشته باشه.
اگه بخوایم برنامهمون روی چند سرور بیاریم بالا(اصطلاحا scale کنیم)، باید حواسمون به همهی این کارها توی سرورای دیگه هم باشه.

اینجاست که Dockerman دست به کار میشه. کاری که داکر کرد این بود که هر برنامه رو به صورت مستقل توی یه محیطی که سیستمعامل نیست ولی سیستمعامل رو شبیهسازی کرده اجرا میکنه. به اون محیط مستقل Container گفته میشه. هربرنامه رو روی یه Container میاریم بالا، توی هر Container تنظیمات مختص اون سرویس رو قرار میدیم و خیالمون راحته کس دیگهای از این Container استفاده نمیکنه و روش دستکاری انجام نمیده. یجورایی شبیه اینه که برای هر سرویسمون یه سرور خریدیم، روش سیستمعامل نصب کردیم و تنظیمات مخصوص اون برنامه رو انجام دادیم. توی داکر همه این کارا به صورت مجازی انجام میشه.
نکته: یه چیزی بین Bare Metal و Container وجود داره به اسم Virtual Machine. چون هدف این مقاله معرفی این نیست از گفتنش صرفنظر کردم ولی اگه علاقمند هستید توی این ویدیو میتونید راجع به تفاوت اینها بیشتر بدونید.
خب با این توضیحاتی که دادم ممکنه براتون سوال بشه که به عنوان یک برنامهنویس فرانتاند، ما اصلا به داکر کاری نداریم و چرا باید یاد بگیریم؟ عنوان و هدف این مقاله جواب به همین سواله.
سیستم چطور کار میکنه: شما به عنوان برنامهنویس باید بدونید این کدی که مینویسید کجا و چطور اجرا میشه. شناخت سیستم هم برای دانش عمومی کامپیوتر خوبه و هم اینکه یه جاهایی توی کد زدن به کارتون میاد.
ارتباط بهتر با سایر استکها: شاخههای مختلف نرمافزار دایره واژگان و ادبیات خودشون رو دارن. خیلی وقتا این ادبیات اونقدر متفاوته که شما گاهی حسی ندارید که مثلا تیم DevOps داره در مورد چی حرف میزنه. از اونجایی که داکر یه بخش خیلی مهمی از کار تیمها رو شامل میشه، آشنایی باهاش کمی این مساله رو بهبود میده و باعث میشه بتونید ارتباط بهتری از نظر فنی با تیمها و استکهای دیگه داشته باشید. همچنین نیازی ندارید بدونید تیم بکاند با چه زبان و فریمورکی توسعه داده شده و چطور بکاند رو build یا run کرد. فقط کافیه که container بکاند رو بالا بیارید و باهاش کار کنید.
رفع باگهای پروداکشن: احتمالا برای شما هم پیش اومده که یه چیزی توی سیستم local شما درست کار میکنه ولی توی پروداکشن مشکل داره. این یه مساله رایجه و حتی memeهای بامزهای هم براش ساختن. حتی همین الان که دارم این مقاله رو مینویسم خودم درگیر یه مورد عجیب اینطوریم. یک راهی که برای این هست اینه که برید با تیم DevOps یا backend چک کنید و با کمک اونا باگ رو پیدا کنید. اما اگر محصولتون داکری باشه، میتونید container یا containerهای مورد نیازش رو روی سیستم خودتون ران کنید و مشکل رو خودتون پیدا کنید. کدی که توی container داکر ران میشه نزدیکترین کد به پروداکشنه و اکثر خطاهای پروداکشن(بهخصوص frontendایها)، توی Containerای که خودتون run میکنید هم وجود دارن.
مزیت رقابتی در بازار کار: داکر یه تخصص cross-cutting عه. به این معنی که همه بخشهای نرمافزار کم و بیش نیاز دارن باهاش آشنا باشن. توی این چند سال من خیلی میبینم که توی آگهیهای شغلی برای برنامهنویس frontend(به خصوص سنیور)، آشنایی با داکر الزامی یا مزیت محسوب میشه. توی تجربهای که از خودم از مصاحبهها داشتم، توی سالهای پیش آشنایی بچهها با داکر کمتر بود ولی الان روزبهروز داره بیشتر میشه. پس آشنایی با داکر یه مزیت رقابتی برای استخدامه.

توی صنعت نرمافزار مطلب برای یادگرفتن بسیاره، و در نتیجه شما وقت ندارید توی همهچیز عمیق بشید. پس احتمالا نیازی نیست توی داکر هم حرفهای باشید. اگر به تازگی برنامهنویسی رو شروع کردید احتمالا چیزای واجبتری برای یادگیری دارید. پس میتونید یادگیری داکر رو به تعویق بندازید.
اگر خودتون رو Mid-level میدونید، یه آشنایی کلی با داکر کفایت میکنه. در این حد که داکر چیه و چطور میشه یه Container رو run یا stop کرد. دستورات ابتدایی داکر رو بدونید کافیه.
هرچی که توی این مسیر به سمت Senior شدن و بالاتر پیش برید، طبیعتا سطح دانش داکریتون هم باید بیشتر بشه. کمکم باید دستورات نوشتن image رو بدونید چون لازمه که image داکر بنویسید یا imageای که نوشته شده رو بخونید و تغییر بدید. میتونید از نوشتن imageهای فرانتاند شروع کنید و بعد کمکم هرجا نیاز داشتید دانشتون رو بیشتر کنید. احتمالا به یادگیری docker-compose هم احتیاج پیدا میکنید.
قبل از هر چیز باید با لینوکس آشنا بشید چون داکر روی یه کرنل شبیهسازیشده لینوکس کار میکنه. حتی نظر شخصی من اینه که سیستمعاملی که توش develop میکنید رو یه مدت به لینوکس تغییر بدید که بهش عادت کنید و بهتر یاد بگیرید.
اگر با لینوکس آشنا نیستید، من این دوتا منبع رو معرفی میکنم که بد نیست یه نگاهی بهش بندازید و با هر کدوم که راحتتر بودید شروع کنید یا دانشتون رو بیشتر کنید:
سایت roadmap.sh یه سایت خیلی خوبه که توی همه بخشهای نرمافزار یه نقشه راه تر و تمیز کشیده و بهتون میگه به ترتیب چه چیزهایی رو یاد بگیرید. بخش لینوکسش رو بهتون توصیه میکنم.
ساید GeeksForGeeks هم یه tutorial خوب برای آشنایی با لینوکس داره که از نصب لینوکس تا مفاهیمش رو توضیح داده.
بعد از این دیگه میتونید با خود داکر آشنا بشید. من اینجا چندتا منبع برای آشنایی و یادگیری داکر آوردم:
باز هم سایت roadmap.sh یه نقشه راه خوب برای داکر داره(کلا این سایت خیلی مورد علاقه منه).
این ویدیوی سه ساعته هم یه مقدماتی از داکر رو توضیح میده که برای آشنایی بد نیست.
همچنین خودتون هم بگردید میتونید منابع زیادی برای شروع و یادگیری پیدا کنید. نکتهای که وجود داره اینه که نیازی نیست هیچ کدوم از منابع رو تا انتها پیش ببرید. برای شروع با مفاهیم اولیهش هم آشنا بشید و کمی دستتون رو کثیف کنید کافیه.
توی این مقاله سعی کردم به زبون ساده از اهمیت داکر برای فرانتاند دولوپرا بگم. این نکته رو مد نظر داشته باشید که progress آروم آروم اتفاق میافته و هرجا حس کردید چیزی نمیدونید یا خیلی چیزها هست که باید یاد بگیرید، یعنی توی مسیر درستی قرار دارید و ناامید نشید.
اگر نظری دارید یا چیزی جا افتاده خوشحال میشم توی کامنتها یا از طریق ایمیل با من به اشتراک بذارید. همچنین توی توییتر هم با آیدی @hesam_se میتونید منو دنبال کنید.