Dev_Log

[Docker] com.mysql.cj.jdbc.exceptions.CommunicationsException

LeeDaniel 2024. 12. 20. 13:03
 [ Error ] 
Docker 컨테이너를 2개를 구성하는 과정에서 발생된 Error로
A컨테이너에는 스프링부트 프로젝트를 jar로 구동
B컨테이너에는 mysql을 구동해서
A컨테이너의 스프링프로젝트가 B컨테이너의 mysql과 연결되도록 하는 과정에서

B컨테이너의 mysql은 먼저 구동시킨뒤
A컨테이너는 DockerFile을 통해 빌드시 마지막에
CMD명령어를 통해 java -jar로 프로젝트를 실행하도록 했는데
아래 에러가 발생하고

mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

CMD명령어로 java -jar를 하는게 아니라
A컨테이너 구동후에 커맨드에서 java -jar명령어로 프로젝트 구동시에는
위 에러가 발생하지 않는현상인데
CMD명령어에서 java -jar로 실행했을때 에러가 나지않게 하고싶음

프로젝트 구동시
DocketFile을 CMD명령어를 통해 java -jar로 하는것과
DockerFile의 CMD명령어가 아닌
컨테이너에 접속해 커맨드에서 java -jar로 실행되는것의 차이점 확인 필요
 

 [ Solution ]
A컨테이너(스프링부트프로젝트)와
B컨테이너(MySQL DB)의 네트워크 구성에 문제가 있어서

Communications link failure이 발생했던것인데

Docker 컨테이너의 네트워크 구성은 따로 설명은 안한다
궁금하면 구글링해서 찾아보고

해결방법은
1. 서버에서 아래명령어를 통해 my-network라는 이름의 네트워크를 생성하고

docker network create my-network

 
2.  아래 명령어로 B컨테이너를 my-network를 사용하도록 설정해준다

docker network connect my-network <mysql-container-name>


3. A컨테이너의 DockerFile의 내용에서 CMD명령어로 java -jar를 실행하기전에
    A컨테이너가 B컨테이너와 동일한 my-network를 사용하도록 작성해주면 됨

# 필수 도구 설치
RUN apt-get update && apt-get install -y docker.io bash

# 네트워크 연결 스크립트 생성
RUN echo '#!/bin/bash\n\
docker network connect my-network $1' > /network-connect.sh && chmod +x /network-connect.sh

# 스크립트 실행을 기본 명령으로 설정
CMD ["/network-connect.sh", "SpringBoot-container-name"]



 

728x90
반응형