이번 포스팅에서는 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 포트도 열리게 되었습니다.
'Error' 카테고리의 다른 글
Node.js "no such file or directory" (0) | 2024.07.08 |
---|---|
Spring data Elasticsearch 사용 중 발생한 ApplicationContext 초기화 예외 (0) | 2023.08.18 |
WslRegisterDistribution failed with error: 0x80370114 (0) | 2023.08.07 |