Tối ưu hóa Docker Image cho ứng dụng Production

Thách thức về dung lượng Docker Image

Một Docker image chứa quá nhiều file không cần thiết (chẳng hạn như cache trình cài đặt, devDependencies, test files) sẽ gây ra nhiều bất lợi: thời gian deploy chậm do tốn băng thông kéo image, tốn đĩa cứng trên VPS, và tăng diện tích tấn công an ninh mạng.

Chúng ta cần một quy trình xây dựng tối ưu để thu nhỏ dung lượng image về mức tối thiểu, sử dụng cơ chế Multi-stage Build:

Docker Image Size Optimization

Multi-stage Build chuyên sâu

Multi-stage Build cho phép bạn sử dụng nhiều lệnh FROM trong cùng một Dockerfile. Mỗi stage bắt đầu bằng một base image khác nhau. Bạn có thể sử dụng stage đầu tiên (Build stage) chứa đầy đủ SDK và compiler để build ứng dụng, sau đó chỉ copy file chạy (artifact) đã build sang stage tiếp theo (Runtime stage) siêu nhỏ gọn.

Dưới đây là ví dụ tối ưu hóa build Next.js sử dụng Next.js standalone output:

# Stage 1: Cài đặt dependencies
FROM node:20-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci

# Stage 2: Biên dịch code ứng dụng
FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build

# Stage 3: Runtime cực nhẹ
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 nextjs

COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]

Kỹ thuật giảm số lượng Layers và Cache

Mỗi câu lệnh RUN, COPY, ADD trong Dockerfile đều tạo ra một layer mới. Bạn nên gộp các lệnh cài đặt gói hệ thống lại thành một và xóa cache ngay trong cùng một lệnh:

# Tồi tệ: Tạo ra nhiều layer và giữ nguyên cache trong đĩa
RUN apt-get update
RUN apt-get install -y git
RUN apt-get install -y curl

# Tối ưu: Chỉ 1 layer duy nhất và dọn dẹp sạch cache
RUN apt-get update && apt-get install -y \
    git \
    curl \
   && rm -rf /var/lib/apt/lists/*

Bình luận (0)

Đang tải bình luận...