본문 바로가기

리눅스

Docker 이미지를 효율적으로 빌드하기 위한 방법

반응형

Docker 이미지를 효율적으로 빌드하기 위한 방법

Multi-Stage Build vs BuildKit

항목 Multi-Stage Build BuildKit
주요 목적 불필요한 파일 제거, 경량 이미지 생성 빌드 성능 및 유연성 향상
활용 방식 Dockerfile에 여러 스테이지 정의 Docker 엔진 빌드 옵션 활성화
멀티플랫폼 지원 기본 지원 안 함 --platform 옵션으로 멀티플랫폼 빌드
캐싱 최적화 제한적 고급 캐싱 기능 제공
비밀 관리 지원 안 함 비밀 파일 안전 전달 가능

spring initializr(link)

spring initializr

소스 파일(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_hub

docker run -d --name myapp -p 8080:8080 anti1346/playground:latest

 

참고URL

- Docker Documentation : Multi-stage builds

- Docker Documentation : BuildKit

 

728x90
반응형

'리눅스' 카테고리의 다른 글

우분투에서 Logrotate를 설정하는 방법  (0) 2025.01.18
우분투에서 python 명령어를 사용할 수 있도록 설정하는 방법  (0) 2025.01.17
sort 명령어  (0) 2025.01.16
uniq 명령어  (0) 2025.01.16
SSL 인증서 확인  (0) 2025.01.16