اگر میزان آشناییتان با فضای برنامهنویسی خیلی زیاد هم نباشد، احتمالاً نام داکر چندباری به گوشتان خورده است. نظرسنجی سال 2022 استک اور فلو از هفتادهزار توسعهدهنده نرمافزار نشان میدهد که امروز داکر در کنار ابزارهای اساسی دیگر، مانند گیت، به یکی از ابزارهای اصلی و عصای دست برنامهنویسان تبدیل شده است. به همین دلیل است که این روزها کمتر آگهی استخدامی در حوزه برنامهنویسی میبینید که اشارهای به آشنایی یا تسلط به داکر نداشته باشد.
در این مطلب از وبلاگ همروش قصد داریم به صورت کامل با داکر آشنا شویم و همچنین اجزای مختلف آن را بررسی کنیم. در پایان مطالعه این مطلب شما دید جامعی به نسبت چیستی داکر و استفادههای آن پیدا خواهید کرد.
داکر (Docker) چیست؟
داکر پلتفرمی متنباز است که با استفاده از آن توسعهدهندگان میتوانند فرایندهای ساخت، تست و استقرار اپلیکیشن را با سرعت بیشتر و خطای کمتری انجام دهند. Docker اپلیکیشنها را به شکل پکیجهای استاندارد درمیآورد. در این پکیج همه موارد ضروری برای بالا آوردن و اجرای اپلیکیشن (مانند کتابخانهها، کد، فایلهای پیکربندی و…) آورده میشود.
چطور داکر به دوره «ولی روی سیستم من کار میکند!» پایان داد؟
در دنیای فناوری جملهها هم تاریخ انقضا دارند. تا همین چند سال پیش روزی نبود که برنامهنویسها از جمله «ولی روی سیستم من کار میکند!» استفاده نکنند. داستان از این قرار است که وقتی یک برنامهنویس نرمافزاری را توسعه داده و روی سیستم خود اجرا میکند، مشکلی وجود ندارد، اما به محض اینکه آن را به یکی از همتیمیهای خود ارسال میکند، با این جواب که «روی سیستم من کار نمیکنه» مواجه میشود.
دلیل این موضوع واضح است. یک نرم افزار به کتابخانهها و ابزارهای دیگری نیز وابسته بوده و نمیتواند مستقل از آنها اجرا شود. حال درست است که این نرمافزارها روی سیستم عامل فرد اصلی نصب شده، اما ممکن است همتیمی شما این موارد را نداشته باشد.
برای حل چنین مشکلی بود که تصمیم گرفته شد تا راهحلهای مختلفی ایجاد شود. داکر یکی از این راهکارهاست که با اطمینان کامل باید گفت بهترین رویکرد نیز هست.
این داکر بود که توانست سیستمی استاندارد برای ساخت، اجرا و انتقال اپلیکشنها بسازد. با استفاده از Docker دیگر مهم نیست که شما در چه محیطی و با چه نیازمندیهایی اپلیکیشن را مینویسید. خیالتان راحت است که با کمک داکر میتوانید نسخهای پایدار و استاندارد از اپلیکیشنتان را به همکارانتان ارائه کنید که در هر سیستم و محیطی، بدون مشکل قابل اجراست.
تاریخچه داکر؛ داستان یک ابزار موفق
برای درک بهتر داکر باید بحث را از فناوری کانتینر و ایزولهسازی شروع کنیم. فراموش نکنید که داکر بر روی شانههای فناوری کانتینر ایستاده است.
تولد کانتینرها
فناوری کانتینر در سال 1979 با یونیکس 7 و chroot system پدید آمد. سیستم chroot میتوانست محیطی ایزوله برای یک پردازش و زیرپردازشهای مرتبط با آن بر روی سیستم فراهم کند. علیرغم این شروع چشمگیر و زودهنگام، ویژگی chroot و کاربردهای آن تغییری انقلابی در دنیای فناوری محسوب نمیشد و دنیای کانتینرها در دو دهه بعدی سالهای آرام و راکدی را سپری کرد.
دوران بلوغ
در دهه 2000 بود و با معرفی Free BSD Jails بود که بالاخره جهان کانتینرها تکانی اساسی خورد. Jailها پارتیشنهایی ایزوله بر روی سیستمها میساختند. این ابزار اولین فناوری بود که کاربردهای chroot را گسترش داد، و نه تنها امکان جداسازی در سطح فایل سیستم را فراهم کرد، بلکه توانست کاربرها، شبکه، زیرسیستمها و موارد دیگر را نیز مجازیسازی کند.
با معرفی LXC در سال 2008 بود که برای نخستین بار فعالان حوزه فناوری یک سیستم کامل و پایا از کاربردهای کانتینرها در مدیریت فایلها را به چشم دیدند. LXC از فناوریهایی مانند گروههای کنترل، فضانامها بهره میبرد.
دوران طلایی؛ ورود داکر
با اینکه فناوری کانتینر و ابزارهای ایزولهسازی در دهه اول قرن بیستویک پیشرفتهای چشمگیری را تجربه کرد ولی این داکر بود که ورق را برگرداند.
در سال 2010 سالامون هایکس و سباستین پال، بنیانگذاران شرکت dotCloud، کار ساخت داکر را آغاز کردند و در سال 2011 داکر رسماً در پروژههای این شرکت مورداستفاده قرار گرفت.
به جهان متنباز خوش آمدید!
بیابید به مارس 2013 برگردیم. زمانی که سالامون هایکس اعلام کرد که docker از این پس بهصورت متنباز در دسترس خواهد بود. شاید در آن زمان کسی فکرش را هم نمی کرد که داکر به موفقیت امروز دست یابد،. اما docker خیلی زود مورد توجه دنیای برنامهنویسها قرار گرفت. شش ماه بعد از انتشار متنباز داکر، این ابزار توانست در گیتهاب به 6700 استار برسد و 175 نفر در آن بهصورت داوطلبانه مشارکت کنند.
داکر چه کاربردهایی دارد؟
«سریعتر توسعه بده. هر جا که خواستی اجرا کن». اگر تا به حال سری به سایت داکر زده باشید، حتماً این شعار به چشمتان خورده است. این شعار دقیقاً خلاصهای است از امکاناتی که docker برایتان فراهم میکند. همانطور که پیش از این گفتیم داکر در اکثر مراحل توسعه نرمافزار به کارتان میآید و کار را برایتان راحتتر میکند. برای درک بهتر کاربردهای داکر در اینجا به چند مورد اشاره میکنیم:
- با استفاده از docker میتوانید اپلیکیشنهای خود را به محیط تست ببرید و تستهای دستی و خودکار را روی آن اجرا کنید.
- وقتی بهعنوان دولوپر در کارتان به باگ میخورید، میتوانید آن را در محیط توسعه برطرف کنید و فایلتان را برای تست و سنجش اعتبار دوباره دیپلوی کنید.
با مفاهیم مرتبط با داکر بیشتر آشنا شویم
حالا که فهمیدیم داکر چیست و چه کاربردهایی دارد میتوانیم به سراغ برخی از جزئیات فنی برویم و با اجزای docker آشنا شویم. وقتی که بهصورت عملی با داکر کار میکنید، در واقع در حال تعامل با همین اجزای docker هستید.
داکر انجین
docker با داکر انجین کار میکند. داکر انجین از دو بخش تشکیل شده است: سرور و کلاینت. ارتباط این دو از طریق REST API صورت می گیرد. در سیستمهای قدیمیتر ویندوز و مک، شما میتوانید از Docker Toolbox استفاده کنید که این امکان را برایتان فراهم می کند تا داکر انجین را با استفاده از Compose و Kitematic کنترل کنید.
داکر فایل
داکرفایل، فایلی است که از آن برای ساختن داکر ایمیج استفاده میشود. در واقع dockerfile، فایل متنی سادهای است که مجموعهای از دستورالعملها و کامندها درون آن قرار گرفته است. در این فایل به سیستم عامل، زبانها، متغیرهای محیطی، موقعیت فایلها، پورتهای شبکه و موارد موردنیاز دیگر اشاره میشود.
docker بهصورت خودکار داکرفایل را به داکر ایمیج تبدیل میکند. در فرایند تبدیل داکر فایل به داکر ایمیج دستورات درون داکرفایل از بالا به پایین و بهصورت گامبهگام اجرا میشوند.
داکر ایمیج
docker image قالبی است که شامل دستورالعملهایی برای داکر کانتینر است. این تمپلیت به زبان YAML نوشته میشود. YAML زبانی است که در چند سال اخیر بسیار محبوب شده است و بیشتر از آن بهعنوان فرمتی برای فایلهای پیکربندی استفاده میشود. البته قابلیتی که در دنبالهسازی دارد آن را به زبانی رقیب برای زبانهایی مانند json نیز تبدیل کرده است.
اغلب، یک ایمیج در داکر بر پایه ایمیجهای دیگر، بهاضافه شخصیسازیهای مختص به ایمیج جدید ساخته میشود. یکی از نقاط قوت docker راحتی ساخت این ایمیجهاست. چرا که برای ساختن ایمیجی که لازم داریم، کافی است فقط داکر فایلی بسازیم که در آن دستورالعملهای ساخت و اجرای ایمیج آمده باشد.
داکر کانتینر
کانتینرها محیطهای runtime هستند. شما معمولاً در هر داکر کانتینر یک پردازش عمده دارید. برای درک بهتر این مطلب فعلاً میتوانید این گونه در نظر بگیرید که هر داکر کانتینر مربوط به یکی از سرویسهای پروژه شماست.
مثلا می توانید یک کانتینر برای دیتابیس MySQL و کانتینر دیگری برای سرور وردپرس داشته باشید و این کانتینرها را به هم وصل کنید و یک پروژه وردپرس بالا بیاورید.
شما برای همه تکنولوژیهایی که فکرش را میکنید میتوانید کانتینر بالا بیاورید؛ شما میتوانید دیتابیسها، وبسرورها، وب فریمورکها، سرورهای تست، را به این شیوه اجرا کنید.
از لحظهای که داکر ایمیج اجرا می شود ما داکر کانتینر داریم. داکر ایمیج محیطی پیش ساخته برای تکنولوژی یا سرویس موردنظر است. داکر ایمیج ران تایم نیست بلکه مجموعه ای از فایلها، کتابخانهها و فایلهای پیکربندی است برای ساختن محیط است. پس از ساختن داکر ایمیج با دستور “docker run” کانتینر شروع به کار میکند.
تفاوت میان داکر ایمیج و داکر کانتینر چیست؟
احتمالاً در نگاه اول مفاهیم docker برایتان بسیار شبیه به هم و گیجکننده به نظر برسند. جای نگرانی نیست. شما تنها کسی نیستید که چنین حسی را دارید. اصولاً یکی از ویژگیهای docker همین مفاهیم نزدیک به هم است. برای درک بهتر داکر فایل، داکر ایمیج و داکر کانتینر به تصویر زیر نگاه کنید.
همانطور که در تصویر مشخص است هر کدام از این مفاهیم در در طول یک فرایند قرار دارند و با تغییراتی وارد مرحله بعد می شوند. شما کارتان را با نوشتن یک داکرفایل شروع میکنید. بعد با اجرای کامند build آن را به داکر ایمیج تبدیل میکنید.
با ساختن داکر ایمیج هنوز کارتان تمام نشده است. چون داکر ایمیج در واقع قالبی است فقط-خواندنی که شرایط را برای اجرای داکر کانتینر فراهم میکند. در واقع تمپلیت یا قالبی که داکر ایمیج فراهم میکنید پایهای برای اجرای داکر کانتینر است. وقتی داکر ایمیجتان آماده باشد تنها کافی است دستور run را اجرا کنید. با اجرای این دستور داکر کامنتینر بالا میآید.
لزوما همیشه شما این مسیر را طی نمیکنید. در اغلب اوقات شما به سراغ ایمیجهای آماده میروید. این ایمیجها در مخزنی به نام داکرهاب قرار دارند
داکرهاب
داکر هاب مخزن ابری است که به شما این امکان را میدهد تا ایمیجهای داکر را تست، ذخیرهسازی و دیپلوی کنید. در داکرهاب شما به مخزنهای ایمیج عمومی متنباز دسترسی دارید و میتوانید مخزن خصوصی خود را هم در آن بسازید.
از داکرهاب میتوانید نسخههای کانتینری شده بسیاری از نرم افزاهای متنباز را دانلود کنید. اگر به ایمیج شخصیسازی شده نیاز داشته باشید میتوانید ایمیج موردنیاز خود را بسازید و در مخزن شخصی خودتان ذخیره کنید.
مزایای داکر
انسجام و یکپارچگی
استفاده از پلتفرمی که در محیطهای مختلف بهطور یکسان عمل میکند، استرس زیادی را از بین میبرد. با استفاده از docker، همه اعضای تیم شما بدون در نظر گرفتن اینکه از چه سرور، ماشین یا سیستم عاملی استفاده میکنند با روشی یکسان کار میکنند. دیگر نیاز نیست تا کارکنان شما درباره مشکلات پلتفرمی با هم مسئله و بحث داشته باشند. در داکر تنها کافی است تا بهسادگی ایمیج درست کنید و اعضای تیم از طریق این ایمیجها با هم تعامل داشته باشند
خودکارسازی
بهعنوان یک دولوپر، تسکهای زیادی وجود دارد که زمانی که بهصورت دستی انجام میشود، میتواند تکراری و یکنواخت باشد. داکر کانتینرها این اجازه را به شما میدهند تا بدون دخالت دستی از طرف عامل انسانی، برای طیفی از تسکها برنامه زمانی ایجاد کنید تا در زمان مشخص شده اجرا شوند. این ویژگی، باعث صرفهجویی در زمان، انرژی و کاهش حجم و فشار کاری توسعهدهندگان میشود.
ثبات
docker بر پایه لینوکس است و به این ترتیب، فارغ از این که بر روی چه سیستمی اجرا میشود در هر کانتینر لینوکس کرنل دارد. این مسئله در گذشته، ممکن بود وقتی که کانتینرها را بر روی مک یا ویندوز اجرا میکردید باعث مشکلات کوچکی در حوزه ثبات و پایایی شود. امروزه، حتی با اینکه docker مرتب بهروزرسانی میشود، محیط در هر سیسستم یا دیوایس ثابت باقی میماند.
این یعنی نیازی نیست ناگهان به آپدیتهای قدیمیتر برگردیم یا به خاطر ناسازگاریهای پیشبینینشده نگران باشیم.
صرفهجویی در منابعی مانند فضا
قبل از کانتینرها بیشتر از ماشینهای مجازی استفاده میشد. VMها تقریباً همان کاری را میکنند که کانتینرها انجام میدهند، با این تفاوت که در ماشینهای مجازی حجم زیادی از فضای سرورهای فیزیکال و حافظه اشغال میشود. کانتینرهای داکری برای اپ و وابستگیهایش فقط از کد استفاده می کنند و کاملاً بر روی کلود می توانند اجرا شوند.
معایب داکر
مشکلات مربوط به مستندات
داکر بهسرعت در حال رشد و پیشرفت است و دائما بهروزرسانی میشود. همین مسئله باعث شده است تا شکافی بین مستندات آن و تغییرات و بهروزرسانیهای آن پیش آید. با اینکه همین حالا هم مستندات فنی خوبی از docker وجود دارد ولی به نظر می رسد هنوز در بعضی از حوزهها مانند کار با داکر بر روی مک یا ویندوز مشکلاتی از نظر مستندات فنی وجود داشته باشد.
مشکلات عملکردی در محیطهای غیربومی
با اینکه مک بر پایه لایه یونیکسی بومی قرار دارد، docker برای اینکه عملیاتهایش را انجام دهد همچنان به کرنل لینوکسی واقعی نیاز دارد. برای کار با داکر بر روی مک کاری که می توانید انجام دهید این است که ماشین مجازی حاوی کرنل درست کنید. در این حالت شما بهجای اینکه با این کرنل تعامل مستقیم داشته باشید با کانتیرهای درون VM تعامل میکنید.
مسائل مربوط به یادگیری کار با داکر
یادگیری کار با داکر میتواند کمی زمان بر باشد. مفاهیم بسیار زیادی در این حوزه وجود دارد که شما باید با آن آشنایی داشته باشید. همچنین بعضی از این مفاهیم تفاوت های اندکی با مفاهیم مربوط به ماشین مجازی دارند که ممکن است در ابتدا برای تان کمی گیج کننده باشد.
چه شرکتهایی از داکر استفاده میکنند؟
همانطور که در ابتدای این مطلب اشاره کردیم، docker امروز یکی از محبوبترین ابزارها در میان برنامهنویسان و توسعهدهندگان است. بنابراین عجیب نیست که بسیاری از شرکتهای بزرگ فناوری جهان به سمت استفاده از این ابزار رفته باشند. در این جا برای نمونه ما چند شرکت بزرگ را برایتان لیست کردهایم:
- ادوبی
- نتفلیکس
- پیپال
- اینتگریت
جمعبندی
داکر دائما در حال پیشرفت است و جامعه بسیار فعالی دارد. همه این ها به این معناست که docker تا چند سال آینده همچنان یکی از ابزارهای محبوب و کاربردی برنامهنویسان خواهد ماند. بهترین راه یادگیری هر ابزاری استفاده از آن ابزار است. بدون تمرین رانندگی، رانندگی هم ممکن نیست. اگر صاحب کسبوکار هستید و میخواهید از داکر در چرخه حیات اپلیکیشنتان استفاده کنید بهتر است به سراغ پلتفرمهایی بروید که خدمات مربوط به docker و کوبرنتیز را بهصورت سرویس به شما ارائه میکنند. پلتفرم ابری دارکوب یکی از سرویسهایی است که فرایند ساخت و استقرار اپلیکیشنهای کانتینری و داکرایز شده را برایتان تهسیل میکند.