진행 중인 프로젝트에서 Docker로 MySQL 컨테이너를 실행하면서 3306:3306 포트를 사용하도록 설정했습니다. 하지만 로컬 환경에서도 기존에 설치된 MySQL이 이미 3306 포트를 사용 중이었고, 이로 인해 intelliJ에서 적절한 DB를 찾지 못하며 생긴 문제입니다.
진행 중인 프로젝트에서 Docker로 MySQL 컨테이너를 실행하면서 3306:3306 포트를 사용하도록 설정했습니다. 하지만 로컬 환경에서도 기존에 설치된 MySQL이 이미 3306 포트를 사용 중이었고, 이로 인해 intelliJ에서 적절한 DB를 찾지 못하며 생긴 문제입니다.
→ 연결 문제를 해결할 수 있었지만, 로컬의 brew로 설치한 MySQL을 삭제해보았지만 여전히 3306으로 연결이 불가능한 상황입니다.
lsof -i :3306 # 3306 포트로 실행 중인 프로그램 목록 확인 명령어

→ 로컬의 mySQL과 Docker의 MySQL이 모두 3306 포트에서 다른 IP로 바인딩되어 실행 중이었습니다.
→ intelliJ는 Docker의 MySQL이 아닌 로컬 MySQL에 연결을 시도했기때문에 연결되지 않는 문제였죠!
brew services stop mysql # brew로 실행중이던 mySQL 종료

문제는 해결되었지만 두가지 의문이 있었습니다.
여기에 대해 제가 찾은 해답을 공유하겠습니다 :)
처음 문제가 발생했을때 MySQL Workbench로 3306 포트로 접속을 했더니 정상적으로 db에 접근이 되는 것을 보고 3306포트로 정상적으로 진행된다고 생각했습니다. 하나의 포트에 하나의 프로그램이 실행되어야한다고 알고 있었기 때문이죠.
하지만 실제로는 Docker로 띄운 MySQL 컨테이너도 같은 3306 포트를 사용 중이었습니다. 어떻게 이런 일이 가능했던걸까요?
로컬의 MySQL은 127.0.0.1:3306 으로, Docker의 MySQL은 0.0.0.0:3306으로 같은 포트번호라도 접속을 받는 IP 주소가 다르기 때문에 두 프로그램이 충돌없이 실행될 수 있었던거에요.
아래 문제 상황을 하나씩 뜯어볼게요!

mysqld 759 chan-il 21u IPv4 0x4f96304d9abbeaaa 0t0 TCP localhost:mysql (LISTEN)com.docke 995 chan-il 76u IPv6 0x1f638d94031049e5 0t0 TCP *:mysql (LISTEN)com.docke 995 chan-il 125u IPv6 0xf931d8ed9e81f23e 0t0 TCP localhost:mysql->localhost:50273 (ESTABLISHED)com.docke 995 chan-il 137u IPv6 0xd3dfd8e3011e0db1 0t0 TCP localhost:mysql->localhost:50274 (ESTABLISHED)MySQLWork 1717 chan-il 13u IPv6 0xfe91934859180074 0t0 TCP localhost:50273->localhost:mysql (ESTABLISHED)MySQLWork 1717 chan-il 15u IPv6 0xaa9e580b2d8ead66 0t0 TCP localhost:50274->localhost:mysql (ESTABLISHED)결국 MySQLWorkbench는 localhost:3306으로 요청을 보냈지만, 이 요청을 Docker 프록시가 가로채 컨테이너 내부의 MySQL과 연결이 된 상태였기때문에 Workbench에서는 Docker의 MySQL이, intelliJ에서는 로컬의 MySQL이 연결된 상태가 되었던거죠..
MySQL workbench로 3306 포트에 정상적으로 접속이 되고, 정상적으로 db를 생성했지만 연결되지 않는 문제를 보고 3306 포트에 다른 MySQL이 실행되고 있구나! 라는 의심을 했습니다.
제 로컬에는 brew로 설치된 MySQL이 있었기 때문에 terminal로 해당 프로그램을 삭제한다면 자동으로 종료될거라 생각하고 삭제만 하고 따로 확인하지 않았습니다. 이게 문제의 원흉이었죠!
그렇다면 왜 brew로 MySQL을 삭제했는데도 계속 실행되고 있었던 걸까요?
간단하게 이야기해보자면, macOS는 launchctl이라는 실행되는 프로그램을 시작/중지/등록/제거하는 서비스 관리 도구가 있습니다. 보통 brew에서 설치하는 프로그램들은 brew services start << program >> 라는 명령어로 진행하게 되는데요. 이때, launchctl을 통해 MySQL을 데몬으로 등록해 자동으로 실행하게 된다고합니다. 즉, 백그라운드에서 계속해서 실행되는 상태로 만드는거죠.
이렇게 MySQL이 데몬으로 실행되고 있었기때문에 의도한 DB로 접근이 되지 않았던거에요!
저는 brew uninstall mysql 을 통해 제거를 했지만 brew services stop mysql과는 별도의 작업이었던거죠..
앞으로는 데몬으로 실행 중인 프로그램이 있는지 brew services list 나 launchctl list 명령어를 통해 실행 상태를 꼭 확인하고,
필요하다면 brew services stop [프로그램명] 또는 launchctl remove [서비스명]으로 명시적으로 종료하는 습관을 들여야겟습니다
결국 내가 접속한 대상이 무엇인지 포트만 보고는 알 수없다는 것을 배웠습니다.
포트를 의심하기전에 IP 주소를 먼저 확인하는 습관을 들입시다!
Docker 알고 사용합니다!