Docker imageها اجزای ضروری مورد نیاز برای ساخت Docker containerها هستند. اگرچه این دو ارتباط تنگاتنگی با هم دارند؛ اما تفاوت عمده‌ای بین image و container در docker وجود دارد.

Docker image، پایه و اساس یک container است. این imageها با نوشتن یکسری دستورات در Dockerfileها بطور خودکار ایجاد می‌شوند.

در واقع Image ها همانند نقشه‌های یک ساختمان می‌باشند و Container ها همانند ساختمان و یا ساختمان‌های ساخته شده از آن نقشه می‌باشند.

معمولاً پس از ساختن Docker image، کاربر می‌خواهد از کوچک ماندن سایز آن اطمینان حاصل کند؛ چرا که هرچه imageها کوچک‌تر باشد، سرعت ساخت و استقرار containerها افزایش می‌یابد. بنابراین، بسیار مهم است که اندازه image را همواره برروی حداقل نگه دارید.

به منظور یادگیری نحوه کوچک نگه داشتن سایز Docker imageهای خود به ادامه مطلب بروید.

 

 

استفاده از کوچک‌ترین پایه image

برای ایجاد یک Docker image، شما به پایه‌ای نیاز دارید که بر روی آن بتوانید اجزاء را در صورت نیاز نصب و اضافه کنید. بدین منظور شما می‌توانید، یک image والد موجود را بارگیری کرده و از آن به عنوان پایه image خود استفاده نمایید یا از ابتدا آن را بسازید.

شما یک نوع از یک سیستم عامل را به عنوان پایه یک image نصب می‌کنید. پایه سیستم عامل می‌تواند به شدت بر اندازه image نهایی Docker شما تأثیر بگذارد؛ به همین دلیل تصمیم گیری در مورد image مناسب نقش مهمی را ایفا می‌کند.

یکی از سبک‌ترین سیستم‌عامل‌های لینوکس Alpine می‌باشد که فوق که سبک است و دارای حداقل محیط POSIX است. Alpine، پایه image توزیع لینوکس با سایز تنها 5 مگابایت است که در حدود musl libc و BusyBox ساخته شده است.

در مقایسه با سایر imageهای سیستم عامل، اندازه Alpine بسیار کوچک‌تر است. کوچک‌ترین image یک سیستم عامل بارگیری شده (اوبونتو)، 188 مگابایت است؛ در حالی که Alpine تنها 5 مگابایت است.

 

این مطلب نیز ممکن است برای شما مفید باشد: ایجاد و اجرای Docker Image با استفاده از Dockerfile

 

استفاده از فایل .dockerignore

حذف فایل‌های خاصی که برای image شما ضروری نیستند، می‌تواند به شما در کاهش اندازه image کمک کند. در چنین مواردی است که فایل dockerignore. وارد عمل می‌شود.

هنگام ساختن (build) یک image، شما یک Dockerfile با مشخصات مورد نیاز برای آن image می‌نویسید.

هنگام ساخت image، باید یک فایل dockerignore. در همان پوشه Dockerfile ذخیره نمایید.

این ویژگی Docker با دستور docker run مقداردهی اولیه می‌شود. بدین صورت سیستم بررسی می‌کند که آیا چنین فایلی وجود دارد. در صورتی‌که وجود داشته باشد، استثنائات (exceptionهای) آن را اعمال کرده و قوانین (ruleها) را نادیده می‌گیرد. به این ترتیب، هرگونه محتوای نامربوط را از تنظیمات build حذف می‌کنید.

 

استفاده از ویژگی buildهای چند مرحله‌ای در Docker

Docker، ویژگی چند مرحله‌ای را در نسخه 17.05 خود معرفی کرد. این ویژگی، به کاربران امکان می‌دهد Dockerfile را به چند مرحله تقسیم نمایند.

هر مرحله با یک دستور FROM شروع می‌شود و سپس پارامترهای مورد نیاز به مرحله بعدی منتقل می‌شوند و مواردی که در ساخت image نهایی به آن احتیاج ندارید، در مراحل بعدی انتقال نمی‌یابند.

از آنجا که این فرآیند، تنها اجزای ضروری را منتقل می‌کند، لازم نیست بعد از هر دستورالعمل، تمیزکاری انجام دهید (اجزایی را حذف نمایید).

با ویژگی چند مرحله‌ای، از افزودن لایه‌های غیر ضروری، که تأثیر قابل توجهی بر اندازه کلی image دارد، جلوگیری می‌شود.

 

خودداری از افزودن لایه‌های غیر ضروری برای کاهش اندازه Docker image

یک image Docker با هر لایه‌ای که به آن اضافه می‌کنید، فضای بیشتری را اشغال می‌کند. بنابراین، هرچه لایه‌های بیشتری داشته باشید، فضای بیشتری برای image نیاز دارد.

هر دستورالعمل RUN در Dockerfile، یک لایه جدید به image شما می‌افزاید. به همین دلیل است که شما باید ویرایش فایل را در یک دستور RUN انجام دهید. همچنین، دستورات مختلف را در یک دستور با استفاده از گزینه && ترکیب نمایید.

به عنوان مثال، شما می‌توانید در یک دستور RUN واحد، مخزن را به روز کرده و چندین بسته نصب نمایید. به منظور بدست آوردن یک خط جامع و واضح، از backslash (یعنی کاراکتر "/") برای تایپ فرمان در چند خط استفاده کنید.

جدا از به روزرسانی و نصب بسته‌ها، باید حافظه apt را با دستور rm -rf /var/lib/apt/lists/* && پاک کنید تا فضای بیشتری آزاد نمایید.

RUN apt-get update && apt-get install -y\
         [package-one] \
         [package-two] 
   && rm -rf /var/lib/apt/lists/*

دستورات فوق در یک ایمیج مبتنی بر دبیان و یا اوبنتو می‌باشد.

 

جلوگیری از به روز رسانی‌ها و نصب بسته‌های غیر ضروری و وابستگی‌ها

یک راه دیگر برای صرفه جویی در فضا و کوچک نگه داشتن Docker image این است که مطمئن شوید، آخرین نسخه پلتفرمی را که ایجاد کرده‌اید، اجرا می‌کنید.

با داشتن جدیدترین نسخه، از به‌روزرسانی‌های گسترده‌ای که بسته‌های بسیاری را بارگیری کرده و فضای زیادی را اشغال می‌نمایند، جلوگیری می‌کنید.

توجه: در صورت نیاز به بروزرسانی، حتماً rpm cache را پاک کرده و گزینه dnf clean all را به صورت زیر اضافه نمایید:

RUN dnf -y update && dnf clean

نصب یک بسته نیز اغلب شامل بارگیری وابستگی‌هایی است که نرم افزار به آن متکی است. با این حال، گاهی اوقات، بسته‌هایی که مورد نیاز نیستند؛ اما توصیه می‌شوند را نیز ذخیره می‌کند.

چنین بسته‌های ناخواسته می‌توانند فضای زیادی را مصرف کنند. بدین منظور، برای بارگیری تنها وابستگی‌های اصلی، گزینه --no-install-rekomands را به دستور install اضافه نمایید.

مثلا:

RUN apt-get install --no-install-recommends [package-one]

 

این مطلب نیز ممکن است برای شما مفید باشد: حذف imageها، containerها و Volumeهای Docker

 

نکته آخر

اگرچه این نکته بر اندازه کلی Docker image تأثیر نمی‌گذارد؛ اما به ساخت سریع‌تر Docker کمک می‌کند.

Docker، با ذخیره کردن محلی لایه‌های موجود یک Dockerfile و استفاده از آن برای بازسازی سریع‌تر imageها، ساخت image را سرعت می‌بخشد.

به عنوان مثال، تصور کنید یک Dockerfile ساده دارید که از سه لایه تشکیل شده است. هنگامی‌که imageای از آن فایل ایجاد می‌نمایید، سیستم به طور خودکار این سه لایه را ذخیره می‌کند. دفعه بعد که image را می‌سازید، از حافظه (cache) محلی بارگیری می‌شود.

اگر تصمیم دارید image را ویرایش کرده و یکی از لایه‌ها را تغییر دهید، پس از ویرایش لایه، حافظه نهان (cache) برای هیچ مورد دیگری استفاده نمی‌شود.

توصیه می‌کنیم دستورالعمل‌ها را به نحوی ترتیب دهید که کارایی را افزایش داده و از ویژگی ذخیره سازی استفاده کند. دستورالعمل‌هایی را که احتمال تغییر آن‌ها وجود دارد، تا حد ممکن در پایین Dockerfile قرار دهید.

 

 

 

منبع:

phoenixnap