"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 빌드팩을 사용하여 Spring Boot 애플리케이션의 Docker 이미지 만들기

빌드팩을 사용하여 Spring Boot 애플리케이션의 Docker 이미지 만들기

2024-11-05에 게시됨
검색:739

Creating Docker Image of Spring Boot Application using Buildpacks

소개

Spring Boot 애플리케이션을 만들었습니다. 로컬 컴퓨터에서 잘 작동하므로 이제 다른 곳에 애플리케이션을 배포해야 합니다. 일부 플랫폼에서는 jar 파일을 직접 제출하면 배포됩니다. 어떤 곳에서는 가상 머신을 가동하고 소스 코드를 다운로드하여 빌드하고 실행할 수 있습니다. 그러나 대부분의 경우 컨테이너를 사용하여 애플리케이션을 배포해야 합니다. 대부분의 경우 Docker는 컨테이너에서 이미지를 빌드하고 실행하는 데 사용됩니다. 또한 일부 플랫폼에 jar 파일을 업로드하면 애플리케이션이 내부적으로 컨테이너 내부에서 실행됩니다.

따라서 이 블로그에서는 특정 Spring Boot 애플리케이션에 대한 Docker 이미지를 빌드하는 3가지 방법을 살펴보겠습니다. 시작해보자:

기본 컨테이너 이미지

모든 애플리케이션에 대한 Docker 이미지를 빌드하는 순진하고 불충분한 방법은 이미지 내부에 jar 파일을 복사하고 java -jar 명령을 사용하여 실행하는 간단한 Dockerfile을 사용하는 것입니다.

Dockerfile 만들기

다음은 프로젝트 루트에 넣을 수 있는 Dockerfile입니다.

FROM eclipse-temurin:21-jre-ubi9-minimal

ARG JAR_FILE

COPY ${JAR_FILE} application.jar

ENTRYPOINT ["java", "-jar", "/application.jar"]

사용할 jar 파일의 위치인 JAR_FILE 인수 하나를 지정했습니다.

Docker 이미지 빌드

위의 Dockerfile을 만든 후 아래 단계를 사용하여 Docker 이미지를 만듭니다.

  1. Spring Boot 프로젝트용 jar 파일을 빌드합니다.

    ./gradlew bootJar # For Gradle build system
    

    또는

    ./mvnw spring-boot:build-jar # For Maven build system
    
  2. Dockerfile을 사용하여 최신 jar 파일을 사용하여 Docker 이미지를 빌드하세요. 아래 명령에서 {IMAGE_NAME}을 필수 이미지 이름으로 바꾸고 {JAR_FILE}을 생성된 jar 파일의 경로로 바꿉니다. 이미지 이름에는 - mycompany/product-service:0.0.1-SNAPSHOT:
    와 같은 태그도 포함되어 있습니다.

    docker build --build-arg JAR_FILE={JAR_FILE} --tag {IMAGE_NAME} .
    
  3. 다음 명령을 사용하여 Docker 이미지가 빌드되었는지 확인합니다. 위 명령에 지정된 이름의 이미지를 볼 수 있습니다.

    docker images
    

Layered Jar를 이용한 효율적인 컨테이너 이미지

Spring Boot uber jar를 Docker 이미지로 패키징하는 것이 가능하고 쉽지만(이전 방법에서 언급한 대로) Docker 이미지에서 fat jar를 그대로 복사하고 실행하는 데에는 많은 단점이 있습니다. 예를 들어,

  • Uber Jar를 압축을 풀지 않고 실행할 때 약간의 추가 오버헤드가 있습니다.
  • 애플리케이션의 코드와 모든 종속 항목을 단일 레이어에 배치하는 것은 최적이 아닙니다.

Spring Boot 버전을 업그레이드하는 것보다 코드를 더 자주 컴파일하므로 항목을 좀 더 분리하는 것이 좋습니다. 거의 변경되지 않는 jar 파일을 애플리케이션 계층 이전 계층에 배치하면 Docker는 종종 맨 아래 계층만 변경해야 하고 나머지는 캐시에서 선택할 수 있습니다.

계층화된 항아리 활성화

계층화된 Docker 이미지를 생성하려면 먼저 계층화된 jar를 생성해야 합니다. 요즘은 Gradle과 Maven에서 기본적으로 활성화되어 있습니다. 다음 설정을 사용하여 계층화된 jar 동작을 활성화하거나 비활성화할 수 있습니다:

// build.gradle
tasks.named("bootJar") {
    layered {
        enabled = false
    }
}
// build.gradle.kts
tasks.named("bootJar") {
   layered {
      enabled.set(false)
   }
}

org.springframework.bootspring-boot-maven-plugintrue

레이어 생성 방법을 조정할 수도 있습니다. Gradle 또는 Maven 구성에 대한 설명서를 참조하세요.

Dockerfile 만들기

다음은 계층화된 jar를 활용하고 Spring Boot 애플리케이션의 계층화된 Docker 이미지를 생성하는 데 사용할 수 있는 Dockerfile입니다.

# Perform the extraction in a separate builder container
FROM eclipse-temurin:21-jre-ubi9-minimal AS builder

WORKDIR /builder

# This points to the built jar file in the target folder
# Adjust this to 'build/libs/*.jar' if you're using Gradle
ARG JAR_FILE=target/*.jar

# Copy the jar file to the working directory and rename it to application.jar
COPY ${JAR_FILE} application.jar

# Extract the jar file using an efficient layout
RUN java -Djarmode=tools -jar application.jar extract --layers --destination extracted

# This is the runtime container
FROM eclipse-temurin:21-jre-ubi9-minimal

WORKDIR /application

# Copy the extracted jar contents from the builder container into the working directory in the runtime container
# Every copy step creates a new docker layer
# This allows docker to only pull the changes it really needs
COPY --from=builder /builder/extracted/dependencies/ ./
COPY --from=builder /builder/extracted/spring-boot-loader/ ./
COPY --from=builder /builder/extracted/snapshot-dependencies/ ./
COPY --from=builder /builder/extracted/application/ ./

# Start the application jar - this is not the uber jar used by the builder
# This jar only contains application code and references to the extracted jar files
# This layout is efficient to start up and CDS friendly
ENTRYPOINT ["java", "-jar", "application.jar"]

Docker 이미지 빌드

계층화된 Docker 이미지를 빌드하는 단계는 기본 Docker 이미지를 빌드하는 단계와 동일합니다. 거기를 참고해주세요.

클라우드 네이티브 빌드팩

Dockerfile을 만들지 않고도 Docker 이미지를 만들 수 있다고 말하면 어떻게 될까요? Cloud Native Buildpack을 사용하여 Gralde 또는 Maven 플러그인에서 직접 Docker 이미지를 빌드할 수 있습니다. Heroku 또는 Cloud Foundry와 같은 일부 플랫폼은 Buildpack을 사용하여 제공된 jar 파일을 실행 가능한 이미지로 변환합니다.

Spring Boot에는 Maven 및 Gradle에 대한 빌드팩 지원이 직접 포함되어 있습니다. 추가 플러그인을 포함할 필요는 없습니다. 아래 명령을 실행하세요:

./gradlew bootBuildImage # For gradle build system

또는

./mvnw spring-boot:build-image # For maven build system

위 명령은 기본 이름이 {PROJECT_NAME}:${PROJECT_VERSION}인 이미지를 생성합니다. 생성된 이미지의 이름을 구성하려면 다음 단계를 따르세요.

Gradle 빌드 시스템의 이미지 이름 구성

다음과 같이 이미지 이름을 설정하도록 bootBuildImage 작업을 구성할 수 있습니다.

// For build.gradle.kts
val imagePrefix = "javarush"
val dockerImageName = "docker-example"
tasks.named("bootBuildImage") {
   imageName.set("${imagePrefix}/${dockerImageName}:${version}")
}
// For build.gradle
def imagePrefix = "javarush"
def dockerImageName = "docker-example"
tasks.named("bootBuildImage") {
   imageName = "${imagePrefix}/${dockerImageName}:${version}"
}

Maven 빌드 시스템의 이미지 이름 구성

다음과 같이 다른 이미지 이름을 사용하도록 spring-boot-maven-plugin을 구성할 수 있습니다.

javarush

...

org.springframework.bootspring-boot-maven-plugin${imagePrefix}/${project.artifactId}:${project.version}

명령을 실행하는 동안 이미지 이름 구성

이미지를 빌드하는 명령을 실행하는 동안 이미지 이름을 정의할 수도 있습니다.

./gradlew bootBuildImage --imageName=javarush/docker-example:1.0.0 # For grade build system

./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=javarush/docker-example:1.0.0 # For maven build system

Gradle 또는 Maven 플러그인을 추가로 구성하는 방법은 문서를 참조하세요.
이것은 Spring Boot 애플리케이션용 Docker 이미지를 생성하기 위해 제가 주로 사용하는 방법입니다.

Docker 컨테이너 실행

Docker 이미지를 생성한 후에는 예상대로 작동하는지 확인해야 합니다. 이미지가 생성되었는지 확인한 후 docker run 명령을 사용하여 직접 실행할 수 있습니다. 예를 들어,

docker run -p "8080:8080" {IMAGE_NAME}

그러나 이는 프로덕션 애플리케이션에서 이미지가 사용되는 방식이 아닙니다. Docker Compose는 여러 Docker 이미지를 실행하고 관리하는 데 사용됩니다.

결론

이 블로그에서는 다양한 방법을 사용하여 Spring Boot 애플리케이션용 Docker 이미지를 빌드하는 방법을 살펴보았습니다. 이미지가 전달되기 때문에 앱용 Docker 이미지를 구축할 수 있다는 것은 알아야 할 필수 기술입니다. 기사를 끝까지 읽어주셔서 감사합니다. 감사합니다. 다음 편에 만나겠습니다. 언제나 그렇듯이 모든 피드백과 제안을 환영합니다.

릴리스 선언문 이 기사는 https://dev.to/himanshu-pareek/creating-docker-image-of-spring-boot-application-using-buildpacks-5dbo?1에서 복제됩니다. 침해가 있는 경우, Study_golang@163으로 문의하시기 바랍니다. .com에서 삭제하세요
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3