본문 바로가기
Error

Spring boot(호스트 PC) 와 MySQL (docker container) 연동 실패

by Ahngyuho 2024. 7. 11.

이번 포스팅에서는 Spring boot 와 MySQL (docker container) 연동 실패 에 관해서 다뤄보려고 합니다.

 

 

 

문제점

Spring Boot 애플리케이션(호스트 PC) 과 MySQL(docker container)를 연동하려고 하는데 애플리케이션 쪽에서 MySQL 서버를 찾지 못하는 문제가 계속 발생하였습니다. 

이 부분이  상당히 의심이 갔습니다.

원래 이렇게 생겼었나? 하는 단순한 생각에서 출발해서 해결책에 도달하게 됐습니다...

 

해결책

해결책은 docker 컨테이너 생성 시 -p 옵션을 이용해서 호스트 포트와 컨테이너 포트를 직접 지정해 주는 것입니다.

docker는 포트 지정을  해주지 않으면  컨테이너의 포트만 활성화 되고, 외부인 호스트 PC와의 연결은 차단됩니다.

 

저같은 경우는 MySQL만 docker로 띄우고 Spring boot는 제 호스트 PC에서 띄워둔 상태였습니다. 그렇기 때문에 저의 Spring boot 애플리케이션은 3306 포트로 접근하려 했지만 docker 컨테이너는 이를 차단한 상태이기 때문에 접근할 수가 없는 것입니다.

 

그래서 해결책은  spring boot 와 MySQL 서버를 같은 컨테이너 내부에서 띄우거나 아래와 같은 명령어로 포트를 직접 지정해줘야 합니다.

docker run --name mysql -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql:latest

 

    3306      :     3306

Host(외부) : Container(내부)

 

 

0.0.0.0 은 모든 외부에 대한 접근을 허용함을 의미합니다.

 

실행은 잘 되나 33060 의 정체가 궁금했습니다.

 

X porotocol 과 33060 포트

MySQL 8.0 버전부터 JSON 문서 저장소 및 NoSQL 스타일의 CRUD를 지원하게 되었고, 이때 사용되는 프로토콜인 X protocol도 같이 등장하게 되었습니다. 이 X protocol이 33060 포트에서 실행되기 때문에 8.0 버전 이상의 MySQL을 설치하게 되면 3306, 33060 이 두개의 포트를 발견할 수 있습니다.

 

docker run --name mysql -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 -p 33060:33060 mysql:latest

 

정리

docker는 포트를 지정해주지 않으면 외부와의 연결은 차단되기 때문에 외부와 연결해야 한다면 포트를 지정해 줘야합니다.

그리고 MySQL 8.0 부터 새로운 기능의 추가를 통해 3306뿐 아니라 33060 포트도 열리게 되었습니다.