با یادگیری Docker و استفاده از تکنولوژی کانتینرها متوجه خواهید شد که Docker Imageها نقش بسیار اساسی و مهمی را در کانتینرسازی ایفا میکنند. اما بهدنبال آن ممکن است مشکلاتی را نیز بوجود بیاورند. اصلیترین این مشکلات، افزایش حجم اپلیکیشن در هنگام دیپلوی کردن و یا انتقال آن است.
هر چه imageهای شما کوچکتر باشد، فرایند دیپلوی و انتقال سریعتری خواهید داشت. به همین دلیل نیاز است که کارهایی را برای کاهش حجم آنها انجام دهید. در این مطلب قصد داریم شما را با پنج روش برای کاهش حجم داکر ایمیجها آشنا کنیم.
روش اول: بهینهسازی لایهبندیها
اندازه هر Docker Image ارتباط مستقیمی با حجم لایههای آن دارد. در واقع هرچقدر تعداد لایههای ما کمتر و البته کمحجمتر باشد اندازه داکر ایمیج ما نیز کاهش پیدا میکند. برای اینکه بهصورت عملی با کاهش حجم این لایهها آشنا شوید میتوانیم از مثال زیر استفاده کنیم:
FROM python:3.9-slim
RUN apt-get update -y
RUN apt-get install some_package
RUN apt-get install some_other_package
در این مثال میتوانیم با کاهش تعداد دستورهای RUN و نصب پکیجهای مورد نظر تنها با استفاده از یک دستور، حجم داکر ایمیج را کاهش دهیم. برای اینکار کدهای بالا را بهصورت زیر تغییر میدهیم:
FROM python:3.9-slim
RUN apt-get update -y && apt install -y \
package_one \
package_two
با وجود اینکه چنین تکنیکی حجم زیادی را کاهش نمیدهد، اما پس از انجام این عملیات حدود ۱۰ مگابایت از حجم Docker Image مورد نظر را کاهش دادیم:
روش دوم: پکیجهای غیرضروری را نصب نکنید
اگر پکیجهایتان را با استفاده از دستور apt-get
نصب میکنید برچسب --no-install-recommends
را به آن اضافه کنید. این برچسب پکیجهایی که پیشنهاد میشوند در کنار پکیج اصلی نصب شوند (اما ضروری نیستند) را نصب نمیکند. در نتیجه حجم داکر ایمیج شما با نصب نشدن چنین پکیجهایی کاهش مییابد.
در زیر مثالی از این حالت دیده میشود. البته حتما بعد از نصب پکیج مورد نظر آن را تست کنید تا مشکلی بوجود نیاید:
FROM python:3.9-slim
RUN apt-get update -y && apt install -y --no-install-recommends \
package_one \
package_two
با انجام اینکار حجم Docker Image بهنسبت حالت قبلی ۴۰ مگابایت کاهش پیدا کرده است.
روش سوم: پاکسازی کنید!
با نصب برخی از پکیجها و انجام یکسری از عملیاتها، فایلهای اضافی تولید میشوند که حذف کردن آنها به کاهش حجم داکر ایمیج کمک میکند. برای اینکار میتوانید دستور rm -rf /var/lib/apt/lists<em>/*</em>
را اضافه کنید.
FROM python:3.9-slim
RUN apt-get update -y && apt install -y --no-install-recommends \
package_one \
package_two \
&& rm -rf /var/lib/apt/lists/*
پس از اضافه کردن این دستور حجم داکر ایمیج ۴۰ مگابایت دیگر کاهش پیدا کرد.
روش چهارم: استفاده از ایمیجهای کوچکتر
اگر توجه کرده باشید تا اینجا کار ما بجای python:3.9
از python:3.9-slim
استفاده کردهایم. پکیج اصلی پایتون حدود ۱.۳ گیگابایت حجم دارد اما slim حدود ۱ گیگابایت. در نتیجه شما میتوانید ۳۰۰ مگابایت حجم داکر ایمیج خود را کاهش دهید.
اما ایمیجهای بسیار کوچکتری نیز برای چنین حالتی وجود دارد که Alpline نام دارند. برای مثال پکیج python:3.9-alpine
حدود ۴۹ مگابایت حجم داشته و نزدیک به ۲۰ برابر کوچکتر از حالت Slim است. پس بنظر میرسد که بسیار بهتر از هر حالتی باشد؟ بله همینطور است. اما در نظر داشته باشید که نسخه Alpline معایبی دارد:
- مشکلات سازگاری: اگر بخواهیم پایتون را با استفاده از نسخه Alpline نصب کنیم ممکن است برای برخی از کتابخانهها و کدها مشکلات اجرایی بوجود بیاید. در این صورت مطمئن شوید ابزارهایی که از آنها در کنار پایتون استفاده میکنید با نسخه Alpline سازگاری داشته و مشکلات اجرایی ندارند.
- پکیجها: بهنسبت دبیان، توزیع Alpline ممکن است با محدودیتهایی در نصب پکیجهای مختلف روبرو شود. به همین دلیل نیاز است که از وجود پکیجهای مورد نظر در پکیجمنیجر Alpline مطمئن شوید.
روش پنجم: حجم Build Context را کاهش دهید
اگر قصد ساختن داکر ایمیج جدیدی را دارید باید به داکر دسترسی فایلهایی که میخواهید ایمیج از روی آن ساخته شود را بدهید. به این فایلها build context گفته میشود. هر بار که ایمیج مورد نظر ایجاد میشود به این فایلها اشاره خواهد شد. سعی کنید حجم این فایلها را در کمترین حالت ممکن نگهدارید.
جدای از آن، استفاده از فایل .dockerignore
میتواند روشی کاربردی برای بالا بردن امنیت اپلیکیشنتان باشد. اگر برای کپی کردن فایلها به داکر ایمیج از دستوراتی مانند ADD و COPY استفاده میکنید ممکن است فایلهای حساسی را نیز بهصورت اشتباه وارد داکر ایمیج کنید. در این حالت میتوانید لیست این فایلها را در یک فایل .dockerignore
قرار دهید تا از این مشکل جلوگیری کنید.
روشی دیگر: استفاده از تکنیک کامپایل استاتیک
کامپایل استاتیک به فرآیندی اشاره دارد که در آن تمام وابستگیهای مورد نیاز یک برنامه در زمان کامپایل به صورت مستقیم به باینری نهایی اضافه میشوند. در مقابل، در کامپایل داینامیک، وابستگیها و کتابخانههای خارجی به صورت جداگانه در سیستم میزبان حضور دارند و برنامه در زمان اجرا به آنها متصل میشود.
در دنیای داکر و کانتینرها، استفاده از کامپایل استاتیک میتواند به کاهش حجم ایمیجهای داکر کمک کند. این کار به دلایل زیر مفید است:
- حذف وابستگیهای خارجی: وقتی برنامه به صورت استاتیک کامپایل میشود، دیگر نیازی به وجود کتابخانههای خارجی و پکیجهای اضافی در ایمیج داکر نیست، چون همه چیز داخل باینری استاتیک گنجانده شده است. به این ترتیب، میتوان فایلهای غیرضروری را از ایمیج حذف کرد.
- بهینهسازی اندازه ایمیج: با حذف کتابخانههای غیرضروری و فایلهای وابسته، حجم ایمیج به طور قابل توجهی کاهش مییابد. این کاهش حجم باعث بهبود سرعت بارگذاری و استقرار کانتینرها در محیطهای مختلف میشود.
- افزایش امنیت: کامپایل استاتیک همچنین میتواند به امنیت بیشتر کمک کند، زیرا سطح حمله برای وابستگیهای خارجی کمتر میشود. وقتی کتابخانههای داینامیک به ایمیج اضافه نمیشوند، آسیبپذیریهای احتمالی ناشی از آنها نیز کاهش مییابد.
در داکر، برای دستیابی به این روش، اغلب از ایمیجهای بسیار کوچک مانند alpine
یا حتی scratch
استفاده میشود. ایمیج scratch
به عنوان پایهای برای ساخت باینریهای استاتیک کامپایلشده به کار میرود، زیرا هیچ کتابخانهای بهطور پیشفرض در آن وجود ندارد، و تنها چیزی که در ایمیج نهایی باقی میماند، باینری استاتیک خود برنامه است.
آشنایی با ابزار Docker Slim
Docker Slim یک ابزار متنباز است که با هدف بهینهسازی داکر ایمیجها، عملکرد و امنیت آنها را بهبود میبخشد. این ابزار به صورت خودکار بخشهای غیرضروری از ایمیجها را شناسایی و حذف میکند، بدون اینکه تاثیری بر روی عملکرد برنامههای موجود در آن ایمیجها داشته باشد. بهطور خاص، Docker Slim به سه مورد زیر کمک میکند:
- کاهش حجم ایمیجها: Docker Slim با آنالیز ایمیج و بررسی برنامهها و فایلهای مورد نیاز در حین اجرا، فایلها، کتابخانهها و تنظیماتی که برای اجرای برنامه حیاتی نیستند را حذف میکند. این کاهش حجم میتواند تا ۳۰ برابر باشد، که منجر به بهبود سرعت دانلود، بارگذاری و انتقال ایمیجها در شبکه میشود.
- بهبود امنیت: این ابزار با شناسایی و حذف فایلها و وابستگیهای ناامن و غیرضروری، سطح حمله را کاهش میدهد. با کاهش سطح حمله، امکان بهرهبرداری از آسیبپذیریها کمتر میشود. همچنین، Docker Slim میتواند تنظیمات امنیتی بهتری را پیشنهاد دهد و به شما کمک کند تا ایمیجهای امنتری ایجاد کنید.
- سازگاری با تمامی زبانها و فریمورکها: این ابزار از هر زبان برنامهنویسی و فریمورکی که درون داکر اجرا میشود، پشتیبانی میکند. مهم نیست که ایمیج شامل برنامههای Node.js، پایتون، جاوا یا هر زبان دیگری باشد، Docker Slim میتواند فرآیند بهینهسازی را بر روی آن اعمال کند.
نحوه کار Docker Slim به این شکل است که ابتدا ایمیج را اجرا کرده و بررسی میکند که کدام فایلها و کتابخانهها در زمان اجرای برنامه واقعاً استفاده میشوند. سپس با حذف موارد غیرضروری، یک نسخه بهینه شده از ایمیج ایجاد میکند که کوچکتر و امنتر است.
در پایان
در این مطلب، ۵ روش عملی برای کاهش حجم Docker Imageها ارائه شد. انتخاب این روشها براساس تجربههای عملی در پروژههای واقعی و آزمایشهای مختلف بوده است. حجم کمتر، به معنای سرعت بیشتر و عملکرد بهتر است. به همین دلیل این روشها را انتخاب کردیم تا شما نیز بتوانید بهرهوری بیشتری از Docker و کانتینرسازی داشته باشید.