빌드팩을 사용하여 Spring Boot 애플리케이션의 Docker 이미지 만들기
소개
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 이미지를 생성합니다.
-
Spring Boot 프로젝트용 jar 파일 빌드:
./gradlew bootJar # For Gradle build system
또는
./mvnw spring-boot:build-jar # For Maven build system
-
최신 jar 파일을 사용하여 Docker 이미지를 빌드하려면 Dockerfile을 사용하세요. 아래 명령에서 {IMAGE_NAME}을 필수 이미지 이름으로 바꾸고 {JAR_FILE}을 생성된 jar 파일의 경로로 바꿉니다. 이미지 이름에는 - mycompany/product-service:0.0.1-SNAPSHOT:
과 같은 태그도 포함되어 있습니다.docker build --build-arg JAR_FILE={JAR_FILE} --tag {IMAGE_NAME} .
-
다음 명령을 사용하여 Docker 이미지가 빌드되었는지 확인하세요. 위 명령에 지정된 이름의 이미지를 볼 수 있습니다.
docker images
Layered Jar를 이용한 효율적인 컨테이너 이미지
Spring Boot uber jar를 Docker 이미지로 패키징하는 것이 가능하고 쉽지만(이전 방법에서 언급했듯이), fat jar를 Docker 이미지에서 그대로 복사하고 실행하는 데는 많은 단점이 있습니다. 예를 들어
- 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>("bootJar") { layered { enabled.set(false) } }
<!-- pom.xml --> <project> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layers> <enabled>true</enabled> </layers> </configuration> </plugin> </plugins> </build> </project>
레이어 생성 방법을 조정할 수도 있습니다. 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>("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을 구성하여 다른 이미지 이름을 사용할 수 있습니다.
<properties> <imagePrefix>javarush</imagePrefix> </properties> ... <project> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <image> <name>${imagePrefix}/${project.artifactId}:${project.version}</name> </image> </configuration> </plugin> </plugins> </build> </project>
명령을 실행하는 동안 이미지 이름 구성
이미지를 빌드하는 명령을 실행하는 동안 이미지 이름을 정의할 수도 있습니다.
./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
You can see the documentation to further configure Gradle or Maven plugin.
This is my go-to method to create a Docker image for any Spring Boot application.
Running Docker Container
Once you create a docker image, you need to make sure that it works as expected. After you make sure that the image is created, you can directly run it using the docker run command. For example,
docker run -p "8080:8080" {IMAGE_NAME}
But, this is not how images are used in production applications. Docker Compose is used to run and manage multiple docker images.
Conclusion
In this blog, we have seen how to build Docker images for Spring Boot applications using different methods. Being able to build docker images for your apps is a must skill to know because the image is what gets delivered. Thanks for reading the article till the end. I appreciate it. I will meet you in the next one. As always, all feedback and suggestions are welcome.
위 내용은 빌드팩을 사용하여 Spring Boot 애플리케이션의 Docker 이미지 만들기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

이전 날짜 및 달력 클래스를 대체하기 위해 Java.Time 패키지의 클래스를 사용하십시오. 2. LocalDate, LocalDateTime 및 LocalTime을 통해 현재 날짜와 시간을 얻으십시오. 3. () 메소드를 사용하여 특정 날짜와 시간을 만듭니다. 4. 플러스/마이너스 방법을 사용하여 시간을 불안정하게 늘리고 감소시킵니다. 5. ZonedDateTime 및 Zoneid를 사용하여 시간대를 처리하십시오. 6. DateTimeFormatter를 통해 형식 및 구문 분석 날짜 문자열; 7. 필요한 경우 이전 날짜 유형과 호환되도록 즉시 사용하십시오. 현대 Java의 날짜 처리는 명확하고 불변의 선형을 제공하는 Java.Timeapi 사용에 우선 순위를 부여해야합니다.

JDBC 트랜잭션을 올바르게 처리하려면 먼저 자동 커밋 모드를 끄고 여러 작업을 수행 한 다음 결과에 따라 커밋 또는 롤백을 수행해야합니다. 1. 트랜잭션을 시작하려면 Conn.SetAutoCommit (False)에게 전화하십시오. 2. 인서트 및 업데이트와 같은 여러 SQL 작업을 실행합니다. 3. 모든 작업이 성공한 경우 Conn.commit ()에게 전화하여 데이터 일관성을 보장하기 위해 예외가 발생하면 Conn.Rollback ()에게 전화하십시오. 동시에, 재 시도는 리소스를 관리하고, 예외를 올바르게 처리하고, 연결 유출을 피하기 위해 긴밀한 연결을 사용하는 데 사용해야합니다. 또한 연결 풀을 사용하고 부분적으로 롤백을 달성하기 위해 저장 포인트를 설정하고 성능을 향상시키기 위해 거래를 가능한 한 짧게 유지하는 것이 좋습니다.

의존성 (DI) ISADESIGNPATTORNWHEREWHEDROUDIVESTESTESTETESTERGROWCONSTRUCTOR, 2.SPRINGFRAMEWWERTHUSENONTATIONS와 같은@autowiredWithjava 기반 CONCUTTATIONS LIKERWITHCONSTRUCTOR, ORFIELDINGESS.2.SPRINGFRAMEWWERTHUSENNOTATIONS

Pre-FormancetArtUptimeMoryUsage, Quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless sinarios.2.thyvelopecosyste,

setupamaven/gradleProjectwithJax-rsddependencies likejersey; 2. createarestresourceUsingAnnotationsSuchas@pathand@get;

성능 분석 도구를 사용하여 병목 현상을 찾고 개발 및 테스트 단계에서 VisualVM 또는 JProfiler를 사용하며 생산 환경에서 Async-Profiler에 우선 순위를 부여합니다. 2. 객체 생성을 줄이고, 개체를 재사용하고, StringBuilder를 사용하여 문자열 스 플라이 싱을 교체하고, 적절한 GC 전략을 선택하십시오. 3. 장면에 따라 수집 사용을 최적화하고 초기 용량을 선택하고 사전 설정합니다. 4. 동시성 최적화, 동시 컬렉션을 사용하고, 잠금 세분화를 줄이고, 스레드 풀을 합리적으로 설정하십시오. 5. JVM 매개 변수 조정, 합리적인 힙 크기 및 저도 가비지 수집기를 설정하고 GC 로그를 활성화합니다. 6. 코드 레벨에서 반사를 피하고, 래퍼 클래스를 기본 유형으로 바꾸고, 초기화를 지연시키고, 최종 및 정적을 사용하십시오. 7. JMH와 결합 된 지속적인 성능 테스트 및 모니터링

Maven은 Java 프로젝트 관리 및 건설을위한 표준 도구입니다. 답은 POM.XML을 사용하여 프로젝트 구조, 종속성 관리, 건설 라이프 사이클 자동화 및 플러그인 확장을 표준화한다는 사실에 있습니다. 1. pom.xml을 사용하여 groupId, artifactid, 버전 및 종속성을 정의하십시오. 2. MVNClean, 컴파일, 테스트, 패키지, 설치 및 배포와 같은 마스터 코어 명령; 3. 종속성 버전 및 충돌을 관리하기 위해 종속성 관리 및 제외를 사용합니다. 4. 다중 모듈 프로젝트 구조를 통해 대규모 응용 프로그램을 구성하고 부모 POM에 의해 균일하게 관리됩니다. 5.

thejvmenablesjava의 "WriteOnce, Runynywhere"기능은 비록 excodecodethroughfourmaincomponents : 1. theclassloadersubsystemloads, 링크, 및 intinitializes.classfilesusingbootsprap, extension, andapplicationclassloaders, ensuringsecureandlazyclasloa
