💡 application.yml 파일에 DB정보를 적어야함
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: pwd1234
driver-class-name: com.mysql.cj.jdbc.Driver
💡 Java / Spring Boot 프로젝트는 먼저 빌드해야함 -> jar
파일 생성
-> ./gradlew clean build
입력
💡 SpringBoot는 실행할 때, DB에 대한 정보가 없으면 오류가 난다
그래서 먼저 DB가 연결이 되어있어야 한다 -> depends_on
사용
# compose.yml
services:
my-server:
build: .
ports:
- 8080:8080
# my-db의 컨테이너가 생성되고 healthy 하다고 판단 될 때, 해당 컨테이너를 생성한다.
depends_on: # my-db 라고 서비스이름을 지은 컨테이너를 의존
my-db:
condition: service_healthy # my-db 컨테이너가 정상정으로 실행되면 Springboot
컨테이너 실행
my-db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: pwd1234
MYSQL_DATABASE: mydb # MySQL 최초 실행 시 mydb라는 데이터베이스를 생성해준다.
volumes:
- ./mysql_data:/var/lib/mysql
ports:
- 3306:3306
healthcheck:
test: [ "CMD", "mysqladmin", "ping" ] # MySQL이 healthy 한 지 판단할 수 있는 명령어
interval: 5s # 5초 간격으로 체크
retries: 10 # 10번까지 재시도
이런식으로 compose.yml
에 여러 서비스를 적고 docker compose up -d --build
를 입력해서 실행한다
하지만 DB 컨테이너는 생성이 되어있고, Springboot 컨테이너는 생성이되지 않는 것을 볼 수 있다
로그로 확인하면 Springboot가 DB와 연결이 되어있지 않단는 오류를 발견할 수 있다
이유가 무엇일까?
그 이유는 각각의 컨테이너는 자신만의 네트워크망과 IP주소를 가지고 있기 때문이다
맨처음 application.yml 에 적힌 url을 보면 localhost:3306 이라고 적혀 있을 것이다
호스트
컴퓨터 입장에서는 localhost 가 맞지만
Sprintboot 컨테이너 입장에서의 localhost는 컨테이너 내부에 있는 3306번 포트와 연결을 시도하는 것이다
그래서 안되는것이다
💡 그럼 어떻게 해결?
application.yml 안의 localhost를 내가 만든 DB컨테이너의 Serivce 명으로 바꾸자
컨테이너 Service 이름
= 컨테이너 주소 = 컨테이너의 ip 주소
spring:
datasource:
url: jdbc:mysql://my-db:3306/mydb
username: root
password: pwd1234
driver-class-name: com.mysql.cj.jdbc.Driver
이런식으로 바꾸면 잘 동작할것이다