본문 바로가기
Docker

멀티스테이지 빌드(Multi-Stage Build)

by xogns93 2024. 12. 10.

멀티스테이지 빌드(Multi-Stage Build)Dockerfile에서 매우 중요한 기술로, 효율적이고 최적화된 이미지를 생성하는 데 중요한 역할을 합니다. 멀티스테이지 빌드를 사용하면 여러 단계에서 이미지를 빌드하고, 각 단계에서 필요한 아티팩트만 추출하여 최종 이미지를 생성할 수 있습니다. 이를 통해 이미지 크기를 최소화하고, 불필요한 파일이나 빌드 도구를 최종 이미지에 포함시키지 않게 할 수 있습니다.

멀티스테이지 빌드란?

멀티스테이지 빌드는 여러 개의 빌드 단계하나의 Dockerfile에서 사용할 수 있게 해주는 기능입니다. 각 빌드 단계는 독립적으로 진행되며, 중간 이미지를 사용하여 다음 단계로 넘기거나, 불필요한 파일을 제거한 최종 이미지만 생성할 수 있습니다.

멀티스테이지 빌드 장점

  1. 이미지 크기 최적화:

    • 멀티스테이지 빌드를 사용하면, 빌드에 필요한 도구나 라이브러리를 중간 이미지에만 포함시키고, 최종 이미지에는 실제 애플리케이션만 포함되도록 할 수 있습니다.
    • 예를 들어, 빌드 도구나 테스트 도구들은 중간 단계에서만 필요하고, 최종 이미지에는 포함되지 않으므로 이미지 크기를 크게 줄일 수 있습니다.
  2. 빌드 과정 분리:

    • 여러 단계를 사용하여 빌드 과정이 명확하게 분리됩니다. 예를 들어, 애플리케이션 빌드애플리케이션 실행을 서로 다른 단계에서 처리할 수 있습니다.
  3. 보안:

    • 빌드에 사용된 민감한 정보디버깅 도구가 최종 이미지에 포함되지 않도록 하여, 보안을 강화할 수 있습니다.
  4. 효율적인 캐시 사용:

    • 각 빌드 단계가 독립적이므로, 이전에 빌드된 단계를 캐시로 활용할 수 있어 빌드 시간을 단축시킬 수 있습니다.

멀티스테이지 빌드 예시

예를 들어, Go 애플리케이션을 빌드하는 경우, Go 애플리케이션을 빌드하는 과정에서 빌드 도구가 필요하지만, 최종 실행 이미지는 빌드 도구 없이 애플리케이션만 필요합니다.

단계별 설명:

  1. 첫 번째 단계:
    • Go 애플리케이션을 빌드하기 위해 Go 이미지를 사용합니다.
  2. 두 번째 단계:
    • 빌드한 애플리케이션을 실행하기 위해 최소한의 이미지(예: alpine)를 사용하여 애플리케이션만 포함된 이미지를 생성합니다.
# 1단계: 빌드 단계
FROM golang:1.17 AS builder

WORKDIR /app
COPY . .

RUN go mod tidy
RUN go build -o myapp .

# 2단계: 실행 단계
FROM alpine:latest

WORKDIR /root/
COPY --from=builder /app/myapp .

CMD ["./myapp"]

설명:

  1. 빌드 단계:

    • golang:1.17 이미지를 사용하여 애플리케이션 빌드에 필요한 모든 파일을 복사하고, 빌드합니다.
    • 이 단계에서 Go 애플리케이션을 빌드하여 myapp 바이너리 파일을 생성합니다.
  2. 실행 단계:

    • alpine:latest 이미지를 사용하여 최소한의 이미지를 생성합니다.
    • 빌드 단계에서 생성한 바이너리 파일alpine 이미지에 복사하고, 최종 이미지는 필요한 파일만 포함됩니다.

결과:

  • 최종 이미지는 alpine 이미지를 기반으로 하므로, 이미지 크기가 작습니다.
  • 빌드 도구(golang 이미지)는 최종 이미지에 포함되지 않아서, 불필요한 빌드 도구를 제거할 수 있습니다.

멀티스테이지 빌드 사용 시 고려할 점

  • 중간 단계에서 발생하는 파일을 최종 이미지로 복사하지 않도록 주의해야 합니다.
  • 최적화가 중요한 경우, 멀티스테이지 빌드를 적극 활용하여 불필요한 파일도구를 제외하고, 최소한의 애플리케이션만 포함된 이미지를 생성해야 합니다.
  • 네트워크 환경에서 멀티스테이지 빌드는 여러 단계를 거치기 때문에, 빌드 시간이 길어질 수 있음을 고려해야 합니다. 그러나 캐시를 적극 활용하면 빌드 시간을 줄일 수 있습니다.

결론

멀티스테이지 빌드는 Dockerfile에서 이미지 크기를 최소화하고 빌드 최적화를 이루는 중요한 기술입니다. 복잡한 애플리케이션을 빌드할 때 불필요한 파일이나 빌드 도구를 제외하고, 최소한의 실행 파일만 최종 이미지에 포함시킬 수 있어, 최종 이미지를 효율적으로 만들 수 있습니다. Docker에서 이미지 최적화가 중요한 경우, 멀티스테이지 빌드를 적극 활용하는 것이 좋습니다.

'Docker' 카테고리의 다른 글

Docker Compose 구성요소  (1) 2024.12.15
바인드 마운트(Bind Mount)와 볼륨(Volumes)  (0) 2024.12.10
도커 인 액션 8장  (2) 2024.12.06
도커 인 액션 7장  (0) 2024.12.06
Dockerfile 명령어  (0) 2024.12.06