개선 전 (1.2GB) vs 개선 후 (180MB)
개선 전
Dockerfile
FROM node:20
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
EXPOSE 3000
CMD ["node", "dist/server.js"]개선 후 (멀티스테이지)
Dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER appuser
EXPOSE 3000
CMD ["node", "dist/server.js"]핵심 최적화 원칙
1. 레이어 캐시 순서
Dockerfile
COPY package*.json ./
RUN npm ci
COPY src/ ./src/2. .dockerignore 필수
CODE
node_modules
.git
.env
*.log
dist
coverage3. RUN 명령어 합치기
Dockerfile
RUN apt-get update && \
apt-get install -y --no-install-recommends curl && \
rm -rf /var/lib/apt/lists/*4. alpine 기반 이미지
| 이미지 | 크기 |
|---|---|
node:20 | 1.1GB |
node:20-slim | 240MB |
node:20-alpine | 140MB |
BuildKit 캐시 마운트
Dockerfile
RUN --mount=type=cache,target=/root/.npm \
npm ciBash
DOCKER_BUILDKIT=1 docker build .이미지 크기 분석
Bash
docker history myapp:latest
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
wagoodman/dive myapp:latest편집 안내 · Editorial Note
이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.
관련 공식 문서Docker 공식 문서 ↗
질문 & 답변 (Q&A)
이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.