728x90
문제 상황
로컬에서 mysql이 실행중이고, 동일한 포트(3306)을 사용하여 Docker의 mysql 컨테이너를 시작시켰다.
mysql 컨테이너와의 연결이 실패하며 에러가 발생했다.
에러 메세지
[28000][1045] Access denied for user '유저명'@'localhost' (using password: YES)
문제 분석
에러 메세지는 올바른 사용자 인증 정보를 주지 못한다고 나와있다. 하지만 컨테이너에 입력한 유저와 비밀번호 모두 정상적으로 입력했다.
연결에서 문제가 발생한 것으로 유추해볼 수 있다.
문제 원인
- 포트 충돌 : 로컬 Mysql 서버와 컨테이너 내의 Mysql 서버가 동일한 포트(3306)를 사용하려고 해서 발생한다.
- 한 포트는 하나의 서비스만 사용할 수 있다.
- 당연하게도 포트 충돌이 발생할 경우 먼저 시작된 서비스가 해당 포트를 차지하고, 나중에 시도하는 서비스는 포트 충돌로 인해 실행되지 않는다.
- Docker의 포트 관리 : 도커는 로컬과의 포트 충돌을 명시적으로 표시하지 않는다.
해결 방법
1. 로컬 mysql 서버 종료
mac 기준 명령어
brew services stop mysql
2. 포트 변경을 통한 충돌 회피
컨테이너 실행시 컨테이너 내의 Mysql 서버가 사용할 포트를 변경한다.
docker run -p 3307:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD=password -d mysql:tag
컨테이너 내의 3306 포트를 host의 3307 포트에 바인딩 한다. (순서 주의)
ETC
문제를 해결하면서 추가적으로 왜 포트 매핑을 해야하는지, 도커 컨테이너의 주소는 왜 localhost가 아닌지 정리해보았다.
참고하면 도커 서비스에 대한 이해를 높이는데 도움이 될 것이다.
https://shout-to-my-mae.tistory.com/402
728x90
'문제&해결' 카테고리의 다른 글
@Value가 단위 테스트에서 동작하지 않는 문제 (생성자 주입, @WebMvcTest) (0) | 2024.03.11 |
---|---|
도커 컨테이너의 ip 주소는 왜 127.0.0.1(localhost)가 아닐까? (0) | 2024.03.09 |
웹소켓 취약점 해결 : 인증 도입 (STOMP, Jwt, Spring Security) (3) | 2024.02.20 |
도커 volume 설정 + 환경 변수를 사용하여 H2 DB Url을 동적으로 설정하기 (로컬 / Docker 환경) (0) | 2024.01.30 |
[스프링 시큐리티] Spring Security의 Filter에서 의존성 전달받기 (빈 주입) (0) | 2024.01.24 |