반응형
Docker 이미지를 효율적으로 빌드하기 위한 방법
Multi-Stage Build vs BuildKit
항목 | Multi-Stage Build | BuildKit |
주요 목적 | 불필요한 파일 제거, 경량 이미지 생성 | 빌드 성능 및 유연성 향상 |
활용 방식 | Dockerfile에 여러 스테이지 정의 | Docker 엔진 빌드 옵션 활성화 |
멀티플랫폼 지원 | 기본 지원 안 함 | --platform 옵션으로 멀티플랫폼 빌드 |
캐싱 최적화 | 제한적 | 고급 캐싱 기능 제공 |
비밀 관리 | 지원 안 함 | 비밀 파일 안전 전달 가능 |
spring initializr(link)
소스 파일(demo)
$ ls
Dockerfile HELP.md build.gradle gradle gradlew gradlew.bat settings.gradle src
Multi Stage Build (멀티 스테이지 빌드)
Dockerfile 내에서 여러 단계(빌드 환경과 실행 환경을 분리)를 정의하여 최적화된 이미지를 생성하는 데 유용합니다.
vim Dockerfile
# Stage 1: Build
FROM gradle:8.12-jdk21-alpine AS builder
WORKDIR /app
COPY build.gradle settings.gradle gradlew /app
COPY gradle /app/gradle
RUN chmod +x gradlew
RUN ./gradlew build || return 0
COPY src /app/src
RUN ./gradlew clean build
# Stage 2: Runtime
FROM openjdk:21-jdk-slim AS runtime
ENV ARTIFACT_NAME=build/libs/demo-0.0.1-SNAPSHOT.jar
WORKDIR /app
COPY --from=builder /app/$ARTIFACT_NAME /app/demo.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/demo.jar"]
Stage 1 : Build에서는 Gradle을 사용해 애플리케이션을 빌드합니다.
Stage 2 : Runtime에서는 빌드된 JAR 파일만 복사하여 실행 환경에 배포합니다.
docker build --tag anti1346/playground:latest \
--no-cache --push .
docker run -d --name myapp -p 8080:8080 anti1346/playground:latest
BuildKit (빌드킷)
Docker의 새로운 빌드 엔진으로 Multi Stage Build를 포함하여 더 빠른 빌드와 멀티플랫폼 이미지를 지원하며 고급 빌드 기능을 제공합니다.
BuildKit의 주요 기능 및 활용
병렬 빌드 : BuildKit은 Dockerfile의 여러 단계를 병렬로 실행하여 빌드 시간을 단축합니다. 특별한 설정을 하지 않아도 자동으로 적용됩니다.
캐시 효율성 향상 : BuildKit은 빌드 캐시를 더욱 효율적으로 관리하여 변경된 부분만 다시 빌드하고 이전 단계의 캐시를 재사용하여 빌드 속도를 향상시킵니다.
vim Dockerfile
# Stage 1: Build
FROM gradle:8.12-jdk21-alpine AS builder
WORKDIR /app
COPY build.gradle settings.gradle gradlew /app
COPY gradle /app/gradle
RUN chmod +x gradlew
RUN --mount=type=cache,target=/root/.gradle ./gradlew dependencies
COPY src /app/src
RUN ./gradlew clean build
# Stage 2: Runtime
FROM openjdk:21-jdk-slim AS runtime
ENV ARTIFACT_NAME=build/libs/demo-0.0.1-SNAPSHOT.jar
WORKDIR /app
COPY --from=builder /app/$ARTIFACT_NAME /app/demo.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/demo.jar"]
- Gradle 의존성 캐시 마운트
RUN --mount=type=cache,target=/root/.gradle ./gradlew dependencies
Docker 드라이버 변경
Docker 데몬 설정 파일을 수정합니다.
sudo vim /etc/docker/daemon.json
{
"experimental": true,
"features": {
"buildkit": true
}
}
sudo systemctl restart docker
빌드 환경 변경
빌드 환경 초기화
docker buildx create --use
멀티 플랫폼 빌드 실행
docker build --platform linux/amd64,linux/arm64 \
--tag anti1346/playground:latest \
--no-cache --push .
docker run -d --name myapp -p 8080:8080 anti1346/playground:latest
참고URL
- Docker Documentation : Multi-stage builds
- Docker Documentation : BuildKit
728x90
반응형
'리눅스' 카테고리의 다른 글
우분투에서 python 명령어를 사용할 수 있도록 설정하는 방법 (0) | 2025.01.17 |
---|---|
sort 명령어 (0) | 2025.01.16 |
uniq 명령어 (0) | 2025.01.16 |
SSL 인증서 확인 (0) | 2025.01.16 |
ps kill 명령어 (0) | 2025.01.16 |