ข้ามไปยังเนื้อหา

การ Optimize & Best Practices — ภาพรวมโมดูล

เมื่อ build Docker image ครั้งแรก เราอาจได้ image ที่มีขนาดถึง 1–2 GB ได้ง่ายๆ ขนาดนั้นส่งผลกระทบในทุกมิติ: ทุกครั้งที่ docker pull บน CI จะเสียเวลาเป็นวินาที (หรือนาที) ทุกการ push ไปยัง registry เสียแบนด์วิดท์ และทุก megabyte ใน image คือพื้นที่ที่ผู้โจมตีอาจใช้ประโยชน์ได้

การ Optimize ไม่ได้หมายถึงการปรับปรุงเล็กน้อย แต่คือการใช้เทคนิคที่ผ่านการพิสูจน์แล้วไม่กี่อย่าง ได้แก่ multi-stage builds, การเรียงลำดับ layer อย่างชาญฉลาด, base image ที่กระทัดรัด, และการตั้งค่าความปลอดภัยที่เหมาะสม ซึ่งสามารถลดขนาด image ได้ถึง 70–90% และทำให้ deploy ได้เร็วขึ้นและปลอดภัยขึ้น

มิติเป้าหมายเทคนิคที่ครอบคลุม
ขนาดImage เล็ก = pull เร็ว, ใช้พื้นที่น้อยMulti-stage builds, base image เล็ก, .dockerignore
ความเร็วในการ buildBuild ซ้ำๆ ได้เร็วขึ้นการเรียงลำดับ layer cache, --mount=type=cache
ความปลอดภัยลด attack surfaceUser ที่ไม่ใช่ root, ไม่ฝัง secret, HEALTHCHECK, การ scan

นี่คือการเปรียบเทียบที่สมจริง ฝั่งซ้ายคือ Node.js image แบบ single-stage ทั่วไป ฝั่งขวาคือแอปเดียวกันที่ build ด้วยเทคนิคในโมดูลนี้:

REPOSITORY TAG SIZE
myapp naive 1.21GB
myapp optimized 112MB

ลดลงถึง 10 เท่า โดยไม่มีการเปลี่ยนแปลงพฤติกรรมของ application — เปลี่ยนแค่ Dockerfile เท่านั้น

บทเรียนสิ่งที่จะได้เรียนรู้
หน้านี้ทำไมต้อง Optimize, สามมิติ, ตัวอย่างขนาดก่อน/หลัง
Multi-stage buildsแยก build stage กับ runtime stage; COPY --from
การเรียงลำดับ cacheจัดลำดับ instruction เพื่อใช้ cache ได้สูงสุด; pin versions
Base image เล็กและ .dockerignoreAlpine/distroless, ตัด noise ออกจาก build context
Security และ HEALTHCHECKNon-root user, ไม่ฝัง secret, HEALTHCHECK, docker scout

snippet ด้านล่าง build image สองอัน — อันหนึ่งใหญ่โต อีกอันกระทัดรัด — เพื่อให้เห็น output ของ docker images แบบเปรียบเทียบ

# Build a "before" image with unnecessary dev tools
# syntax=docker/dockerfile:1
FROM node:22 AS before
WORKDIR /app
RUN echo '{"name":"demo","version":"1.0.0"}' > package.json
RUN npm install --save-dev typescript eslint
RUN echo "console.log('hello');" > index.js
CMD ["node","index.js"]

# Build a "after" image with only what is needed
FROM node:22-alpine AS after
WORKDIR /app
RUN echo '{"name":"demo","version":"1.0.0"}' > package.json
RUN echo "console.log('hello');" > index.js
CMD ["node","index.js"]

# --- build both and compare sizes ---
# docker build --target before -t myapp:before .
# docker build --target after  -t myapp:after  .
# docker images myapp
ข้อใดต่อไปนี้ไม่ใช่หนึ่งในสามมิติของการ Optimize Docker image ที่ครอบคลุมในโมดูลนี้?
Node.js image แบบ single-stage มีขนาด 1.21 GB หลังใช้ multi-stage builds และ base image ขนาดเล็ก ขนาดที่คาดหวังหลัง Optimize คือเท่าไร?
การลดขนาด image ช่วยเพิ่มความปลอดภัยได้อย่างไร?