현대적인 애플리케이션 배포 방식은 더 이상 서버에 직접 코드를 복사하는 형태가 아닙니다. 대신, 실행 환경과 애플리케이션을 하나의 이미지(Image)로 패키징하여 어디서나 동일하게 실행할 수 있는 Docker 컨테이너 기반 배포가 표준이 되었습니다.
Docker를 사용하는 이유
Spring Boot는 자체적으로 내장 톰캣을 포함하고 있어, 독립 실행이 가능하지만 운영 환경마다 Java 버전, 설정, OS 환경이 달라 문제가 발생할 수 있습니다. Docker를 이용하면 이러한 환경 차이를 없애고, “어디서 실행해도 동일하게 동작”하는 배포를 실현할 수 있습니다.
- 개발/운영 환경의 일관성 확보
- 배포 자동화 (CI/CD)와 연동 용이
- 컨테이너 기반 스케일링 (ECS, Kubernetes 등)
1. Spring Boot 애플리케이션 빌드
먼저, 기존 Spring Boot 프로젝트를 패키징합니다.
./gradlew clean build
# 또는
mvn clean package
빌드가 완료되면 build/libs 또는 target 디렉토리에 JAR 파일이 생성됩니다. 예를 들어, build/libs/demo-0.0.1-SNAPSHOT.jar 와 같은 형태입니다.
2. Dockerfile 작성
Dockerfile은 애플리케이션을 어떻게 이미지로 만들지 정의하는 파일입니다. 아래는 Spring Boot용 대표적인 Dockerfile 예시입니다.
# 1. 빌드 이미지 (멀티스테이지)
FROM gradle:8.5-jdk17 AS builder
WORKDIR /app
COPY . .
RUN gradle clean bootJar
# 2. 실행 이미지
FROM eclipse-temurin:17-jdk-alpine
WORKDIR /app
COPY --from=builder /app/build/libs/*.jar app.jar
# 3. 실행 명령
ENTRYPOINT ["java","-jar","/app/app.jar"]
위 구성은 멀티 스테이지 빌드(Multi-stage build) 방식을 사용하여, 빌드 환경(Gradle)을 분리하고 최종 이미지는 최소한의 JDK 환경만 포함하도록 구성했습니다.
3. Docker 이미지 빌드
docker build -t springboot-demo:latest .
빌드가 완료되면 아래 명령으로 이미지 목록을 확인할 수 있습니다.
docker images
출력 예시:
REPOSITORY TAG IMAGE ID CREATED SIZE
springboot-demo latest 5d8f6fabc123 2 minutes ago 312MB
4. Docker 컨테이너 실행
빌드된 이미지를 실행합니다.
docker run -d -p 8080:8080 --name springboot-demo springboot-demo
-p 8080:8080은 호스트(왼쪽)와 컨테이너(오른쪽)의 포트를 연결합니다. 정상적으로 실행되면 http://localhost:8080 에서 애플리케이션에 접근할 수 있습니다.
5. 로그 및 상태 확인
docker ps # 실행 중인 컨테이너 확인
docker logs -f springboot-demo # 실시간 로그 출력
docker stop springboot-demo # 컨테이너 중지
docker rm springboot-demo # 컨테이너 삭제
Docker는 애플리케이션 로그를 표준 출력(stdout)으로 관리하므로, 별도의 로그 설정 없이도 docker logs 명령으로 확인 가능합니다.
6. Docker Compose로 여러 서비스 함께 실행
실무에서는 Spring Boot 애플리케이션뿐 아니라 MySQL, Redis 등의 서비스를 함께 실행해야 하는 경우가 많습니다. 이럴 때 docker-compose.yml을 이용하면 여러 컨테이너를 하나의 명령으로 실행할 수 있습니다.
version: "3.8"
services:
app:
image: springboot-demo:latest
ports:
- "8080:8080"
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: demo
ports:
- "3306:3306"
docker-compose up -d
이제 애플리케이션과 MySQL이 함께 실행되며, 서비스 간 연결도 자동으로 설정됩니다.
7. 배포 전략
Docker 이미지는 CI/CD 파이프라인과 함께 사용할 때 강력한 배포 자동화가 가능합니다.
- 로컬 개발: Docker Compose로 개발 환경 구성
- 테스트/스테이징: Docker Registry(ECR, GCR, Docker Hub)에 이미지 푸시
- 프로덕션: AWS ECS, Kubernetes, Naver Cloud Container Registry 등을 통해 컨테이너 오케스트레이션
8. Jib 플러그인으로 Dockerfile 없이 배포
Spring Boot는 Jib 플러그인을 이용하면 Dockerfile 없이도 이미지를 빌드할 수 있습니다.
plugins {
id 'com.google.cloud.tools.jib' version '3.4.1'
}
jib {
to {
image = 'your-dockerhub-id/springboot-demo:latest'
}
}
./gradlew jibDockerBuild
이 방식은 CI/CD 파이프라인에서 별도의 Docker 엔진 없이도 이미지를 직접 빌드하고 배포할 수 있는 장점이 있습니다.
주의할 점
- JAR 파일 크기가 클 경우 이미지 빌드 속도에 영향 → Layer 캐싱 최적화 필요
- 환경변수 설정은
-e옵션 또는 Compose 파일에서 관리 - 운영 환경에서는 JRE 기반 이미지(예: eclipse-temurin:17-jre-alpine) 사용으로 용량 최소화
- 로그, 설정 파일은 외부 볼륨 마운트로 관리하여 컨테이너 교체 시 데이터 유지
Spring Boot와 Docker를 결합하면 배포와 환경 구성이 훨씬 간단해집니다. 컨테이너 기반 배포는 클라우드 환경(AWS ECS, EKS, GCP GKE, NCP)에서 특히 강력하며, CI/CD 파이프라인과 함께 활용하면 완전한 자동화 배포가 가능합니다.
'개발 > JAVA' 카테고리의 다른 글
| Spring Boot와 Jenkins CI/CD 파이프라인 구축 - 자동화된 배포 환경 만들기 (0) | 2025.11.11 |
|---|---|
| Spring Boot + Kubernetes 배포하기 - 컨테이너 오케스트레이션으로 확장성 확보 (0) | 2025.11.10 |
| Sleuth와 Zipkin으로 분산 트레이싱 - 마이크로서비스의 요청 흐름 가시화 (0) | 2025.11.08 |
| Hystrix/Resilience4j로 장애 대응하기 — 마이크로서비스의 회복탄력성 설계 (0) | 2025.11.07 |
| Eureka로 서비스 디스커버리 구현하기 - 마이크로서비스의 핵심 인프라 구성 (0) | 2025.11.06 |
