sayu.day
Backend

Docker 멀티스테이지 빌드 최적화 가이드

멀티스테이지 빌드로 이미지 크기, 보안, 빌드 속도를 동시에 개선하는 실전 기준을 정리합니다.

발행 2026년 1월 2일1163

목표

멀티스테이지의 목적은 단순히 이미지 크기 축소가 아닙니다.

  • 런타임 공격 표면 축소
  • 빌드 캐시 효율 개선
  • 배포 속도/일관성 향상

기본 패턴

FROM golang:1.23 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /out/server ./cmd/server

FROM gcr.io/distroless/static-debian12
COPY --from=builder /out/server /server
USER nonroot:nonroot
ENTRYPOINT ["/server"]

핵심은 "빌드 도구를 런타임 이미지에 남기지 않는 것"입니다.

캐시 최적화 규칙

  • 의존성 파일(go.mod, package-lock) 먼저 복사
  • 소스 복사는 그 다음
  • --mount=type=cache로 패키지 캐시 활용

베이스 이미지 선택 기준

  • scratch: 정적 바이너리 가능할 때
  • distroless: 보안 우선, 셸 불필요할 때
  • alpine/slim: 디버깅/호환성 필요할 때

자주 하는 실수

  • 런타임 이미지에 빌드 도구/소스코드 포함
  • latest 태그 고정으로 재현성 저하
  • 멀티스테이지인데도 불필요한 파일 복사

요약

좋은 Dockerfile은 "작다"보다 "예측 가능하고 안전하다"가 기준입니다. 멀티스테이지 + 캐시 순서 + 최소 런타임 이미지를 기본 규칙으로 두는 것이 가장 효과적입니다.

다음 읽기

이 생각이 이어지는 방향

Backend 더 보기
공유

읽은 뒤의 대화

읽은 뒤의 생각을 이어갑니다

질문, 반론, 조용한 후속 메모를 이 글 아래에 남길 수 있습니다.

sayu.day는 생각과 작업의 흔적을 천천히 정리하는 개인 출판물입니다.
직접 겪고 검토한 내용, 다시 읽을 만한 아이디어, 작업하며 남긴 메모를 모읍니다.
시간이 지난 글은 현재의 판단과 다를 수 있어 업데이트 맥락을 함께 남깁니다.

© 2026 sayu.day