com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
ubuntu-java-api-server-1 |
ubuntu-java-api-server-1 | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
위의 메세지 같은 오류가 발생했다. jdbc가 mysql 컨테이너와의 연결을 실패하다니.. 이유가 뭘까??
나의 application.yml에는 jdbc 연결 host 설정이 localhost:3306이였다. 이것은 docker container와 network에 대해서 정확히 인지하지 못했기 때문에 발생한 문제이다.
Docker-compose를 활용해 3개의 컨테이너를 지정하고 실행하면 다음과 같다.
나의 java-application 컨테이너는 application.yml을 바인드 마운트 중이다. 이 때 localhost는 java-application의 localhost이지 호스트 머신의 localhost가 아니다. 그렇기 때문에 Mysql 컨테이너에 접근하려면 해당 IP를 알아야한다.
Docker에서 컨테이너 IP를 알 수 있지만 알기 쉽지 않다. 이런 상황에 대비해서 Docker는 Docker-network를 제공하는데 Docker-network로 묶인 컨테이너들은 해당 IP를 컨테이너 명을 통해 접근할 수 있다.
mysql의 컨테이너명은 mysql이였는데 jdbc 호스트 설정을 mysql로 주니 문제가 해결되었다.