본문 바로가기

개발/Spring Boot

[Spring Boot] Docker로 Spring Boot 프로젝트 배포하기

Step 1. Spring Boot JAR 파일 빌드

우선 배포할 프로젝트의 루트 디렉토리로 이동한다.

 

그리고 Docker 이미지를 생성하기 전에 Gradle을 이용하여 Spring Boot 프로젝트를 실행 가능한 JAR 파일로 빌드한다.

./gradlew clean bootJar
  • clean: 기존 빌드 결과 삭제
  • bootJar: Spring Boot 실행 가능한 JAR 파일 생성

빌드가 정상적으로 완료되면 build/libs 폴더에 

todolist-0.0.1-SNAPSHOT.jar

와 같이 JAR 파일이 생성될 것이다.

 

Step 2. Dockerfile 작성

todolist/Dockerfile

# Java 21 실행 환경
FROM eclipse-temurin:21-jre

# 컨테이너 내부 작업 디렉터리
WORKDIR /app

# Gradle 빌드 결과물 복사
COPY build/libs/*.jar app.jar

# Spring Boot 포트
EXPOSE 8080

# Spring Boot 실행
ENTRYPOINT ["java", "-jar", "app.jar"]

이 Dockerfile에서는 build/libs/ 디렉터리에 JAR 파일이 하나만 존재한다고 가정한다.

 

명령어 역할
FROM Java 21 JRE 기반 이미지 사용
WORKDIR 컨테이너 내 /app 디렉터리 설정
COPY 로컬 JAR 파일을 컨테이너로 복사
EXPOSE 애플리케이션 포트 8080 명시
ENTRYPOINT 컨테이너 시작 시 JAR 실행

 

Step 3. compose.yaml 생성

todolist/compose.yaml

services:
  app:
    build: .
    image: todolist:1.0
    container_name: todolist-container
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://host.docker.internal:3306/spring_study
      SPRING_DATASOURCE_USERNAME: spring
      SPRING_DATASOURCE_PASSWORD: spring1234
      JWT_SECRET: "${JWT_SECRET}"
  • app: Spring Boot 서비스 이름
  • build: .: 현재 폴더의 Dockerfile로 이미지 빌드
  • image: 이미지 이름과 태그
  • container_name: 컨테이너 이름
  • ports: 호스트와 컨테이너의 포트 연결 (호스트:컨테이너)
  • environment: 컨테이너에서 실행되는 애플리케이션에 환경변수를 전달한다.

환경 변수 부분은 로컬 호스트에서 실행중인 MySQL에 연결하는 부분이다.

Step 4. 프로젝트 빌드 및 실행

우선 프로젝트를 실행하기 전에 JWT키를 설정한다.

 

터미널에서

export JWT_SECRET="$(openssl rand -base64 32)"

 

그리고 다음 명령어를 실행하면

docker compose up -d --build

 

Docker Compose가 Dockerfile을 읽어 이미지를 빌드하고 컨테이너를 실행한다.