خانه / architecture / مفهوم داکر و کانتینر(بخش اول)

مفهوم داکر و کانتینر(بخش اول)

تصمیم گرفتم یکی از کتابها مربوط به داکر ترجمه کنم و بخش به بخش قرار بدم در داخل وب سایت اسم کتاب Docker in Practice که فصل به فصل قرار میدم داخل وب سایت

قبل از اینکه در مورد داکر صحبت کنیم فرآیند پروژه به چه صورت بود 

زمانی که پروژه نرم افزاری قرار بود ریلیز شود باید ۳ فرایند را طی می کرد مرحله اول توسعه بود بعد از اینکه توسعه نرم افزار مربوطه یا وب سایت مربوطه به اتمام می رسید باید به مرحله بعدی که مرحله تست بود ارسال میشد بعد از اینکه تست محصول مربوطه به پایان میرسید ارسال میشود به محیط live یا product ارسال می شود مساله ایی که وجود دارد شما برای کار با هر یک از این محیط ها یا به قولی ارسال به هر یک از این محیط ها نیازمند این است که سه ابزار مختلف یاد بگیرید

برای ارسال به محیط توسعه از vagrant استفاده می شود و برای ارسال به محیط تست و تست محصول از jenkins استفاده می شود و برای ارسال به محیط product یا live از ابزار تحت عنوان chef استفاده می شود

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

قبل از اینکه دستمان را کثیف کنیم ، کمی داکر را مورد بحث قرار می دهیم تا زمینه آن را بفهمید ، نام “داکر” از کجا آمده است ، و چرا اصلاً از آن استفاده می کنیم!

داکر چیست

در گذشته زمانی که تجار میخواستند کالایی را برای ارسال به خارج نقاط با استفاده از کشتی ارسال کنند نیازمند کارگرهای زیادی بود تا این کالا ها که اندازه های مختلفی داشتند جابه جا کنند که باعث به وجود آمدن هزینه زیادی می شود و دنبال این بودن که با روشها بهتر هزینه را کمتر کنند شکل ۱٫۲ اگر نگاه کنید استخدام افراد کار ساده ایی نبود 

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

سوال : چگونه زمان و هزینه خود را با داکر کم کنیم 

اگر نیم نگاهی به تصویر زیر بندازید میبینید اگر نیاز باشد که شما یک محصول یا یک نرم افزاری را در محیط های مختلف ران کنید نیازمند هزینه زیادی است جهت نصب محصول مورد نظر فرض کنید که شما میخواهید یک وب سایت اجرا کنید در سه محیط مختلف پس در مرحله اول نیازمند این است که وب سرویس به عنوان مثال nginx را نصب کنید و در مرحله بعدی ماژولهای مربوط به زبانی که وب سایت مورد نظر را توسعه دادید را نصب کنید تصور کنید چون میخواهید روی سه محیط مختلف اجرا کنید باید انرژی و زمان صرف کنید روی سه محیط مورد نظر نصب کنید که در بخش اول تصویر قابل رویت است

خوب داکر چگونه این زمان و هزینه را برای ما نصف میکند نیم نگاهی به تصویر زیر بخش دوم اگر بیندازید می بینید که از تمام پروژه شما یک image میسازیم و بعد از ساخت image آنها را در سه ماشین یا سه محیط اجرا میکنید بدون گذاشتن زمان و صرف هزینه 

Docker برای چی خوب است؟

برخی از سوالات عملی مهم مطرح می شوند: چرا شما از داکر استفاده می کنید ، و برای چه چیزی؟ 

که به طور کامل در بخشهای بالا توضیح داده شد

جایگزین برای ماشینهای مجازی (VM):

داکر را می توان در بسیاری از موارد جایگزین ماشینهای مجازی کرد و مورد استفاده قرار داد اگه اهمیت شما بیشتر روی نرم افزار است نه سیستم عامل پس بهتر است اگر چنین سیاستی وجود دارد ماشین مجازی را ترک کنید

نه تنها داکر سبک تر است نسبت به ماشینهای مجازی بلکه به دلیل سیستم فایل لایه ایی که دارد(بعد توضیح داده می شود) می توان تغییرات آسان و سریع تری را اعمال کرد و این تغییرات به راحتی به اشتراک گذاشت 

نگرانی در مورد سیستم عامل به شخص دیگری. نه تنها Docker برای چرخش سریع سریعتر از یک VM است ، بلکه حرکت سبک تر نیز دارد و به دلیل سیستم فایل لایه ای آن ، می توانید تغییرات آسان و سریع تری را با دیگران به اشتراک بگذارید. همچنین کاملاً ریشه در خط کامنت دارد و کاملاً قابل فیلمبرداری است.

بسته بندی  نرم افزار (PACKAGE SOFTWARE) :

از آنجا که یک image داکر به هیچ وجه وابستگی خاصی برای کاربر لینوکس ندارد ، این یک راه عالی برای بسته بندی نرم افزار است. می توانید image خود را بسازید و مطمئن باشید که می تواند روی هر دستگاه مدرن لینوکس اجرا شود. بدون نیاز به JVM ، به Java فکر کنید بسیار جذاب است.

شبکه مدرن :

شما میتوانید صدها یا هزاران محیط ایزوله داشته باشید که با هم با استفاده از شبکه در ارتباط باشند و یا هیچ ارتباطی بین این محیط های ایزوله نباشد

در تصویری زیر concepts از داکر را به تصویر می کشیم :

Container : اگر بخواهیم کمی در مورد تصویر بالا توضیح دهیم چندین کانتینر از روی image ساخته شده که به راحتی برای کلاینتها برای استفاده از اپلیکیشن قابل دسترس است(در تصویر بالا سمت راست)

image: یک تصویر مجموعه‌ای از لایه‌های سیستم collection و برخی metadata است. به طور کلی، آن‌ها را می توان به عنوان کانتینر docker به کار برد. 

لایه ها: یک لایه مجموعه ای از تغییرات در collection ها است. تفاوت بین v1 و v2 My Application در این لایه ذخیره می شود. منظور از این توضیحات این است که اگر قرار باشد شما کانتینر هایی از روی یک image درست کنید در فایل این کانتینرها شبیه هم نیست یا به قولی کپی نمی شود همه کانتینرها بلکه فقط تغییرات در بقیه کانتینرها قرار می گیرد این تغییرات در بخش لایه که در تصویر بالا سمت چپ بخش دوم آن آورده شده است

بیایید نگاهی به دستورات داکر بندازیم

در مرحله اول توضیحی می دهیم هر دستور چیکار میکند تا یک ذهنیتی برای شما به وجود بیاید بعد به طور کامل توضیح می دهیم چطوری کار میکند 

      Docker build :

  این دستور برای شما از اپلیکیشنی که دارید یک imag می سازد برا شما

     Docker run :

برای اجرا یا ساخت کانتینر از روی image استفاده می شود که اجرا میکند کانتینر مورد نظر 

    Docker commit :

از دستور commit برای این استفاده می شود که شما یک تغییراتی در کانتنر ساخته شده داده اید و می خواهید این کانتینر را تبدیل به ایمیج کنید و این تغییراتی که دادید باقی بماند برای باقی ماندن این تغییرات از commit که بسیار شبیه commit گیت است استفاده میکنید

   Docker tag :

از تگ برای رفرنس دادن استفاده میشود

تصویر و کانتینر  چیست :

اگر اولین بار است که کلمه image و container را میشنوید خیلی اهمیت دارد تفاوت این دو کلمه را بدویند پس لطفا کمی وقت بگذارید که چه تفاوتی با هم دارد که در تصویر زیر به صورت شماتیک برای شما مشخص کردیم

اگر با اصول شی گرا آشنا هستید ، راه دیگر برای مشاهده image و container این است که image را به صورت کلاس و container به عنوان اشیا مشاهده کنید. به همان روشی که اشیاء نمونه های خاص کلاس ها هستند ، container نمونه ای از image هستند.

شما می توانید چندین image را از یک image واحد ایجاد کنید ، و همه آنها به همان روشی که اشیاء هستند از یکدیگر جدا می شوند.

ساخت اپلیکیشن در داکر

اکنون با ساختن یک image ساده برای انجام کار (todoapp) با Docker می خواهیم دستمان را کثیف کنیم. در این فرآیند ، برخی از ویژگی های کلیدی Docker مانند پرونده های Docker ، استفاده مجدد از تصویر ، قرار گرفتن در معرض پورت و ساخت اتوماسیون را مشاهده خواهید کرد. آنچه در ۱۰ دقیقه آینده یاد خواهید گرفت:

چگون با استفاده از داکر

فایل Dockerfile بتوانیم یک image در docker درست کنیم

چگونه با استفاده از tag در داکر به آسانی رفرنس بدیهیم

چگونه اجرا کنیم یک docker image

برنامه انجام کار برنامه ای است که به شما کمک می کند تا کارهایی را که می خواهید انجام دهید پیگیری کنید. برنامه ای که ما ساخته ایم رشته های کوتاهی از اطلاعات را که می تواند به عنوان انجام شده مشخص شود ، در یک رابط وب ساده ارائه و ذخیره می کند. شکل ۱٫۶ نشان می دهد که با این کار به چه چیزی دست خواهیم یافت.

شما Dockerfile را با تعریف تصویر پایه با دستور FROM شروع می کنید. در این مثال از یک تصویر Node.js استفاده می شود بنابراین به binary های Node.js دسترسی دارید. تصویر رسمی Node.js گره نامیده می شود.

سوالی که مطرح می شود این است که چگونه اپلیکیشن خود را در بستر داکر فایل درست کنیم که در ادامه ساختار داکر فایل توضیح میدهیم دو روش برای استفاده از داکر فایل وجود دارد یکی که این فایل کنار اپلیکیشن تون قرار دهید یکی هم این است که داخل فایل داکر فایل بگویید از گیت پروژه را دریافت کند و build در بستر داکر مسئله ایی که خیلی برای ما قابل اهمیت هست این است که زمانی که شما پروژه را build میکنید میتوانید پروژه را استاپ یا استارت کنید و همچنین اشتراک بزارید با بقیه توسعه دهنده ها کدی که توسعه دادید و در بستر خود دوستان استفاده کنند

نوشتن Dockerfile :

تصویری که در بالا قابل رویت است نمونه ساختاری از داکر فایل است که برای ارسال اپلیکیشن خود در بستر داکر قابل استفاده است

که هر بخش در تصویر توضیح داده شده است که بخش اول نوع image را مشخص میکنیم که در این مثال imageکه استفاده شده است خود node هست که شما میتوانید از image ای سیستم عامل هم استفاده کنید و نود را روی آن نصب کنید در بخش دوم شخصی که میخواهد این imageا درست کند یا به قولی سازنده آن تصویر را درست میکنیم بخش سوم پروژه را از گیت کلون میکند بخش چهارم اسم فایلی که پروژه داخل آن است را مشخص میکند و میرود داخل آن بخش پنجم هم ماژولهای مورد نظر اپلیکیشن نود را نصب میکند و بخش ششم که چه پورتی روی کانتینر باز شود و گوش دهد را مشخص میکند و بخش انتهایی کامندهایی که میخواهد اجرا شود را مشخص میکند که در این مثال پروژه را اجرا می کند

زمانی که شما فایل Dockerfile را ساختید با دستور build می توانید اپلیکیشن مورد نظر را بفرستید در بستر داکر

زمانی که شما از روی Dockerfile می آیید image میسازیم از اپلیکیشن تون برای اپلیکیشن مربوطه ای دی یا شناسه ایی از ترکیب حروف و عدد برای شما میسازد که اگر تعداد image های شما زیاد باشد حفظ کردن همه این شناسه ها پیچیده است برای اینکه بهتر بتوان دسته بندی کرد و بهتر در ذهن باقی بماند از امکانی که داکر در اختیار ما قرار میدهد استفاده میکنیم تحت عنوان tag

ساخت کانتینر از روی image :

در بخش های قبلی توضیحاتی در مورد اینکه کانتینر چیست و چه تفاوتی با هم دارند را توضیح دادیم در این بخش ساخت کانتینر از روی image را مورد بررسی قرار می دهیم

docker run -i -t -p 8000:8000 –name example todoapp

روی کانتینر پورت ۸۰۰۰ را مشخص میکنیم برای کانتینر نکته اگر توجه کرده باشید در مثالی که در مورد داکر فایل زدیم پورتی که ما مشخص کردیم پورت ۸۰۰۰ بود بخاطر همین پورت را برای کانتینر بخش دوم پورت ۸۰۰۰ قرار دادیم بخش اول هم پورت کانتینر  را مشخص کردیم که روی چه پورتی گوش بدهد

بعد از اینکه دستور مربوطه را اجرا کردید با دستور docker ps می توانید وضعیت آخرین کانتینرهای ساخته شده را ببینید  اما متاسفانه چیزی از کانتینری که ساختید خبری نیست چون شما در دستور مربوطه از آرگومان d- استفاده نکردید پس کانتینر شما در وضعیت Exit به سر میبرد برای دیدن این وضعیت شما از دستور زیر استفاده میکنید تمام کانتینرها با هر وضعیتی را به شما نشان می دهد

docker ps -a    or docker ps –all

ساختار لایه ایی داکر به چه صورت است:

لایه بندی داکر به شما کمک می کند تا یک مشکل بزرگ را که هنگام استفاده از کانتینر در مقیاس استفاده می کنید ، مدیریت کنید.

تصور کنید که اگر صدها یا حتی هزاران نفر از برنامه to-do app را راه اندازی کنید ، چه اتفاقی می افتد و کپی از یک اپلیکیشن که شبیه هم است درست میشود که شاید به نظر جالب نباشد کپی از پروژه اگر اینطوری بود که از پروژه با پورت های مختلف بدون کانتینر اجرا می کردیم نیازی هم به کانتینر نبود (صحبت خارج از کتاب) 🙂

همانطور که تصور می کنید فضای دیسک خیلی سریع تمام می شود! به طور پیش فرض ، داکر در داخل از مکانیزم copy-on-write برای کاهش میزان فضای دیسک مورد نیاز استفاده می کند (شکل زیر را ببینید).

هر زمان که یک کانتینر در حال اجرا، نیاز به نوشتن یک فایل داشته باشد ، با کپی کردن آن از قسمت جدید دیسک ، این تغییر را ثبت می کند. وقتی تعهد Docker انجام شد ، این قسمت جدید disk frozen می شود و به عنوان یک لایه با شناسه خاص خود رکورد می شود.

این تا حدودی توضیح می دهد که چگونه کانتینر می توانند خیلی سریع راه اندازی شوند. آنها هیچ چیزی برای کپی کردن ندارند زیرا همه داده ها قبلاً به عنوان image ذخیره شده اند.

هر بلوک تفاوت های یک کانتینر در حال اجرا را از image اصلی ToDoApp نشان می دهد. از فضای دیسک بسیار کمتری استفاده می کند.

در تصویر بالا شما ساختار لایه ایی اپلیکیشنی که ساختید را میبینید

فصل اول کتاب به پایان رسید در ادامه بقیه فصلها را قرار می دهیم

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *