본문 바로가기
코딩/Docker

🐳 Docker Compose로 Spring Boot, Mysql 컨테이너 동시에 실행하기

by Leedius 2025. 7. 15.

✅ 1. 폴더 및 프로젝트 준비

mkdir springboot-mysql-demo
cd springboot-mysql-demo
# (아래는 start.spring.io에서 압충 해제 후 옮긴 경우)
  • Tip:
    • Spring Boot 프로젝트는 start.spring.io에서 생성
    • Java 17, DevTools, Web, JPA, MySQL Driver 선택
    • src/main/java/... 아래 코드 작성

 


2. 간단한 컨트롤러 작성

📄 src/main/java/.../AppController.java

@RestController
public class AppController {
	@GetMapping("/")
    public String home() {
    	return "Hello, World";
    }
}

 


 3. DB 연결 정보 (application.yml)

📄 src/main/resources/application.yml

(# 네트워크 이슈 먼저 경험하고 수정하도록 아래 두가지 모두 기재!)

 

1) 잘못된 예시 (초기 실수!)

srping:
	datasource:
    	url: jdbc:mysql://localhost:3306/mydb
        username: root
        password: pwd1234
        driver-class-name: com.mysql.cj.jdbc.Driver
  • 설명:
    • localhost:3306은 "Spring Boot 컨테이너 내부의 3306포트"를 의미해서, 실제 MySQL 컨테이너에 접근할 수 없음.

 


 4. Dockerfile 작성

📄 Dockerfile

FROM openjdk:17-jdk

COPY build/libs/*SNAPSHOT.jar /app.jar

ENTRYPOINT ["java", "-jar", "/app.jar"]

 


 5. compose.yml 작성

📄 compose.yml

services:
	app:
    	build: .
        ports:
        	- 8080:8080
        depends_on:
        	my-db:
            	condition: service_healthy
       
    my-db:
    	image: mysql
        environment:
        	MYSQL_ROOT_PASSWORD: pwd1234
            MYSQL_DATABASE: mydb
        volumes:
        	- ./mysql/_data:/var/lib/mysql
        ports:
        	- 3306:3306
        healthcheck:
        	test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
            interval: 5s
            retries: 10
  • 설명:
    • 서비스명: app (Spring Boot), my-db (MySQL)
    • depends_on/healthcheck: DB가 살아있는지 확인 후 app 컨테이너 시작

 


6. Spring Boot 빌드

gradlew clean build
  • 설명:
    • build/libs/*.jar 가 생기면 성공 

 


7. 컨테이너 실행

docker compose up -d --build
  • Tip:
    • 두 컨테이너가 동시에 백그라운드로 실행됨

 


 8. 상태 확인

docker compose ps
docker logs [Spring Boot 컨테이너 ID]
  • 설명:
    • Spring Boot가 MySQL 연결에 실패할 수 있음
    • logs에서 DB 연결 오류 확인

 


문제 발생!

  • Spring Boot 컨테이너에서 "localhost:3306"으로  MySQL에 접근하려 하면, 실제로는 Spring Boot 컨테이너 자신의 3306  포트만 바라보기 때문에 연결 실패.

 


9. 네트워크 해결법: Service 이름으로 접근!

📄 application.yml

srping:
	datasource:
    	url: jdbc:mysql://my-db:3306/mydb
        username: root
        password: pwd1234
        driver-class-name: com.mysql.cj.jdbc.Driver
  • 설명:
    • my-db 는 compose.yml의 서비스명!
    • Docker Compose 네트워크에서는 서비스며응로 바로 접근 가능!

 


10. 수정 후 다시 실행

# 
gradlew clean build

# 실행중인 컨테이너, compose 삭제
docker compose down

# 도커 컴포즈 빌드
docker compose up -d --build

# 실행 확인
docker ps
  • 설명:
    • 두 컨테이너 모두 Up, 브라우저에서 http://localhost:8080 확인

 


🔍 핵심 포인트

항목 설명
서비스명 접근 jdbc:mysql://my-db:3306/mydb (compose 서비스명)
healthcheck MySQL 컨테이너가 준비되면 app이 실행되도록
volumes MySQL 데이터 영구 저장
depends_on DB 먼저, 그 다음 Spring Boot

 


✅ 구조 흐름도

[Spring Boot 컨테이너(app)]  ←──(네트워크)──→ [MySQL 컨테이너(my-db)]
            │
            └─▶ localhost:8080 (브라우저 접근)

 


🧠 실전 팁

  • docker compose down 하면 데이터는 그대로 (mysql_data 폴더에 저장)
  • DB 접속 확인은 Workbench, DBeaver 등으로 host: localhost, port: 3306, user: root, pw: pwd1234 로 바로 가능
  • application.yml은 곡 서비스명 기준으로 DB 주소 작성

댓글