Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
열심히 구글링을 하면서 문제를 해결해보려고 했지만 docker를 처음 다루어보는 나에게는 높은 산이었다. 다행히 docker를 다루어본 적이 있으신 능력자분들의 도움을 받아 해결!
1. port 충돌로 오류가 발생할 수 있으니 8083으로 port 옮기기
2. 방화벽에 의해서 접근이 차단될 수도 있으니 방화벽 열기
3. application.yml 파일에서 server address를 0.0.0.0으로 설정하기
4. docker의 명령어에 autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC를 붙이기
5. url의 localhost:3306을 127.0.0.1:3306로 변경하기
4,5번을 통해서 입력했던 명령어는 아래와 같다.
docker run -p 8080:8081 hello1 \
-e SPRING_DATASOURCE_URL=jdbc:mysql://127.0.0.1:3306/{db이름}?autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&validationQuery="select 1" \
-e SPRING_DATASOURCE_PASSWORD={비밀번호} \
hello1
6. my.ini 파일에서 bind-address 변경
: Windows라 C:\ProgramData\MySQL\MySQL Server 8.0에 my라는 파일이 존재했는데 그 파일에는 bind-address라는 변수가 없었다.
7. 192.168.0.1에서 포트포워드 설정 변경
: 주소창에 192.168.0.1를 입력하여 관리자모드로 진입한 후 관리도구를 클릭한다
그 후 고급설정 -> 포트포워드 설정 -> 외부포트와 내부포트에 3306을 입력한 후 규칙 추가를 해준다.
8. url에 127.0.0.1:3306이 아니라 공유기 ip:3306을 입력해준다.
: 이 때 autoReconnect=true, useSSL=false, allowPublicKeyRetrieval=true, serverTimezone=UTC를 명령어에 붙였더니 동일한 오류가 계속 발생해서 해당 부분을 제거하고 입력했다. port도 8083으로 설정했던 것을 8080으로 변경하였다.
sudo docker run -p 8080:8080 -e SPRING_DATASOURCE_URL=jdbc:mysql://{외부_ip}:3306/{db이름} -e SPRING_DATASOURCE_PASSWORD={password} hello1
해결!
이것저것 많이 시도해보느라 정확히 어떤 부분이 문제가 되었는지는 잘 모르겠다. 방화벽일수도, 외부 ip를 이용해서 일수도, 어쩌면 docker 명령어에 익숙하지 않아서 명령어를 잘못 입력해서 발생했을 수도 있을 것 같다. 일례로 환경변수가 제대로 들어가려면 image를 명령어의 마지막에 넣어야한다고 말씀해주셨는데 그렇게 했을 때
docker run requires at least 1 argument.
라는 에러메시지가 떴기 때문이다.
아무튼 해결을 해서 날아갈 것 같았지만 로그를 써보는 지금은 아직은 무언가 찜찜한 느낌이 든다.
+) 11.10 추가
aws에서 docker를 띄우고 컨테이너를 이미지를 실행했더니 동일한 에러가 발생했다. 이 때 docker 명령어를
docker run -p 8080:8080 -e SPRING_DATASOURCE_URL=jdbc:mysql://<내 외부 아이피>:3306/likelion-db -e SPRING_DATASOURCE_PASSWORD=<비밀번호> -e SPRING_DATASOURCE_USER=<user 이름> <이미지 이름>
로 입력해줬더니 문제가 해결했다. DB를 local에 만들었을 때, aws와 같은 클라우드 서버에서 DB에 접근하도록 할 때 아이피를 통해 접근할 수 있도록 하는 것이 필요한가 싶은 생각이 든다.