Docker Build - multiStage를 이용한 경량화

y001·2025년 2월 23일
post-thumbnail

멀티 스테이지 빌드란?

멀티 스테이지 빌드는 빌드 환경과 실행 환경을 분리하여 컨테이너를 최적화하는 기법이다.
Dockerfile에서 여러 개의 FROM 단계를 사용하여 불필요한 파일을 제거하고, 가벼운 실행 이미지를 생성할 수 있다.

주요 장점

  • 빌드 과정에서만 필요한 도구(Golang, Node.js, Java SDK 등)를 제거하여 최소한의 실행 환경 유지
  • 컨테이너 이미지 크기를 획기적으로 감소
  • 보안 강화 (불필요한 빌드 도구, 디버깅 파일 제거)
  • 배포 속도 개선 (가벼운 이미지 사용)

싱글 스테이지 빌드 vs 멀티 스테이지 빌드

1) 싱글 스테이지 빌드

먼저, 일반적인 Dockerfile을 사용하여 빌드 도구까지 포함된 이미지를 만든다.

Dockerfile 작성 (싱글 스테이지)

이미지 빌드 : docker build -t single-stage -f Dockerfile-single .
컨테이너 실행 : docker run --rm single-stage
이미지 크기 확인

문제점

  • 불필요한 빌드 도구(Golang 컴파일러 등)가 포함되어 이미지 크기가 922MB로 매우 큼.
  • 실행 환경에서 필요하지 않은 파일이 포함됨.
    • FROM golang:1.16 → 이 이미지는 Go 개발을 위한 빌드 도구(컴파일러, 패키지 관리자 등)가 포함된 무거운 환경.
    • RUN go build -o hello main.go → 빌드가 완료된 이후에도 빌드 도구가 그대로 남아 있어 이미지가 커짐.

2) 멀티 스테이지 빌드 적용

이제 빌드 환경과 실행 환경을 분리하여 최적화한다.

Dockerfile 작성 (멀티 스테이지)

  • FROM golang:1.16 AS builder

    • 이 단계에서는 빌드만 수행하고 결과물(hello 실행 파일)만 남김.
    • 즉, 이 단계에서는 Go 컴파일러, 패키지 관리 도구 같은 무거운 요소가 필요하지만, 최종 실행 환경에서는 필요 없음.
  • FROM alpine:latest

    • 실행 환경을 Alpine Linux 기반으로 변경.
    • Alpine Linux는 매우 작은 리눅스 배포판으로 기본 이미지 크기가 5MB 미만.
      Go 실행 바이너리만 있으면 실행 가능하므로 빌드 도구가 필요 없음.
  • COPY --from=builder /app/hello .

    • 첫 번째 단계(builder)에서 빌드된 실행 파일(hello)만 가져와서 실행 환경에 복사.
  • ENTRYPOINT ["./hello"]

    • 실행 환경에서는 hello 바이너리만 실행.

이미지 빌드 : docker build -t single-stage -f Dockerfile-single .
컨테이너 실행 : docker run --rm single-stage

이미지 크기 확인


결과 분석 및 비교

빌드 방식이미지 크기실행 환경
싱글 스테이지 빌드922MB빌드 도구 포함
멀티 스테이지 빌드9.77MB실행 파일만 포함

멀티 스테이지 빌드 적용 후 이미지 크기가 99% 이상 감소
실행 속도 및 배포 효율성이 대폭 향상
불필요한 빌드 도구 제거로 보안성 강화

0개의 댓글