crud2 — Spring Boot Docker 이미지 만들기
crud2 프로젝트는 루트의 Dockerfile 한 개로 이미지를 만든다. 로컬에 JDK·Gradle을 설치하지 않아도 되도록, 이미지 안에서 Gradle로 bootJar를 실행하는 멀티 스테이지 빌드다.
구성 요약
| 항목 | 내용 |
|---|---|
| Spring Boot | 3.3.x |
| Java | 17 (Eclipse Temurin) |
| 빌드 스테이지 | eclipse-temurin:17-jdk-alpine — 소스 복사 후 ./gradlew bootJar |
| 실행 스테이지 | eclipse-temurin:17-jre-alpine — app.jar만 포함 (이미지 크기 축소) |
| 포트 | 8080 |
Dockerfile이 하는 일
빌드 스테이지
gradlew,build.gradle,src등을 복사한다../gradlew bootJar --no-daemon -x test로 실행 가능한 fat JAR를 만든다.- Spring Boot Gradle 플러그인은
*-plain.jar와 실행용 JAR를 둘 다 만든다. 실행용만 쓰기 위해plain이 아닌 JAR 하나를 골라app.jar로 복사한다.
실행 스테이지
- 빌드 스테이지에서 만든
app.jar만 복사한다. - 기본 엔트리포인트:
java $JAVA_OPTS -jar app.jar(JAVA_OPTS는 비어 있어도 됨).
- 빌드 스테이지에서 만든
프로젝트의 실제 내용은 저장소 루트 Dockerfile을 보면 된다.
사전 준비
- Docker Desktop(Windows/Mac) 또는 Docker Engine + BuildKit 사용 가능 환경
- 소스는
crud2디렉터리 기준으로 두고, 아래 명령도crud2루트에서 실행한다.
이미지 빌드
cd crud2
docker build -t crud2:latest .
- 태그
crud2:latest는 예시이며, Docker Hub에 올릴 때는사용자명/crud2:latest형태로 태그를 추가하면 된다. - 로컬에서
./gradlew bootJar를 먼저 돌릴 필요는 없다. (Dockerfile이 컨테이너 안에서 빌드한다.)
JVM 옵션 (선택)
이미지는 JAVA_OPTS 환경 변수를 JVM 앞에 붙인다. 메모리 제한 예:
docker run -e JAVA_OPTS="-Xms128m -Xmx256m" -p 8080:8080 crud2:latest
실행 방법
1) docker-compose (권장 — 로컬 H2 + 볼륨)
docker-compose.yml은 이미지를 빌드하고 SPRING_PROFILES_ACTIVE=docker로 띄운다.application-docker.properties에서 H2 파일 DB 경로를 /data/crud2-db로 두고, named volume으로 데이터를 유지한다.
cd crud2
docker compose up -d --build
- 브라우저:
http://localhost:8080/list - 중지:
docker compose down(볼륨은 유지하려면 기본 설정 그대로 두면 됨)
2) docker run (프로파일만 지정)
docker 프로파일로 H2 파일 DB를 쓰려면 /data를 쓰기 가능하게 두는 것이 안전하다.
docker run -d --name crud2-app -p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=docker \
crud2:latest
데이터를 호스트에 남기려면 -v 호스트경로:/data 를 추가한다.
3) RDS(MySQL) — 운영·EC2용
DB는 MySQL(RDS)이고 Spring은 prod 프로파일일 때 application-prod.properties의 환경 변수를 쓰도록 맞춰 두었다면, 예시는 다음과 같다. (값은 본인 RDS 정보로 바꾼다.)
docker run -d --name crud2-app -p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=prod \
-e SPRING_DATASOURCE_URL="jdbc:mysql://RDS엔드포인트:3306/crud2?characterEncoding=UTF-8&serverTimezone=Asia/Seoul" \
-e SPRING_DATASOURCE_USERNAME=admin \
-e SPRING_DATASOURCE_PASSWORD='비밀번호' \
crud2:latest
EC2에서 80번으로 노출하는 등의 흐름은 docs/spring-boot-docker-aws-guide.md를 참고한다.
의존성과 프로파일 정리
build.gradle:h2,mysql-connector-j모두 runtime으로 들어 있다. Docker 이미지에는 둘 다 포함되므로, 프로파일·설정으로 H2 vs MySQL을 고른다.- 기본
application.properties: 로컬 IDE용 H2(인메모리/홈 경로 등). application-docker.properties:docker프로파일 — 컨테이너 내/dataH2 파일 DB.application-prod.properties: 운영/RDS — 보통 환경 변수로 URL·계정을 넘긴다.
자주 겪는 이슈
| 증상 | 원인·조치 |
|---|---|
Cannot load driver class: org.h2.Driver (또는 MySQL) |
build.gradle에 해당 runtime 의존성이 있는지 확인 후 이미지 재빌드 (docker build --no-cache). |
plain JAR만 실행됨 |
이 프로젝트 Dockerfile은 grep -v plain으로 실행용 JAR만 고른다. 커스텀 Dockerfile을 쓸 때는 동일하게 처리할 것. |
| 포트 충돌 | 이미 8080을 쓰는 프로세스가 있으면 -p 8081:8080 등으로 바꾼다. |
관련 파일
| 파일 | 역할 |
|---|---|
Dockerfile |
멀티 스테이지 빌드 + JRE 실행 이미지 |
docker-compose.yml |
로컬에서 docker 프로파일 + H2 볼륨 |
build.gradle |
Java 17, Spring Boot, H2·MySQL 런타임 |
src/main/resources/application-docker.properties |
Docker 전용 H2 경로 |
AWS 전체 배포 흐름은 docs/spring-boot-docker-aws-guide.md, 상세 트러블슈팅은 docs/deployment-full-journey.md를 보면 된다.
'BackEnd > Spring Boot' 카테고리의 다른 글
| Spring Boot로 ChatGPT(OpenAI) API 연동하기 (1편: 환경 설정) (0) | 2026.04.30 |
|---|---|
| crud2 — Docker + MySQL + AWS 배포 가이드 (1) | 2026.04.17 |
| # 도커 한방 정리 (0) | 2026.04.14 |
| crud2 thymeleaf 를 crud1 mustache 로 변경 (0) | 2026.04.13 |
| 7. 스프링부트로 게시판 만들어 보기 - crud2 Thymeleaf 템플릿 (0) | 2026.04.12 |