بازی با داکر قسمت دوم - 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 انجام میده دو تا کار مهم دیگه هم انجام میده : ادرس اینترنتی رو بعنوان سورس قبول میکنه قابلیت 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حالا اگر بخوایم این سبک نوشتن رو توی مثال واقعی ببینیم به عکس زیر دقت کنیددر قسمت بعدی ۷ راهکار دیگه برای ساخت داکر ایمیج های بهتر بیان میشود . تا قمست بعدی ...