استكشاف عامل الميناء ، الجزء 4: تقليل حجم الصور وتسريع تجميعها

في هذا الجزء من ترجمة سلسلة Docker ، سنتحدث عن كيفية تحسين أحجام الصور وتسريع عملية التجميع. في المواد السابقة ، قارنا صور Docker بالبيتزا ، والمصطلحات مع الكعك ، وتعليمات Dockerfile مع الخبز. اليوم لن يكون هناك الخبز. حان الوقت للذهاب إلى نظام غذائي.

الجزء 1: الأساسيات
الجزء 2: المصطلحات والمفاهيم
الجزء 3: ملفات Dockerfile
الجزء 4: تقليل حجم الصور وتسريع تجميعها
الجزء 5: الفرق
الجزء 6: العمل مع البيانات


من أجل فهم ما الذي سنتحدث عنه هنا ، سيكون من المفيد لك تحديث ذاكرة ما تمت مناقشته في الجزء الثالث من هذه السلسلة من المواد. وهي تحدثنا عن تعليمات ملف Dockerfile. ستساعدك معرفة هذه الإرشادات وميزات Docker التي نناقشها اليوم على تحسين ملفات صور Docker.

التخزين المؤقت


إحدى نقاط قوة Docker هي التخزين المؤقت. بفضل هذه الآلية ، يتم تسريع تجميع الصور.

عند تجميع صورة Docker ، تتبع تعليمات Dockerfile ، وتتبعها بالترتيب. في عملية تحليل الإرشادات ، يقوم Docker بفحص ذاكرة التخزين المؤقت الخاصة به بحثًا عن الصور ، وهي ما حصلنا عليه في المراحل المتوسطة من تجميع الصور الأخرى. إذا كان من الممكن العثور على هذه الصور ، فيمكن للنظام استخدامها دون إضاعة الوقت في إعادة إنشائها.

في حالة إبطال ذاكرة التخزين المؤقت ، يتم تنفيذ التعليمات التي حدثت خلالها ، مما يؤدي إلى إنشاء طبقة جديدة دون استخدام ذاكرة التخزين المؤقت. يحدث نفس الشيء عند تنفيذ التعليمات التي تتبعه.

نتيجة لذلك ، إذا تبين أثناء تنفيذ التعليمات من Dockerfile أن الصورة الأساسية في ذاكرة التخزين المؤقت ، يتم استخدام هذه الصورة من ذاكرة التخزين المؤقت. وهذا ما يسمى ضرب ذاكرة التخزين المؤقت. إذا لم تكن الصورة الأساسية في ذاكرة التخزين المؤقت ، فستحدث عملية تجميع الصورة بأكملها دون استخدام ذاكرة التخزين المؤقت.

ثم تتم مقارنة التعليمات التالية مع جميع الصور من ذاكرة التخزين المؤقت ، والتي تستند إلى نفس الصورة الأساسية الموجودة بالفعل في ذاكرة التخزين المؤقت. يتم فحص كل صورة وسيطة مخبأة لمعرفة ما إذا كان يحتوي على ما تم إنشاؤه بواسطة نفس التعليمات. إذا تعذر العثور على تطابق ، فسيتم تسمية ذلك بـ "ملكة جمال التخزين المؤقت" وتعتبر ذاكرة التخزين المؤقت غير صالحة. يحدث الشيء نفسه حتى تتم معالجة Dockerfile بأكمله.

تتم مقارنة معظم التعليمات الجديدة ببساطة بما هو موجود بالفعل في الصور الوسيطة. إذا تمكن النظام من العثور على تطابق ، فسيستخدم التجميع ما هو موجود بالفعل في ذاكرة التخزين المؤقت.

يمكن أن يؤدي استخدام ذاكرة التخزين المؤقت إلى تسريع عملية تجميع الصور ، ولكن هناك مشكلة واحدة. على سبيل المثال ، إذا تم العثور على RUN pip install -r requirements.txt في Dockerfile ، فإن Docker يبحث عن نفس التعليمات في ذاكرة التخزين المؤقت المحلية للصور الوسيطة. ومع ذلك ، لا تتم مقارنة محتويات الإصدارات القديمة والجديدة من ملف requirements.txt .

قد يؤدي ذلك إلى حدوث مشكلات إذا تمت إضافة معلومات حول الحزم الجديدة إلى requirements.txt ، وبعد ذلك ، عند إنشاء الصورة المحدثة ، من أجل تثبيت مجموعة جديدة من الحزم ، ستحتاج إلى تشغيل بيان RUN pip install مرة أخرى. قريبا سوف نتحدث عن كيفية التعامل مع هذه المشكلة.

بخلاف إرشادات Docker الأخرى ، عند تنفيذ إرشادات ADD و COPY ، يحتاج Docker إلى التحقق من محتويات الملف أو الملفات لتحديد ما إذا كان يمكن استخدام ذاكرة التخزين المؤقت عند إنشاء الصورة. وهي ، تتم مقارنة المجموع الاختباري للملفات المذكورة في هذه التعليمات مع المجموع الاختباري للملفات الموجودة في الصور الوسيطة الموجودة بالفعل في ذاكرة التخزين المؤقت. إذا تم تغيير محتويات الملفات أو بيانات التعريف الخاصة بها ، فسيتم إبطال ذاكرة التخزين المؤقت.

فيما يلي بعض النصائح للاستفادة من ذاكرة التخزين المؤقت Docker:

  • يمكن تعطيل التخزين المؤقت بتمرير --no-cache=True مفتاح --no-cache=True إلى docker build .
  • إذا كنت تنوي إجراء تغييرات على إرشادات Dockerfile ، فستتم إعادة تجميع كل طبقة تم إنشاؤها بواسطة الإرشادات التي تأتي بعد الإرشادات التي تم تغييرها في كثير من الأحيان ، دون استخدام ذاكرة التخزين المؤقت. للاستفادة من التخزين المؤقت ، ضع التعليمات التي من المحتمل أن تتغير ، في أقرب وقت ممكن من Dockerfile.
  • ادمج أوامر RUN apt-get update و apt-get install في السلاسل للتخلص من المشاكل المرتبطة بالاستخدام غير الصحيح لذاكرة التخزين المؤقت.
  • إذا كنت تستخدم مديري الحزم ، مثل pip ، مع ملف requirements.txt ، فالتزم بالمخطط أدناه لاستبعاد استخدام الصور الوسيطة المتقادمة من ذاكرة التخزين المؤقت التي تحتوي على مجموعة الحزم المدرجة في الإصدار القديم من ملف requirements.txt . إليك ما يبدو عليه:

     COPY requirements.txt /tmp/ RUN pip install -r /tmp/requirements.txt COPY . /tmp/ 

إذا كنت تعرف طرقًا أخرى للتعامل مع "problem.txt المشكلة" ، فيمكنك تحديدها في التعليقات.

تقليل حجم الصور


▍ اختيار دقيق للصورة الأساسية


صور عامل الميناء يمكن أن تكون كبيرة جدا. وهذا يتناقض مع الرغبة المتينة التي يقوم بها الشخص الذي يقوم بإنشائها لجعلها مدمجة قدر الإمكان ، مما يسهل تنزيلها من مستودع بعيد وسيكون له تأثير مفيد على مقدار المساحة الحرة على الكمبيوتر الذي تم تحميله عليه. دعونا نتحدث عن كيفية تقليل حجمها.


بدلا من الخبز والكعك ، سوف نأكل الآن الخضر

تتمثل إحدى طرق تقليل حجم الصور في تحديد الصور الأساسية وتعديلها اللاحق.

على سبيل المثال ، تمثل صورة جبال الألب الأساسية توزيعًا كاملاً لنظام التشغيل الذي يشبه نظام Linux ، والذي يحتوي على حزم إضافية على الأقل. حجمها حوالي 5 ميغابايت. ومع ذلك ، فإن بناء صورتك الخاصة على أساس جبال الألب سيتطلب الكثير من الوقت لتزويدها بكل ما يلزم لضمان تشغيل تطبيق معين.

هناك أيضا إصدارات متخصصة من صورة جبال الألب الأساسية. على سبيل المثال ، تزن الصورة المطابقة من مستودع python الذي يوضع فيه نص print("hello world") حوالي 78.5 ميجابايت. هنا هو Dockerfile لبناء مثل هذه الصورة:

 FROM python:3.7.2-alpine3.8 COPY . /app ENTRYPOINT ["python", "./app/my_script.py", "my_var"] 

في الوقت نفسه ، تقول Docker Hub أن هذه الصورة الأساسية بحجم 29 ميغابايت. يزداد حجم الصورة بناءً على هذه الصورة الأساسية عن طريق تنزيل Python وتثبيته.

بالإضافة إلى استخدام الصور الأساسية المستندة إلى جبال الألب ، يمكنك تقليل حجم الصور من خلال استخدام تكنولوجيا التجميع متعدد المراحل.

▍ التجمع متعدد المراحل من الصور


يستخدم Dockerfile ، الذي يصف التجميع متعدد المراحل لصورة ما ، عدة تعليمات FROM . يمكن لمنشئ مثل هذه الصورة إعداد نسخ انتقائية من الملفات التي تسمى عناصر البناء من مستوى بناء إلى آخر. في الوقت نفسه ، يصبح من الممكن التخلص من كل ما هو غير ضروري في الصورة النهائية. بفضل هذه الطريقة ، يمكنك تقليل حجم الصورة النهائية.

إليك كيفية عمل كل عبارة FROM :

  • إنها تبدأ خطوة بناء جديدة.
  • لا يعتمد على ما تم إنشاؤه في خطوة الإنشاء السابقة.
  • يمكنها استخدام صورة أساسية مختلفة عن الصورة المستخدمة في الخطوة السابقة.

فيما يلي مثال معدّل لـ Dockerfile من وثائق Docker التي تصف إنشاء متعدد المراحل.

 FROM golang:1.7.3 AS build WORKDIR /go/src/github.com/alexellis/href-counter/ RUN go get -d -v golang.org/x/net/html COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=build /go/src/github.com/alexellis/href-counter/app . CMD ["./app"] 

يرجى ملاحظة أننا قدمنا ​​اسم المرحلة الأولى من التجميع ، مع الإشارة إلى ذلك بعد بيان FROM . نشير إلى مرحلة الإنشاء المسماة في COPY --from= أدناه في Dockerfile.

يعد استخدام عملية تجميع الصور متعددة المراحل أمرًا منطقيًا في بعض الحالات عندما يتعين عليك إنشاء العديد من الحاويات لبيئة الإنتاج. يتيح لك التجميع متعدد المراحل تقليل حجم الصورة النهائية. لكن في بعض الأحيان هذا النهج يعقد دعم الصور. لذلك ، ربما لن تستخدم مجموعة متعددة المراحل من الصور في الحالات التي يمكنك الاستغناء عنها. يمكنك أن تقرأ عن ميزات هذه التكنولوجيا هنا وهنا .

كما ترون ، تعد التجميع متعدد المراحل تقنية مثيرة للاهتمام ، ولكنها غير مناسبة لجميع الحالات. بنفس الطريقة لتقليل حجم الصور ، والتي سنناقشها أدناه ، يمكن التوصية بها للجميع تمامًا.

ock. dockerignore الملف


بالتأكيد كل من يريد أن يتعلم Docker يحتاج إلى معرفة ملفات. .dockerignore . تشبه هذه الملفات ملفات .gitignore . أنها تحتوي على قائمة من الملفات والمجلدات ، في شكل أسماء أو قوالب يجب على Docker تجاهلها أثناء تجميع الصور.

يتم وضع هذا الملف حيث يوجد Dockerfile ، وكل شيء مضمن في سياق مجموعة الصور.

عندما تقوم بتشغيل docker build ، الذي يبدأ بتجميع الصورة ، يتحقق Docker من وجود المجلد في ملف .dockerignore . إذا كان يمكن العثور على مثل هذا الملف ، فسيتم تحليل هذا الملف ، ويتم استخدام قواعد Match() من حزمة filepath Go وبعض قواعد Docker الخاصة به لتحديد قائمة الملفات التي سيتم تجاهلها.

لذلك ، على سبيل المثال ، إذا تم العثور على قالب للنموذج *.jpg في ملف .dockerignore ، فعند إنشاء صورة ، سيتم تجاهل الملفات التي تحمل أي اسم .dockerignore .jpg . إذا videos السلسلة في الملف ، فسيتجاهل النظام مجلد videos وجميع محتوياته.

عند تجميع ملف .dockerignore ، يمكنك التعليق عليه باستخدام الرمز # .

إليك ما .dockerignore ملف .dockerignore لأي شخص يقوم بإنشاء صور Docker:

  • يتيح لك هذا الاستبعاد من ملفات الصور التي تحتوي على معلومات حساسة مثل عمليات تسجيل الدخول وكلمات المرور.
  • هذا يسمح لك بتقليل حجم الصورة. أصغر الملفات في الصورة ، سيكون حجمها أصغر وأسرع سيكون من الممكن العمل معها.
  • هذا يجعل من الممكن تقليل عدد أسباب إبطال ذاكرة التخزين المؤقت عند تجميع صور مماثلة. على سبيل المثال ، إذا تغيرت بعض ملفات خدمة المشروع أثناء إعادة التجميع ، مثل ملفات السجل ، بسبب إبطال البيانات المخزنة في ذاكرة التخزين المؤقت بشكل جوهري ، فإن هذا يؤدي إلى إبطاء تجميع الصور.

.dockerignore قراءة المزيد حول ملف .dockerignore في وثائق Docker.

بحث حجم الصورة


دعنا نتحدث عن كيفية استخدام أدوات سطر الأوامر لمعرفة أحجام صور وحاويات Docker.

  • لمعرفة الحجم التقريبي لحاوية التشغيل ، يمكنك استخدام أمر docker container ls -s .
  • يعرض docker image ls أحجام docker image ls .
  • يمكنك استخدام docker image history my_image:my_tag لمعرفة أحجام الصور الوسيطة التي يتم تجميع صورة معينة منها.
  • يتيح لك docker image inspect my_image:tag معرفة المعلومات التفصيلية حول الصورة ، بما في ذلك حجم كل طبقة من طبقاتها. تختلف الطبقات قليلاً عن الصور الوسيطة التي تشكل الصورة النهائية ، ولكن في معظم الحالات ، يمكن اعتبارها كيانات متطابقة. فيما يلي بعض المواد الجيدة حول تفاصيل الهيكل الداخلي لصور Docker.
  • من أجل فحص محتويات الحاويات ، يمكنك تثبيت حزمة الغوص .

الآن وبعد أن ناقشنا إمكانات تقليل حجم الصور ، أوجه انتباهكم إلى ثماني توصيات تتعلق بتقليل حجم الصور وتسريع عملية تجميعها.

توصيات لتقليل حجم الصور وتسريع عملية التجميع


  1. كلما كان ذلك ممكنًا ، استخدم الصور الرسمية كصور أساسية. يتم تحديث الصور الرسمية بانتظام ، فهي أكثر أمانًا من الصور غير الرسمية.
  2. لجمع الصور المدمجة قدر الإمكان ، استخدم الصور الأساسية المستندة إلى Alpine Linux.
  3. إذا كنت تستخدم apt ، apt بدمج أوامر apt-get update apt-get install و apt-get install في بيان RUN واحد. بالإضافة إلى ذلك ، ادمج أوامر تثبيت الحزمة في تعليمة واحدة. سرد الحزم أبجديًا على أسطر متعددة ، مع فصل القائمة بـ \ . على سبيل المثال ، قد يبدو كالتالي:

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

    تعمل هذه الطريقة على تقليل عدد الطبقات التي يجب إضافتها إلى الصورة ، كما تساعد في الحفاظ على رمز الملف في نموذج لائق.
  4. قم بتضمين بنية مثل && rm -rf /var/lib/apt/lists/* في نهاية بيان RUN المستخدم لتثبيت الحزم. سيؤدي هذا إلى مسح ذاكرة التخزين المؤقت apt وسيؤدي إلى عدم حفظه في الطبقة التي شكلها أمر RUN . التفاصيل حول هذا يمكن العثور عليها في الوثائق .
  5. استخدم قدرات التخزين المؤقت الخاصة بك بحكمة عن طريق وضع أوامر في Dockerfile التي من المحتمل أن تتغير بالقرب من نهاية الملف.
  6. استخدم ملف. .dockerignore .
  7. ألقِ نظرة على dive ، وهي أداة رائعة لاستكشاف صور Docker التي تساعد في تقليل حجمها.
  8. لا تقم بتثبيت الحزم التي يمكن الاستغناء عنها.

ملخص


الآن أنت تعرف كيفية جعل صور Docker يتم تجميعها بسرعة ، وتحميلها بسرعة من المستودعات ولا تشغل مساحة كبيرة من الكمبيوتر. في المرة القادمة سوف نتحدث عن فرق دوكر.

أعزائي القراء! هل واجهت مشاكل مع آليات التخزين المؤقت عند إنشاء صور Docker؟

Source: https://habr.com/ru/post/ar440658/


All Articles