Spring Boot · 2026-01-01

Spring Boot 애플리케이션 Dockerize 및 Dockerfile 최적화

Spring Boot 애플리케이션을 컨테이너화하면서 Dockerfile 멀티스테이지, 레이어 캐시 활용, 보안 및 런타임 최적화를 다루고 CI/CD 연동과 운영 체크리스트

작성일 : 2026-01-01 ㆍ 작성자 : 관리자
post
목차

개요

컨테이너화는 애플리케이션 배포 효율과 일관성을 크게 향상시킨다. 본문은 Spring Boot 애플리케이션을 dockerize spring boot 앱 관점에서 설명하고, dockerfile 작성 시 성능과 보안을 고려한 spring boot dockerfile 최적화 방법을 정리한다. 처음 접하는 개발자도 이해할 수 있도록 단계별로 구성했다.

사전 준비

필수 도구

  • Java 11 또는 17 런타임과 빌드 도구(Maven/Gradle)
  • Docker 엔진 및 Docker Hub 또는 프라이빗 레지스트리 접근
  • .dockerignore 파일로 불필요한 파일 제외

.dockerignore 예시

target
.git
.gitignore
README.md
local.properties

핵심 원칙

  • 멀티스테이지 빌드로 빌드 도구를 런타임 이미지에서 분리
  • 레이어 캐시를 고려한 파일 복사 순서로 빌드 속도 향상
  • 작은 런타임 이미지를 사용해 공격 표면과 다운로드 시간을 감소
  • Non-root 사용자와 최소 권한 원칙 적용
  • 환경변수와 시크릿은 빌드가 아닌 런타임에 주입

대표적인 Dockerfile 예제

아래 예제는 Maven을 사용한 멀티스테이지 빌드 방식이다. 의존성 캐싱을 위해 먼저 pom.xml만 복사하고 의존성을 다운로드한 뒤 소스를 복사해 패키징한다.

FROM maven:3.8.8-openjdk-17 AS builder
WORKDIR /workspace
COPY pom.xml ./
RUN mvn -B -DskipTests dependency:go-offline
COPY src ./src
RUN mvn -B -DskipTests package -DskipTests

FROM eclipse-temurin:17-jre
WORKDIR /app
COPY --from=builder /workspace/target/*.jar app.jar
# 비루트 사용자 생성 및 전환
RUN addgroup --system appgroup && adduser --system --ingroup appgroup appuser
USER appuser
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:8080/actuator/health || exit 1
ENTRYPOINT ["java","-Xms512m","-Xmx512m","-XX:+UseContainerSupport","-jar","/app/app.jar"]

설명 및 최적화 포인트

1) 멀티스테이지와 캐시 활용

pom.xml만 먼저 복사하고 dependency:go-offline을 실행하면 의존성 레이어가 별도로 캐시된다. 코드 변경 시 전체 의존성을 다시 받지 않아 빌드 속도가 빨라진다. 이 전략은 대형 프로젝트에서 특히 효과적이다.

2) 러닝 이미지 최소화

런타임 이미지는 JRE 또는 경량 베이스 이미지로 구성해 크기를 줄인다. 더 작은 이미지일수록 보안 패치 적용과 배포 속도가 유리하다. 필요 시 distroless 또는 slim 이미지를 고려한다.

3) Non-root 실행과 권한 관리

컨테이너를 비루트 사용자로 실행하면 런타임 공격 표면을 줄일 수 있다. 파일 권한과 디렉토리 소유권을 명확히 설정해 예기치 않은 권한 문제를 예방한다.

4) 환경 변수와 시크릿 분리

민감한 설정은 이미지에 직접 포함하지 않고 런타임에 주입한다. Kubernetes Secret, Docker secrets, 또는 CI/CD의 보안 변수 기능을 사용한다.

5) JVM 옵션과 컨테이너 친화적 설정

-XX:+UseContainerSupport 등 컨테이너 자원 제약을 반영하는 옵션을 설정하면 메모리 사용이 안정화된다. 또한 초기 힙과 최대 힙을 적절히 조정하여 OOM 가능성을 줄인다.

레이어드 JAR과 추가 최적화

Spring Boot의 레이어드 JAR 기능을 사용하면 변경 빈도가 낮은 의존성과 변경 빈도가 높은 애플리케이션 클래스를 분리해 레이어 캐시 효율을 극대화할 수 있다. 빌드 플러그인 설정으로 레이어 구성 후, Dockerfile에서 각 레이어를 별도 복사하면 이미지 재구성 비용을 낮출 수 있다.

CI/CD와 이미지 빌드 전략

  • 빌드 서버에서는 캐시를 활용하도록 설정하고, 가능하면 빌드 캐시를 공유한다.
  • 이미지 태깅 정책을 엄격히 하여 배포 추적성을 확보한다(예: semantic version + git SHA).
  • 스캐닝 도구로 이미지 취약점을 정기적으로 점검한다.

운영 체크리스트

  • 이미지 크기와 빌드 시간 측정
  • 헬스체크 및 로그 수준 확인
  • 리소스 요청/한도 설정 및 JVM 튜닝 검토
  • 보안 스캐닝과 정기 패치 주기 수립

결론

spring boot docker best practices는 이미지 크기, 빌드 속도, 보안, 운영 편의성을 균형 있게 고려하는 것이다. 멀티스테이지 빌드와 레이어 캐시 활용, 비루트 사용자 적용, 환경변수 분리, 그리고 CI/CD 연동을 통해 안정적이고 효율적인 컨테이너화가 가능하다. 처음에는 기본 패턴을 적용하고 운영 환경에서 측정한 결과를 바탕으로 점진적으로 최적화하는 접근을 권장한다.

spring boot dockerfile 최적화 dockerize spring boot 앱 spring boot docker best practices dockerfile 최적화 멀티스테이지 빌드 컨테이너 보안 이미지 최적화 CI/CD 연동