Spring Boot 프로젝트(JDK 11, WAR 패키징)를 Docker 이미지로 만드는 방법은 크게 두 가지 접근 방식이 있습니다.
-
Standalone 방식 (권장): 내장 톰캣을 사용하여 JAR처럼 java -jar 명령어로 실행 (Spring Boot의 장점 활용).
-
External Tomcat 방식: 별도의 Tomcat 컨테이너에 WAR 파일을 배포.
대부분의 Spring Boot Docker 배포는 1번(Standalone) 방식을 사용하므로 이를 기준으로 설명하고, 마지막에 2번 방식도 간략히 언급하겠습니다.
방법 1: Standalone 방식 (내장 Tomcat 사용)
Spring Boot로 빌드된 WAR 파일은 실행 가능한(executable) 아카이브이므로, JAR와 동일하게 독립적으로 실행할 수 있습니다.
1. 사전 준비 (WAR 파일 생성)
먼저 로컬에서 프로젝트를 빌드하여 .war 파일을 생성해야 합니다.
-
Gradle:
Bash./gradlew clean bootWar # 생성 위치: build/libs/프로젝트명.war -
Maven:
Bash./mvnw clean package # 생성 위치: target/프로젝트명.war
2. Dockerfile 작성
프로젝트 루트 경로(build.gradle 또는 pom.xml이 있는 곳)에 Dockerfile을 생성합니다.
# 1. Base Image 선택 (JDK 11 사용)
# 가볍고 보안성이 좋은 eclipse-temurin 또는 openjdk의 alpine 버전을 추천합니다.
FROM eclipse-temurin:11-jre-alpine
# 2. 작업 디렉토리 설정
WORKDIR /app
# 3. WAR 파일 변수 설정 (Gradle 기준 build/libs, Maven은 target)
# 예: build/libs/*.war (버전이 붙은 파일명을 자동으로 잡기 위해 와일드카드 사용)
ARG WAR_FILE=build/libs/*.war
# Maven 사용 시 위 라인을 아래로 변경:
# ARG WAR_FILE=target/*.war
# 4. 호스트의 WAR 파일을 컨테이너 내부로 복사
COPY ${WAR_FILE} app.war
# 5. 실행 명령어 (Spring Boot WAR는 java -jar로 실행 가능)
ENTRYPOINT ["java", "-jar", "/app/app.war"]
3. Docker 이미지 빌드 및 실행
# 이미지 빌드 (이미지 이름: spring-app, 태그: 1.0)
docker build -t spring-app:1.0 .
# 컨테이너 실행 (호스트 8080포트 <-> 컨테이너 8080포트 연결)
docker run -d -p 8080:8080 --name my-spring-app spring-app:1.0
방법 2: Multi-stage Build (빌드 환경 포함)
로컬에 Java가 없어도 Docker 만으로 빌드부터 실행까지 한 번에 처리하는 방식입니다. 이미지를 더 깔끔하게 관리할 수 있어 실무에서 가장 권장되는 방식입니다.
Dockerfile 내용을 아래와 같이 작성합니다.
# --- Stage 1: Build ---
FROM gradle:7-jdk11-alpine AS builder
WORKDIR /project
# 소스 코드 복사
COPY . .
# 빌드 수행 (Test 제외하여 속도 향상, 필요시 제거)
RUN ./gradlew clean bootWar -x test
# --- Stage 2: Run ---
FROM eclipse-temurin:11-jre-alpine
WORKDIR /app
# Builder 스테이지에서 생성된 WAR 파일만 복사
COPY --from=builder /project/build/libs/*.war app.war
# 실행
ENTRYPOINT ["java", "-jar", "app.war"]
(Maven 사용 시 gradle 이미지를 maven:3.8-jdk-11로, 명령어를 mvn clean package로 변경하고 경로를 target/으로 수정하면 됩니다.)
방법 3: 외장 Tomcat에 배포하는 경우 (전통적인 방식)

만약 “반드시 별도의 Tomcat 서버에 WAR를 올려야 한다”면, Base Image를 Tomcat으로 지정해야 합니다.
# Tomcat 9 (JDK 11 호환) 이미지 사용
FROM tomcat:9.0-jdk11-openjdk-slim
# 기본 webapps 내용 삭제 (선택사항)
RUN rm -rf /usr/local/tomcat/webapps/*
# WAR 파일을 ROOT.war로 복사하면 컨텍스트 경로 없이(/) 접근 가능
# Gradle 기준 경로
COPY build/libs/*.war /usr/local/tomcat/webapps/ROOT.war
# Tomcat은 기본적으로 8080 포트에서 실행되며 CMD가 이미 정의되어 있어 ENTRYPOINT 불필요
요약 및 팁
-
JDK 버전: FROM 절에 openjdk:11 혹은 eclipse-temurin:11을 명시해야 합니다.
-
파일명: COPY 할 때 와일드카드(*.war)를 사용하면 버전 번호가 바뀌어도 Dockerfile을 수정할 필요가 없어 편리합니다.
-
경량화: 운영 단계에서는 JDK(개발 도구 포함) 대신 JRE 이미지를 사용하고, OS는 Alpine이나 Slim 버전을 사용하는 것이 이미지 크기를 줄이는 데 유리합니다.