بازی با داکر قسمت دوم - Better Docker Images

در این سری آموزش ها سعی داریم داکر ایمیج ها با استاندارد بالاتری بسازیم که بتونیم در محیط عملیات ازشون استفاده کنیم. در این قسمت به مباحث مقدماتی می پردازیم

راهکار اول : Docker build cache

همینطور که میدانید داکر ایمیج از لایه های مختلف تشکیل شده و برنامه ما لایه هایی رو به لایه های ایمیج اولیه اضافه میکنه . حالا اگر لازم باشه بارها و بارها build بگیرم چه بهتر که لایه هایی که تغییر میکنن کمتر باشن و این باعث میشه زمان build کوتاه تر و برای pull یا push فقط لایه های که تغییر کردن رو انتقال بدیم. وقتی میخوایم از Dockerfile استفاده کنیم داکر اول سراغ کش ها میره که نخواد کل build رو از اول بسازه و لایه هایی که تغییر نکرده رو ازشون استفاده میکنه که این کار build سرعت بیشتری بگیره.

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

پیشنهاد : قسمت هایی که تو برنامتون کمتر تغییر میکنه رو از بخش هایی که بیشتر تغییر میکنه جدا کنید و سعی کنید اول داکر ایمیج بزارید ( درصورتی که بشه )

مثال : اگر شما در مرحله step1 تغییر زیاد دارید ولی در step 2 و step 3 تغییری ندارید step1 رو بعد از دو step بعدی اجرا کنید . این موضوع کمک میکنه که داکر بتونه از کشی که برای step 2 و step 3 ساخته استفاده کنه.

راه حل پیشنهادی : فرض کنیم که یک برنامه nodejs داریم . حالت بدش اینکه مثل زیر عمل کنیم. یعنی همه کدها رو منتقل کنیم و بعد بریم سراغ build گرفتن.

FROM node:10
WORKDIR /usr/src/app
COPY . ./
RUN npm install 

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

FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ &quotnode&quot, &quotserver.js&quot ]

اتفاق خوبی که افتاد اینکه ما قبل از انتقال کد package*.json منتقل و در خط بعد نصبش میکنیم چون احتمال تغییرش نسبت به تغییر کد خیلی کمتره و باعث استفاده از کش داکر ایمیج زمان build میشه.

راهکار دوم : ADD or COPY

این دو کامند شباهت خیلی زیادی بهم دارن و خیلی جاها میشه بجای هم استفادشون کرد اما یک فرق کوچیک دارند . کامند ADD علاوه بر کارهایی که کامند COPY انجام میده دو تا کار مهم دیگه هم انجام میده :

  1. ادرس اینترنتی رو بعنوان سورس قبول میکنه
  2. قابلیت extraction فایل های tar رو داره

اما سایت داکر رسما اعلام میکنه که خیلی بهتر از کامند COPY استفاده بشه و حجم داکر ایمیج شما کمتر میشه. سوالی که پیش میاد اگر بخوایم از اون دو قابلیت دیگه کامند ADD استفاده کنیم باید چیکار کنیم:

مثال : بجای دستور های زیر

ADD http://example.com/big.tar.xz /usr/src/things/ 
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all

از دستورات زیر استفاده کنیم :

RUN mkdir -p /usr/src/things \   
 && curl -SL http://example.com/big.tar.xz \     
| tar -xJC /usr/src/things \     
&& make -C /usr/src/things all

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


راهکار سوم : NPM --production

اگر پروژه شما Nodejs هست حتما در زمان build گرفتن بشدت حجم داکر ایمیل رو کاهش میده. علتش هم اینکه در زمان اجرای دستور علاوه بر نصب تمامی نیازمندی ها پکیج های devDependencies رو هم نصب میکنه و وقتی از تگ production استفاده میکنید الزام میکنید که دقیقا پکیج هایی که توی package.json رو فقط نصب کنه

npm install --production


راهکار چهارم : Exclude unneeded files

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


راهکار پنجم : Clean up layers

وقتی میخواین یک پکیج نصب کنید قبلش از کامند apt-get update استفاده میکنیم. خب نکته اینجاش که این کامند بعد اجرا کلی کش ذخیره می کنده که تو بارهای بعدی سریع تر باشه ولی ما بهش نیاز نداریم و این کش رو با اضافه کردن خط اخر پاکش میکنیم

RUN apt-get update \
  && apt-get install ... \
  && rm -rf /var/lib/apt/lists/*


راهکار ششم : Install less

با توجه به محیطی که کار میکنید حتما حواستون باشه فقط فقط پکیج های مورد نیازمون نصب بشه . مثلا اگر داریم از Debian یا Ubuntu استفاده میکنیم در زمان apt-get install حتما از تگ no-install-recommended استفاده کنید.و برای مثال

apt-get install ... --no-install-recommended

یا اگر از Python pip استفاده میکنید حتما تگ no-cache-dir استفاده کنید

pip install pycurl --compile --no-cache-dir

منبع

راهکار هفتم : Minimize the layers

چون هر خط دستور ما توی داکرفایل یک لایه حساب میشه پس هرچی بتونیم این لایه ها رو کمتر کنیم حجم داکرایمیج ما هم کمتر میشه .

RUN command
RUN command2

بجای دستورات بالا از دستور زیر استفاده کنیم

RUN command && \
         command2

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

در قسمت بعدی ۷ راهکار دیگه برای ساخت داکر ایمیج های بهتر بیان میشود . تا قمست بعدی ...