why-not-connecting-mysql-to-spring-boot
✅ 컨테이너로 실행시킨 Spring Boot가 MySQL에 연결이 안 되는 이유 각각의 컨테이너는 자신만의 네트워크망과 IP 주소 를 가지고 있다. 호스트 컴퓨터 입장에서 localhost는 호스트 컴퓨터를 가리키지만, Spring Boot 컨테이너 입장에서 localhost는 Spring Boot 컨테이너를 가리킨다.
그런데 Spring Boot의 코드를 작성할 때 DB 정보를 아래와 같이 입력했었다. Spring Boot가 실행되는 환경인 컨테이너 입장에서
localhost:3306 라는 주소는, Spring Boot 컨테이너 내부에 있는 3306번 포트와 연결을 시도하게 된다. 하지만 Spirng Boot가 실행되는 컨테이너 내부의 3306번 포트에는 아무것도 실행되고 있지 않다. 이러한 구조상의 문제 때문에 Spring Boot가 MySQL에 연결이 안 되고 있었던 것이다.
application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: pwd1234
driver-class-name: com.mysql.cj.jdbc.Driver
그럼 어떻게 Spring Boot의 컨테이너에서 다른 컨테이너에 존재하는 MySQL에 연결을 할 수 있을까?
compose.yml에서 정의한 Service 이름으로 서로 통신할 수 있다. 바로 예시로 알아보자.
✅ Spring Boot의 DB 정보를 아래와 같이 수정한 뒤 시도해보기 application.yml
spring:
datasource:
url: jdbc:mysql://my-db:3306/mydb
username: root
password: pwd1234
driver-class-name: com.mysql.cj.jdbc.Driver위 코드에서 my-db 는 도대체 어디서 나온 값일까?
우리가 이전에 작성했던 compose.yml을 보면 각 컨테이너에 service 이름(my-server, my-db)을 작성했었다.
compose.yml
services:
my-server:
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" ]
interval: 5s
retries: 10이 service 이름 이 컨테이너의 주소 를 뜻한다. 해당 컨테이너의 IP 주소와 같은 역할을 한다.
위와 같이 코드를 수정한 뒤에 다시 한 번 컨테이너를 실행시켜보자.
$ ./gradlew clean build
$ docker compose down
$ docker compose up --build -d
$ docker ps # 정상적으로 Spring Boot, MySQL이 실행된 걸 확인할 수 있다.