DevOps Engineer
بازی با داکر قسمت دوم - 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 [ "node", "server.js" ]
اتفاق خوبی که افتاد اینکه ما قبل از انتقال کد 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
حالا اگر بخوایم این سبک نوشتن رو توی مثال واقعی ببینیم به عکس زیر دقت کنید
در قسمت بعدی ۷ راهکار دیگه برای ساخت داکر ایمیج های بهتر بیان میشود . تا قمست بعدی ...
مطلبی دیگر از این انتشارات
خروج از از ری اکت نیتیو با زدن دو بار بک
مطلبی دیگر از این انتشارات
آموزش فارسی راه اندازی جنگو روی لینوکس
مطلبی دیگر از این انتشارات
اصول Solid