18.1 Spring Boot 애플리케이션의 Docker 컨테이너화
1. Dockerfile 작성 (Multi-stage Build)
멀티 스테이지 빌드를 이용하면 최종 이미지에 빌드 도구(Gradle, JDK)를 포함시키지 않고, 실행에 필요한 최소한의 JRE와 JAR 파일만 담아 이미지 크기를 대폭 줄일 수 있습니다.
# ─── 1단계: 빌드 스테이지 ───
FROM gradle:8.6-jdk21 AS builder
WORKDIR /app
COPY . .
RUN gradle bootJar --no-daemon # 실행 가능한 JAR 파일 생성
# ─── 2단계: 실행 스테이지 (최종 이미지) ───
FROM eclipse-temurin:21-jre-jammy
WORKDIR /app
# 보안: root가 아닌 별도 사용자로 실행
RUN addgroup --system spring && adduser --system --ingroup spring spring
USER spring:spring
COPY --from=builder /app/build/libs/*-SNAPSHOT.jar app.jar
# 시간대 설정 (한국 기준)
ENV TZ=Asia/Seoul
# 포트 노출
EXPOSE 8080
# 실행 (Graceful Shutdown 지원)
ENTRYPOINT ["java", "-jar", "app.jar"]
2. Docker Compose — 로컬 개발 환경 통합
# docker-compose.yml
services:
app:
build: .
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/tododb
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=secret
- SPRING_DATA_REDIS_HOST=redis
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: tododb
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
retries: 5
redis:
image: redis:7.0
ports:
- "6379:6379"
docker compose up --build 하나로 앱 서버, MySQL, Redis가 함께 구동되는 완전한 개발 환경이 구성됩니다.