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