SpringBoot와 Mysql 동시에 컨테이너 띄우기

WAS·2025년 5월 20일
0

도커

목록 보기
6/6

💡 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

이런식으로 바꾸면 잘 동작할것이다

profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글