본문 바로가기
개발/Docker

Docker 이미지 빌드하기

by Devsong26 2023. 11. 22.

아래 스펙으로 도커 이미지를 생성하려고 합니다.

  • 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가 설치되어 있고 실행 중이어야 합니다.

'개발 > Docker' 카테고리의 다른 글

Docker 로드밸런서 구성하기  (0) 2023.11.22
Docker 블루-그린 배포  (0) 2023.11.17
도커 기본  (0) 2023.11.12