Backend
Docker 멀티스테이지 빌드 최적화 가이드
멀티스테이지 빌드로 이미지 크기, 보안, 빌드 속도를 동시에 개선하는 실전 기준을 정리합니다.
목표
멀티스테이지의 목적은 단순히 이미지 크기 축소가 아닙니다.
- 런타임 공격 표면 축소
- 빌드 캐시 효율 개선
- 배포 속도/일관성 향상
기본 패턴
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은 "작다"보다 "예측 가능하고 안전하다"가 기준입니다. 멀티스테이지 + 캐시 순서 + 최소 런타임 이미지를 기본 규칙으로 두는 것이 가장 효과적입니다.
다음 읽기
이 생각이 이어지는 방향
읽은 뒤의 대화
읽은 뒤의 생각을 이어갑니다
질문, 반론, 조용한 후속 메모를 이 글 아래에 남길 수 있습니다.