아래 스펙으로 도커 이미지를 생성하려고 합니다.
- jdk-17
- Spring Boot 3.1.5
- Spring Reactive Web
- Gradle
도커 컨테이너를 실행 후 아래 RESTful API를 요청 시 응답되는지 확인하는 것이 목적입니다.
GET, http://localhost:8080/hello
컨트롤러 코드는 아래와 같습니다.
@RestController
public class DemoController {
@GetMapping("/greeting")
public Mono<String> greeting(){
return Mono.fromSupplier(() -> {
final int now_hour = LocalTime.now().getHour();
final int num = now_hour < 12 ? 1 : now_hour == 12 ? 2 : 3;
return switch (num) {
case 1 -> "Good morning!";
case 2 -> "Good afternoon!";
default -> "Good evening!";
};
});
}
}
Spring 애플리케이션을 Docker 이미지로 빌드하는 과정은 몇 단계로 이루어집니다.
기본적으로, Spring Boot 애플리케이션을 먼저 빌드하고, 이를 기반으로 Docker 이미지를 생성합니다.
1단계: Spring Boot 애플리케이션 빌드
먼저, 애플리케이션을 jar 파일로 빌드합니다. Maven 또는 Gradle을 사용한다면, 프로젝트 루트 디렉토리에서 다음 명령어를 실행합니다:
// Maven 사용 시
mvn clean package
// Gradle 사용 시
./gradlew build
이렇게 하면 `target` 또는 `build/libs` 디렉토리에 실행 가능한 jar 파일이 생성됩니다.
2단계: Dockerfile 작성
Dockerfile을 프로젝트 루트 디렉토리에 생성합니다. 이 파일은 Docker 이미지를 빌드하는 방법을 정의합니다. 기본적인 Dockerfile 예시는 다음과 같습니다:
# Intellij, Gradle로 진행했습니다.
# Dockerfile 빌드하기 전 위치를 workspace의 루트에 위치시켜야 합니다.
# Debian 이미지를 기반으로 시작
FROM debian:latest
# 환경 변수 설정
ENV TZ=Asia/Seoul
# 필요한 패키지 설치 및 시간대 설정
RUN apt-get update && \
apt-get install -y curl openjdk-17-jdk tzdata && \
ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone && \
dpkg-reconfigure -f noninteractive tzdata
# 애플리케이션 파일 복사 및 설정
COPY build/libs/your-app.jar /usr/app/
WORKDIR /usr/app
# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "your-app.jar"]
이 Dockerfile은 OpenJDK 17이 설치된 Alpine Linux 이미지를 기반으로 하며, 빌드된 jar 파일을 `app.jar`라는 이름으로 이미지 내부로 복사합니다. 그리고 `java -jar your-app.jar` 명령어로 애플리케이션을 실행합니다.
3단계: Docker 이미지 빌드
Dockerfile이 있는 디렉토리에서 다음 명령어를 실행하여 Docker 이미지를 빌드합니다:
docker build -t your-app-name .
이 명령어는 현재 디렉토리(`.`)의 Dockerfile을 사용하여 `your-app-name`이라는 이름의 Docker 이미지를 생성합니다.
4단계: Docker 컨테이너 실행
빌드된 이미지를 사용하여 Docker 컨테이너를 실행합니다:
docker run -p 8080:8080 your-app-name
이 명령어는 `your-app-name` 이미지를 기반으로 하는 컨테이너를 시작하며, 컨테이너의 8080 포트를 호스트의 8080 포트에 연결합니다.
아래는 API 요청에 의한 응답입니다.
주의사항
- Dockerfile에서 사용하는 베이스 이미지(` openjdk:17-jdk `)와 애플리케이션의 Java 버전이 호환되어야 합니다.
- 애플리케이션의 포트와 Docker 컨테이너의 포트를 올바르게 매핑해야 외부에서 접근할 수 있습니다.
- 이미지 이름(`your-app-name`)과 태그는 프로젝트에 맞게 적절히 변경하세요.
- Docker를 사용하여 이미지를 빌드하고 컨테이너를 실행하기 위해서는 로컬 시스템에 Docker가 설치되어 있고 실행 중이어야 합니다.
'[개발] Infrastructure > Container' 카테고리의 다른 글
Skaffold (0) | 2024.08.10 |
---|---|
JIB (0) | 2024.08.10 |
Docker 로드밸런서 구성하기 (0) | 2023.11.22 |
도커 기본 (0) | 2023.11.12 |