반응형
해당 글에서는 Dockerfile을 구성하여 Spring Boot App을 컨테이너 환경 구성 이후 배포 방법에 대해 알아봅니다.
💡 [참고] Docker에 대해 더 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
분류 | 설명 | 링크 |
이해하기 | Docker 환경 설치 및 실행 방법 | https://adjh54.tistory.com/350 |
이해하기 | Docker 기초 이론(아키텍처, 흐름, 주요 용어) | https://adjh54.tistory.com/352 |
이해하기 | Docker 컨테이너 라이프 사이클 & CLI | https://adjh54.tistory.com/359 |
이해하기 | DockerFile 이론 + Nginx 환경 구성 및 배포 방법 | https://adjh54.tistory.com/414 |
환경구성 | DockerFile + Vault 환경 구성 및 배포 방법 | https://adjh54.tistory.com/415 |
환경구성 | DockerFile + React 환경 구성 및 배포 방법 | https://adjh54.tistory.com/417 |
환경구성 | DockerFile + Spring Boot 환경 구성 및 배포 방법 | https://adjh54.tistory.com/420 |
1) Spring Boot App 구성
1. 개발 환경 확인
💡 개발 환경 확인
- 해당 구성에 사용된 개발 환경입니다.
환경 | 버전 |
Java | 17 |
JDK | 17.0.8 |
Spring Boot | 3.2.2 |
Spring Boot Web | 3.2.2 |
Gradle | 8.5 |
Packaging | Jar |
2. New Project로 새로운 프로젝트를 구성합니다.
3. Spring Boot 버전과 함께 사용할 라이브러리를 선택합니다.
4. 아래와 같은 구조의 프로젝트가 생성됨을 확인하였습니다.
5. 배포된 API 테스트를 위해서 간단한 Endpoint를 구성합니다.
💡 배포된 API 테스트를 위해서 간단한 Endpoint를 구성합니다.
- controller 패키지를 구성하고 TestController.java 파일을 생성하였습니다.
- [GET] http://localhost:8080/api/v1/test/hello로 호출하면 “API 통신에 성공하였습니다.”라고 출력이 되도록 구성하였습니다.
package com.example.simplespringboot.controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Please explain the class!!
*
* @author : jonghoon
* @fileName : TestController
* @since : 2/5/24
*/
@RestController
@RequestMapping("/api/v1/test")
public class TestController {
@GetMapping("/hello")
public ResponseEntity<Object> testApi() {
String result = "API 통신에 성공하였습니다.";
return new ResponseEntity<>(result, HttpStatus.OK);
}
}
2) Dockerfile + Spring Boot App 사용예시 : 구성하기
1. 프로젝트 루트 경로에 Dockerfile을 생성합니다.
2. Dockerfile을 구성합니다.
💡 Dockerfile을 구성합니다
FROM bellsoft/liberica-openjdk-alpine:17
# or
# FROM openjdk:8-jdk-alpine
# FROM openjdk:11-jdk-alpine
CMD ["./gradlew", "clean", "build"]
# or Maven
# CMD ["./mvnw", "clean", "package"]
VOLUME /tmp
ARG JAR_FILE=build/libs/*.jar
# or Maven
# ARG JAR_FILE_PATH=target/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
명령어 | 설명 |
FROM bellsoft/liberica-openjdk-alpine:17 | 베이스 이미지로 Java 17버전이 포함된 Docker 이미지를 사용 |
# FROM openjdk:8-jdk-alpine | 필요시, OpenJDK 8 버전을 기반으로 하는 이미지를 설정할 수 있습니다. |
# FROM openjdk:11-jdk-alpine | 필요시,OpenJDK 11 버전을 기반으로 하는 이미지를 설정할 수 있습니다. |
CMD ["./gradlew", "clean", "build"] | Gradle을 사용해 빌드를 실행하는 명령어 |
# CMD ["./mvnw", "clean", "package"] | 필요시, Mavne을 사용해 빌드를 실행하는 명령어 |
VOLUME /tmp | 컨테이너 내에 /tmp 디렉터리를 볼륨으로 설정 |
ARG JAR_FILE=build/libs/*.jar | Gradle로 빌드한 jar 파일의 위치를 변수로 설정 |
ARG JAR_FILE_PATH=target/*.jar | 필요시, Maven으로 빌드한 jar 파일의 위치를 변수로 설정 |
COPY ${JAR_FILE} app.jar | JAR_FILE 변수에 지정된 파일을 app.jar라는 이름으로 컨테이너에 추가 |
EXPOSE 8080 | 컨테이너가 사용할 포트를 설정, 이 경우에는 8080 포트를 사용 |
ENTRYPOINT ["java","-jar","/app.jar"] | 컨테이너가 실행될 때 기본적으로 실행될 명령어를 설정, 이 경우에는 Java 애플리케이션을 실행하는 명령어 |
[ 더 알아보기 ]
💡 mvnw(Maven Wrapper) , Gradle Wrapper란?
- 빌드 도구로 Maven과 Gradle을 이용하는 프로젝트에서 더 쉽게 빌드하고 실행할 수 있도록 돕는 도구입니다.
- 이를 이용하면 개발자는 빌드 도구를 별도로 설치하거나 관리할 필요 없이 프로젝트를 빌드할 수 있습니다.
- 또한, 모든 개발자와 CI/CD 시스템이 동일한 빌드 도구의 버전을 사용하여 프로젝트를 빌드하므로, 빌드의 일관성과 신뢰성을 높일 수 있습니다.
💡 tmp 볼륨을 생성하는 이유는?
- Docker 컨테이너 내부에 임시 파일을 저장하기 위한 볼륨을 생성합니다. 이는 컨테이너와 호스트 시스템 간의 데이터를 공유하거나, 컨테이너 간에 데이터를 공유하거나, 컨테이너의 데이터를 지속적으로 유지하는 데 사용될 수 있습니다.
- 또한 임시 파일은 컨테이너가 종료되었을 때 자동으로 삭제되므로, 이를 통해 디스크 공간을 절약할 수 있습니다.
💡 [참고] Java 17 버전 이상은 아래의 Docker Hub에서 이미지를 다운로드합니다.
[ 더 알아보기 ]
1. java:<version>
- 표준 Java Docker 이미지이며, 모든 Java 기능을 포함하고 있습니다.
2. java:<version>-alpine
- 리눅스 기반의 Java Docker 이미지로, 이미지 크기를 최소화하기 위해 만들어졌습니다. 그러나 모든 Java 기능을 포함하고 있지 않을 수 있습니다
3. java:<version>-slim
- 또한 이미지 크기를 줄이기 위해 만들어졌지만, 알파인보다는 더 많은 기능을 포함하고 있습니다.
3) Dockerfile + Spring Boot App 사용예시 : 실행하기
1. 컨테이너 이미지 생성
💡 컨테이너 이미지 생성
- 생성된 이미지를 기반으로 컨테이너를 실행합니다.
# format
$ docker build -t <컨테이너 이미지 이름> .
# 컨테이너 이미지 생성
$ docker build -t simple-spring-boot-app .
💡 [참고] Docker Desktop에서 생성된 컨테이너 이미지를 확인합니다.
2. 컨테이너 실행
💡 컨테이너 실행
- 생성된 이미지를 기반으로 컨테이너를 실행합니다.
명령어 | 설명 |
docker run | Docker 이미지를 실행하는 명령어 |
-d | 컨테이너를 백그라운드에서 실행하도록 설정 |
--name simple-spring-boot-app | 실행하는 컨테이너의 이름을 'simple-spring-boot-app'으로 지정 |
-p 3000:3000 | 호스트 기기의 8080번 포트와 컨테이너의 8080번 포트를 연결 |
simple-spring-boot-app | 실행할 Docker 이미지의 이름 |
# format
$ docker run -d --name <컨테이너 이름> -p 8080:8080 <실행할 이미지 이름>
# 컨테이너 생성 및 실행
$ docker run -d --name simple-spring-boot-app -p 8080:8080 simple-spring-boot-app
💡 [참고] Docker Desktop에서 생성된 컨테이너 상태를 확인합니다.
3. 구성한 Spring Boot API로 호출을 해봅니다.
💡 구성한 Spring Boot API로 호출을 해봅니다
- 위에서 구성한 Endpoint로 호출하였을대 결과값을 확인할 수 있습니다.
4. 컨테이너를 멈추고 Spring Boot App을 다시 접근해 봅니다.
💡 컨테이너를 올리고 내림에 따라 수행이 잘됨을 확인하였습니다.
오늘도 감사합니다. 😀
반응형
'Docker > 환경설정 및 구성' 카테고리의 다른 글
[Docker] Dockerfile을 이용한 RabbitMQ 환경 구성 및 실행방법 (0) | 2024.05.28 |
---|---|
[Docker] Dockerfile을 이용한 Redis 환경 구성 및 실행방법 (0) | 2024.03.16 |
[Docker] Dockerfile을 이용한 React App 배포 환경 구성 및 실행방법 (0) | 2024.02.03 |
[Docker] Dockerfile을 이용한 Vault 배포 환경 구성 및 실행방법 (0) | 2024.02.03 |
[Docker] Vault에서 Unseal Key를 잃어버린 경우 초기화 방법 (0) | 2024.01.18 |