Skip to main content

Optimizing Docker Images

การทำความเข้าใจเกี่ยวกับ Docker Images​

Docker Images เป็นไฟล์ที่ประกอบด้วยซอฟต์แวร์ทั้งหมดที่จำเป็นสำหรับการรันแอปพลิเคชันใน Docker container รวมถึง dependencies, libraries, การตั้งค่า และไฟล์ที่เกี่ยวข้อง. การสร้าง Docker image ที่มีประสิทธิภาพสูงสามารถช่วยลดเวลาในการ build, ลดขนาดของ images, และทำให้ระบบมีประสิทธิภาพดีขึ้นเมื่อรันใน production environment.

เหตุผลที่ต้องการการ Optimizing Docker Images​

การ optimize Docker images เป็นสิ่งสำคัญเพื่อ:

  1. ลดขนาดของ Docker images เพื่อลดเวลาในการดาวน์โหลดและการจัดการ.
  2. ปรับปรุงประสิทธิภาพในการรัน container.
  3. ลดการใช้ทรัพยากร (เช่น พื้นที่ดิสก์) และค่าใช้จ่ายในการจัดเก็บ.
  4. ทำให้การ deploy เป็นไปอย่างรวดเร็วและสะดวกยิ่งขึ้น.

เทคนิคในการ Optimizing Docker Images​

1. เลือก Base Image ที่เบาที่สุด​

เมื่อสร้าง Docker image, การเลือก base image ที่เหมาะสมและเบาที่สุดเป็นเรื่องสำคัญ. Docker มีหลาย image ที่สามารถใช้งานได้ เช่น alpine ที่เป็น image ขนาดเล็ก ซึ่งช่วยให้ลดขนาดของ image ทั้งหมด.

ตัวอย่างการใช้ Alpine base image:​

FROM alpine:latest

Alpine เป็น image ที่เบาที่สุดใน Docker Hub เพราะมีขนาดเพียงประมาณ 5MB ซึ่งช่วยให้ Docker image ของคุณมีขนาดเล็กลง.

2. ใช้ Multi-Stage Builds​

Multi-stage builds คือการใช้หลายๆ FROM ใน Dockerfile เพื่อแยกขั้นตอนการ build ออกเป็นหลายๆ ขั้นตอน. วิธีนี้ช่วยให้คุณสามารถสร้าง Docker image ที่เล็กลงโดยไม่ต้องรวมเครื่องมือที่ใช้ในการ build ไว้ใน image สุดท้าย.

ตัวอย่างการใช้ Multi-Stage Builds:​

# Stage 1: Build Stage
FROM node:14 AS build
WORKDIR /app
COPY . .
RUN npm install && npm run build

# Stage 2: Production Stage
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html

ในตัวอย่างนี้:

  • เราใช้ Node.js image ในขั้นตอนแรกเพื่อทำการ build แอปพลิเคชัน.
  • ในขั้นตอนที่สอง, เราใช้ nginx image ที่เบา (alpine-based) เพื่อรันแอปพลิเคชันใน production, และแค่คัดลอกไฟล์ที่สร้างจากขั้นตอน build.

3. เลี่ยงการใช้ RUN apt-get update และ apt-get install​

ในบางกรณี, คำสั่ง RUN apt-get update และ apt-get install จะเพิ่มขนาดของ Docker image เนื่องจากการติดตั้ง dependencies. การใช้คำสั่งเหล่านี้บ่อยๆ อาจทำให้ Docker image มีขนาดใหญ่ขึ้นโดยไม่จำเป็น. วิธีที่ดีที่สุดคือการใช้ --no-install-recommends และการรวมคำสั่ง RUN เพื่อให้ทุกอย่างถูกติดตั้งในขั้นตอนเดียว.

ตัวอย่างการติดตั้ง dependencies อย่างมีประสิทธิภาพ:​

RUN apt-get update && \
apt-get install -y --no-install-recommends <package-name> && \
rm -rf /var/lib/apt/lists/*

ในตัวอย่างนี้:

  • เราใช้ --no-install-recommends เพื่อลดการติดตั้งแพ็คเกจที่ไม่จำเป็น.
  • เราลบข้อมูลที่ไม่จำเป็น (/var/lib/apt/lists/*) หลังจากการติดตั้งเสร็จสิ้นเพื่อลดขนาดของ image.

4. ลบไฟล์ที่ไม่จำเป็น​

หลังจากการ build หรือการติดตั้ง software เสร็จสิ้น, ควรลบไฟล์ที่ไม่จำเป็น เช่น temporary files, cache, หรือไฟล์ที่เกี่ยวข้องกับการติดตั้งเพื่อให้ image ของคุณเบาขึ้น.

ตัวอย่างการลบไฟล์ที่ไม่จำเป็น:​

RUN rm -rf /tmp/*

5. ใช้ .dockerignore เพื่อละเว้นไฟล์ที่ไม่จำเป็น​

ไฟล์ .dockerignore จะช่วยให้คุณละเว้นไฟล์หรือโฟลเดอร์ที่ไม่ต้องการจากการคัดลอกเข้าไปใน Docker image ซึ่งจะช่วยลดขนาดของ image.

ตัวอย่างไฟล์ .dockerignore:​

node_modules/
*.log
*.md
.git/

ในตัวอย่างนี้:

  • เราจะละเว้นโฟลเดอร์ node_modules/, ไฟล์ log, ไฟล์ markdown และโฟลเดอร์ .git/ จากการคัดลอกไปยัง image.

6. ใช้คำสั่ง COPY แทน ADD​

คำสั่ง ADD ใน Dockerfile มีคุณสมบัติเพิ่มเติม เช่น การขยายไฟล์ tar และการดาวน์โหลดไฟล์จาก URL, ซึ่งอาจทำให้ Docker image ใหญ่ขึ้น. ในกรณีที่ไม่จำเป็น, ใช้ COPY แทน.

ตัวอย่างการใช้ COPY:​

COPY . /app

7. เลือกคำสั่ง CMD และ ENTRYPOINT ที่เหมาะสม​

การเลือกคำสั่งที่ถูกต้องสำหรับการเริ่มต้น container สามารถช่วยให้การรัน container มีประสิทธิภาพมากขึ้น. คำสั่ง CMD ใช้สำหรับการตั้งค่า default command ในขณะที่ ENTRYPOINT ใช้สำหรับการตั้งค่า entry point ของ container.

ตัวอย่างการใช้ CMD:​

CMD ["node", "app.js"]

8. ใช้ Layers อย่างมีประสิทธิภาพ​

Docker image ประกอบด้วย layers ซึ่งเกิดจากแต่ละคำสั่งใน Dockerfile (เช่น RUN, COPY, ADD). เมื่อ Docker image ถูกสร้าง, แต่ละคำสั่งจะถูกเก็บใน layer ต่างๆ. การรวมหลายๆ คำสั่งในคำสั่งเดียวช่วยให้ลดจำนวน layers ซึ่งจะทำให้ Docker image มีขนาดเล็กลง.

ตัวอย่างการรวมคำสั่ง RUN:​

RUN apt-get update && apt-get install -y <package-name> && rm -rf /var/lib/apt/lists/*

สรุป​

การ optimize Docker images เป็นสิ่งสำคัญในการลดขนาดของ image และทำให้การ build, การ deploy, และการรัน container มีประสิทธิภาพมากขึ้น. การเลือก base image ที่เบาที่สุด, การใช้ multi-stage builds, การลบไฟล์ที่ไม่จำเป็น, การใช้ .dockerignore, และการลดจำนวน layers เป็นเทคนิคที่ช่วยให้คุณสร้าง Docker image ที่มีประสิทธิภาพและมีขนาดเล็กลง.