Docker Container에서 Local의 DB 접근하는 방법
스프링부트 서버는 Container로 띄우고
DB는 로컬을 사용하길 원하는 상황이다.
DB는 localhost만 접속이 가능한 상황인데
Docker 컨테이너에서 localhost는 로컬이 아닌 컨테이너 자신의 ip이다.
쉽게말해 컨테이너에서 localhost는 컨테이너이기 때문에 내 로컬에 접근하지 않는것이다.
그래서 Dokcer 컨테이너에서 local의 DB에 접근을 못하는 상황이다
application.properties를 다음과 같이 수정한다.
spring.datasource.url=jdbc:mysql://host.docker.internal:3306/spot
-> 원래는 mysql://localhost:3306 이지만
host.docker.internal로 컨테이너 내부에서 호스트 머신의 네트워크에 접근할 수 있다.
스프링 부트 애플리케이션을 도커 컨테이너로 실행할 때 로컬 머신의 MySQL 데이터베이스에 접근해야 하는 경우, host.docker.internal을 사용할 수 있다.
이제 MySQL를 외부에서 접근할 수 있도록 추가적인 설정을 해줘야한다.
mysql --verbose --help | grep my.cnf
위의 명령어로 my.cnf의 경로를 찾아 열자.
127.0.0.1은 로컬에서만 접근이 가능하다는것인데 이것을 0.0.0.0으로 모든 ip에서 접근이 가능하도록 해주자.
root USER는 현재 localhost로 로컬에서만 접근이 가능하다.
이것을 다음 명령어로 모든 ip에서 사용 가능하도록 변경해야한다.
UPDATE mysql.user SET Host='%' WHERE User='root';
이제 도커 컨테이너를 돌리고
GET요청을 보내보면
로컬 DB가 스프링부트와 연결되어 잘 응답한다!
위의 과정은 맥에서 잘 동작했지만
리눅스에서는 컨테이너 동작시
docker run --add-host host.docker.internal:host-gateway -p 8080:8080 user/test:1.0.0 처럼
--add 옵션을 추가적으로 주어야 host.docker.internal가 잘 적용된다.