본문 바로가기
IT & Tech 정보

🚀 Dockerfile 멀티스테이지 빌드 최적화

by 지식과 지혜의 나무 2025. 5. 25.
반응형


이번에는 Docker 이미지를 경량화하고 빌드 속도를 끌어올리는 핵심 기법인
멀티스테이지 빌드(Multi-Stage Build) 최적화 방안을 단계별로 살펴보겠습니다.
실제 Dockerfile 예제와 함께 캐시 활용, 불필요 레이어 제거, 보안 강화 팁까지 모두 다룹니다.



📋 목차
1. 멀티스테이지 빌드란
2. 기본 비교: 단일 스테이지 vs 멀티스테이지
3. 최적화 포인트
4. 실제 Dockerfile 예제
5. 실전 팁 & 주의사항
6. 마무리



1️⃣ 멀티스테이지 빌드란
• 정의: 하나의 Dockerfile에서 여러 개의 FROM을 사용해
빌드용 이미지와 런타임용 이미지를 분리한 뒤,
최종 단계에 필요한 결과물만 복사해 경량 이미지를 생성하는 기법
• 장점
• 이미지 크기 감소: 빌드 도구·캐시 파일 등 불필요한 요소 제거
• 보안 강화: 런타임에는 소스 코드·빌드 툴이 포함되지 않음
• 빌드 관리 단순화: Dockerfile 한 곳에서 빌드·배포 환경 정의



2️⃣ 기본 비교: 단일 스테이지 vs 멀티스테이지

구분 단일 스테이지 멀티스테이지
이미지 크기 소스, 빌드 툴, 의존성 전부 포함 런타임에 필요한 바이너리/아티팩트만 포함
보안 면모 빌드 도구가 이미지에 남아 공격 표면 확대 빌드 툴 제외로 공격 표면 최소화
Dockerfile 관리 빌드·런타임 혼합 빌드 전용 스테이지 & 런타임 전용 스테이지 분리




3️⃣ 최적화 포인트
1. 최소 베이스 이미지 사용
• 빌드 스테이지: 공식 golang:1.20-alpine, node:18-buster 등
• 런타임 스테이지: scratch, alpine, distroless
2. 캐시 레이어 활용
• 의존성 설치(npm install, go mod download) 이전에 COPY go.mod… 등 복사
• 소스 복사·빌드 분리해 변경 빈도 적은 레이어부터 캐시 활용
3. 불필요 파일 제외
• .dockerignore에 node_modules/, *.log, test/ 등 포함
• 빌드 산출물 복사 시 경로 정확히 지정
4. COPY vs ADD
• 단순 파일 복사는 COPY
• URL·압축 해제 용도 아니면 ADD 지양
5. 권한·유저 설정
• 런타임 스테이지에서 USER nobody 등 비루트 사용자 지정
• chmod·chown으로 소유권 최소화



4️⃣ 실제 Dockerfile 예제

# ── Build Stage ──
FROM golang:1.20-alpine AS builder

# 작업 디렉터리 설정
WORKDIR /app

# 의존성 먼저 복사 & 캐시 활용
COPY go.mod go.sum ./
RUN go mod download

# 소스 전체 복사
COPY . .

# 빌드 실행 (정적 링크)
RUN CGO_ENABLED=0 GOOS=linux go build -o server ./cmd/server

# ── Runtime Stage ──
FROM alpine:latest AS runtime

# 비루트 사용자 생성
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

WORKDIR /app

# 빌드 아티팩트만 복사
COPY --from=builder /app/server .

# 포트 및 권한 설정
EXPOSE 8080
RUN chown appuser:appgroup /app/server

# 비루트 사용자로 전환
USER appuser

# 컨테이너 시작 커맨드
ENTRYPOINT ["./server"]

• 빌드 스테이지에서만 Go 컴파일러 설치
• 런타임 스테이지는 alpine:latest에 실행 파일만 복사
• CGO_ENABLED=0으로 정적 빌드, USER로 보안 강화



5️⃣ 실전 팁 & 주의사항
• 이미지 스캔: 최종 이미지에 취약점 스캐너(Trivy, Clair) 적용
• Layer 수 제한: 불필요한 RUN·COPY 합쳐서 레이어 수 최소화
• 빌드 인수(ARG) 활용: ARG BUILD_VERSION으로 CI/CD 버전 관리
• 멀티아키텍처 빌드: docker buildx로 linux/amd64,linux/arm64 동시 지원
• CI 최적화: GitHub Actions·GitLab CI 캐시 키(actions/cache)에 Go 모듈·npm 캐시 지정



6️⃣ 마무리

멀티스테이지 빌드를 적극 활용하면
• 이미지 용량을 획기적으로 줄이고
• 보안은 강화하며
• 빌드 시간도 단축할 수 있습니다.

위 예제와 팁을 참고해 여러분의 애플리케이션에 맞게 Dockerfile을 최적화해 보세요!

반응형