در فرایند توسعه و مدیریت اپلیکیشنها و همچنین استفاده از داکر برای استقرار آنها، یکسری مفاهیم و تکنولوژیها هستند که نقش حیاتی را ایفا میکنند و نیاز است که شما هم با این موارد به خوبی آشنا شوید.
Docker Image یکی از آن دست مفاهیم است که در چرخه DevOps و مدیریت داکر از نقش بسیار مهمی برخوردار است.
داکر ایمیج به فایلهایی گفته میشود که تمام اطلاعات و نیازمندیهای اساسی یک اپلیکیشن در جهت اجرا شدن را در خود ذخیره میکنند.
در این مقاله از وبلاگ همروش قصد داریم شما را به صورت کامل با چیستی داکر ایمیج آشنا کنیم و سپس از ساختار و چگونگی ایجاد یک داکر ایمیج صحبت کنیم. مواردی که در این مطلب گفته خواهند شد مقدمات اساسی و بسیار ضروری برای کار با داکر است.
داکر ایمیج (docker image) چیست؟
داکر ایمیج یکی از اساسیترین بخشهای کلیت سیستم Docker است که کدهای اجرا شدنی را در خود نگهداری میکند.
هر داکر فایل به عنوان مجموعهای از دستورالعملها در نظر گرفته میشود که به ایجاد Docker Container منجر میشود.
میتوانید به داکر فایل بهعنوان یک شکل از Template یا شیوهنامه فکر کنید. برای اینکه بتوانید پروسهها و کارهای مربوط به یک سیستم Docker را پیش ببرید، نیاز است که از چیستی داکر ایمیج و اینکه چگونه تعریف میشود آگاهی کسب کنید. اگر قبلا با ماشینهای مجازی یا Virtual Machine کار کرده باشید میتوانید جایگزین داکر ایمیج را در VM همان اسنپشات یا Snapshot در نظر بگیرید.
همانطور که میدانید ما از داکر برای ایجاد، اجرا و استقرار اپلیکیشنها در کانتینر استفاده میکنیم.
داکر ایمیج در این پروسه برای اینکه در فرایند اجرا اپلیکیشن به ما کمک بکند یکسری کد، کتابخانه، ابزارها، ملزومات و… را در خود نگهداری میکند.
پس هدف نهایی هر داکر ایمیجی این است که اپلیکیشن مورد نظرمان را در داکر اجرا کند. زمانی که یک کاربر داکر ایمیجی را اجرا کند این داکر ایمیج میتواند به یک یا چندین نمونه از کانتینر تبدیل شود.
داکر ایمیجها از چندین لایه مختلف تشکیل میشوند که نقطه تشکیل هر لایه مربوط به لایه قبل از خود خواهد بود. این ساختار لایهای باعث میشود که سرعت انجام فرایند Build کردن افزایش پیدا کند، قابلیت استفادهپذیری مجدد از امکانات بیشتر شود و در نهایت فضای کمتری از حافظه ذخیرهسازی اشغال شود.
لایهها به صورت فایلهای Read-Only ذخیره میشوند. همچنین زمانی که شما یک داکر ایمیج را ایجاد کنید دیگر امکان تغییر آن وجود ندارد. در این حالت اگر بخواهید یکسری تغییرات را اعمال کنید، ابتدا باید یک کانتینر دیگر را همراه با تغییرات مد نظرتان ایجاد کرده و سپس آن را به عنوان یک ایمیج دیگر ذخیره کنید.
در ادامه مقاله به صورت کاملتر راجع به اینکه چگونه داکر ایمیج را ایجاد کنیم صحبت خواهیم کرد.
هر داکر ایمیج را میتوانید بهصورت خصوصی (تنها برای استفاده خودتان یا افرادی منحصر به فرد) یا عمومی تعریف کنید. این موضوع را ما قبلا در مقاله «داکر هاب چیست؟» بهصورت کامل بررسی کردهایم و همچنین در ادامه همین مطلب اشارهای کلی به آن خواهیم داشت.
به عنوان یک نکته مهم این را بدانید که ایمیجها براساس هسته سیستم عامل میزبانی اجرا میشوند.
برای مثال برای ایجاد ایمیج یک وب سرور ابتدا باید یک ایمیج که شامل هسته اصلی سیستم عامل (برای مثال Ubuntu Linux) را اجرا کنید و سپس پکیجهایی مانند Apache یا PHP را به آن اضافه کنید.
ساختار داکر ایمیج
یک داکر ایمیج شامل لایههای بسیار زیادی میشود و هر لایه در فرایند مدیریت و توسعه کلیت سیستم به ما کمک میکند.
برای اینکه بتوانیم بهصورت دقیقتری با ساختار یک داکر ایمیج آشنا شویم بیایید با مهمترین قسمتهای آن آشنا شویم:
Base Image یا ایمیج پایه
بیس ایمیج به اولین لایهای از داکر ایمیج گفته میشود که مستقیما توسط کاربر از ابتدا ایجاد شده است.در واقع این ایمیج از طریق دستور build ایجاد میشود. این ایمیج یک لایه خالی به حساب میآید که به کاربران اجازه میدهد تا اولین داکر ایمیج خود را ایجاد کنند. البته هیچ ضرورتی ندارد که شما از ابتدا این ایمیج را ایجاد کنید بلکه میتوانید در این مرحله از داکر ایمیجهای رسمی که به صورت عمومی در اختیار همگان قرار گرفته نیز استفاده کنید.
Parent Image یا ایمیج والد
ایمیج والد در بیشتر حالتها بهعنوان اولین لایه از یک داکر ایمیج شناخته میشود. این لایه بهعنوان پایه اصلی لایههای دیگر در نظر گرفته شده و لایههای دیگر براساس این لایه به کلیت فرایند داکر ایمیج اضافه میشوند.
هر لایه در داکر ایمیج را میتوانید از طریق دستور مربوط به تاریخچه داکر مشاهده کنید، همچنین این لایهها در دایرکتوری /var/lib/docker/aufs/diff ذخیره شده و میتوانید با ورود به این دایرکتوری آنها را ببینید.
بهصورت پیشفرض داکر تمام ایمیجهای Top-Layer را نشان میدهد. این بخش شامل مخازن، تگها و اندازه فایلهاست. همچنین داکر برای مدیریت محتوای لایهها از یک Storage Drive استفاده میکند.
Container Layer یا لایه کانتینر
داکر ایمیج فقط یک کانتینر جدید ایجاد نمیکند، بلکه یک لایه کانتینر با قابلیت تغییر و بازنویسی را نیز ایجاد میکند. این لایه تمام تغییراتی را که در کانتینر در حال اجرا اعمال کردهاید در خود ذخیره میکند.
همچنین اطلاعات مربوط به فایلهای ویرایش و حذف شده در این بخش ذخیره میشود. در نهایت این لایه یک استفاده دیگر نیز دارد که مربوط به سفارشیسازی کانتینرها میشود.
مانیفست داکر
این بخش از داکر ایمیج در واقع یک فایل اضافیست که با استفاده از JSON نوشته شده و شرح کلی ایمیج و اطلاعات مربوط به آن را در خود ذخیره میکند.
چطور یک داکر ایمیج بسازیم؟
این بخش از داکر ایمیج در واقع یک فایل اضافیست که با استفاده از JSON نوشته شده و شرح کلی ایمیج و اطلاعات مربوط به آن را در خود ذخیره میکند.
چطور یک داکر ایمیج بسازیم
بهصورت کلی میتوان به دو روش یک داکر ایمیج ایجاد کرد. روش اول روش تعاملی یا Interactive Method و روش دوم استفاده از داکر فایل یا Dockerfile Method نام دارد. در ادامه قصد داریم به صورت کلی هر کدام از این موارد را بررسی کنیم:
روش تعاملی یا Interactive Method
در این روش، کاربران یک یک کانتینر را از طریق یک داکر ایمیج از پیش موجود اجرا کرده و بهصورت دستی تمام تغییراتی که نیاز دارند را در آن اعمال میکنند.
بعد از انجام این موارد در نهایت ایمیج مورد نظر را ذخیره میکنند. متد ایجاد داکر ایمیج به صورت تعاملی سادهترین و کمچالشترین روش برای ایجاد داکر ایمیج است.
در اولین قدم باید داکر را اجرا کرده و وارد ترمینال شوید، بعد از اینکار با استفاده از دستور run و مشخص کردن نام و تگ ایمیج داکر ایمیج مورد نظر را میتوانید دریافت و اجرا کنید.
در دستور بالا اگر مقدار تگ را مشخص نکنید، داکر بهصورت پیشفرض آخرین نسخه از ایمیج مورد نظر را تحویل میدهد
استفاده از داکر فایل یا Dockerfile Method
روش دوم به نسبت حالت قبلی کمی چالش برانگیزتر است. در این روش ابتدا باید یک فایل متنی ساده dockerfile را ایجاد کنید.
در این فایل اطلاعاتی قرار میگیرد که با استناد به آنها ایمیج مورد نظر شما ایجاد میشود. البته با وجود اینکه این روش کمی سختتر از حالت قبلیست اما دقیقتر رفتار کرده و در بحث CD یا Continuous Delivery رویکرد استانداردتری به شمار میرود.
زمانی که این فایل را ایجاد میکنید نیاز است که با ایجاد یک فایل dockerignore. ، فایلهایی را که در Build نهایی به آنها نیازی ندارید مشخص کنید. در نهایت با استفاده از دستور build و معرفی dockerfile مورد نظر، داکر ایمیج مربوطه ایجاد میشود.
تفاوت Docker Image با Container
داکر ایمیج امکانی برای اجرای دستورات و برنامههای مختلف در یک کانتینر است و در واقع این دو لازم و ملزوم همدیگر هستند.
شما با استفاده از یک داکر ایمیج میتوانید چندین کانتینر متفاوت از همدیگر را ایجاد کنید. منظور از متفاوت از همدیگر این است که هر کدام از این کانتینرها میتوانند دادهها و وضعیت منحصر به فرد خود را داشته باشند.
تفاوت کلیدی که این دو با همدیگر دارند در استفادهپذیری آنهاست. داکر ایمیج در واقع یک قالب تغییرناپذیر است و در تعیین اینکه کانتینر چگونه رفتار کند نقش اساسی ایفا میکند. اما کانتینر در نهایت یک محیط اجرایی برای داکر ایمیج است.
آشنایی با Docker Image Repository
برای ایجاد داکر ایمیج همواره نیاز نیست که همه کارها را از ابتدا انجام دهید بلکه میتوانید از مخزن داکر ایمیج استفاده کنید.
Docker Hub مهمترین مخزن داکر ایمیج است که دو نوع داکر ایمیج را در خود ذخیره کرده و شما میتوانید از طریق آن به داکر ایمیجهای مختلف دسترسی داشته باشید.
یک نوع از داکر ایمیجها به شکل رسمی توسط خود Docker منتشر میشود و شامل تمام تکنولوژیها و ابزارهای پر استفادهای است که بیشتر شرکتها از آن استفاده میکنند.
برای مثال اگر به ایمیج Ubuntu نیاز داشتید بهراحتی میتوانید ایمیج رسمی آن را از طریق Docker Hub در اختیار داشته باشید.
همچنین یکسری داکر ایمیج دیگر وجود دارد که توسط دیگران (مردم عادی، شرکتها و…) ایجاد شدهاند و هر کدام براساس نیازمندیهای مختلف میتواند استفاده شود.
همچنین شما میتوانید داکر ایمیجهای خود را روی داکر هاب قرار دهید. این موارد میتوانند بهصورت خصوصی و عمومی در داکر هاب قرار بگیرند.
اگر داکر ایمیجی دارید که فقط میخواهید خودتان و تیمتان به آن دسترسی داشته باشید میتوانید از فضای خصوصی استفاده کنید.
جمعبندی
Docker Image یکی از مفاهیم کلیدی در مدیریت اپلیکیشنهای کانتینرسازیشده (containerized applications) است که نیاز است بهخوبی با چیستی و چگونگی کارکرد آنها آشنا شوید.
هدف اصلی که ما در این مطلب از وبلاگ همروش دنبال کردیم نیز آشنا کردن شما با چیستی داکر ایمیج، ساختار و روشهای ایجاد آن بود. همچنین ما مقالات دیگری در خصوص Docker و موضوعات مرتبط با آن را در وبلاگ قرار دادهایم که با مطالعه آنها میتوانید بهصورت دقیقتر با این تکنولوژی آشنایی پیدا کنید.