본문 바로가기

마주쳤던 이슈 기록

#10. Docker - java.net.UnknownHostException: mysql

Docker로 자바 애플리케이션, MySQL의 이미지를 생성했고, 각 이미지를 실행시켜 컨테이너를 생성.
하지만 자바 애플리케이션의 컨테이너 실행 시, MySQL의 컨테이너를 찾지 못해 컨테이너의 실행 X.

[에러]

1. cj.exceptions.CJCommunicationsException: Communications link failure

2. java.net.UnknownHostException: mysql

[원인]

만약 두개의 컨테이너를 docker-compose.yml 파일로 관리하게 되면,
컨테이너끼리 같은 네트워크에 속하여 통신할 수 있지만,
지금 처럼 MySQL 컨테이너, 자바 애플리케이션 각 각 별도로 컨테이너를 관리하게 되면
컨테이너 간에 네트워크가 다르게 속하게 된다. 즉, 네트워크가 다르기 때문에 컨테이너 간에 통신이 불가.

[해결]

A. 도커 네트워크 생성.

$ docker network create {생성하고자하는_네트워크_이름}

B. 정상적으로 작동 중인 MySQL 컨테이너를 네트워크 할당

$ docker network connect {생성한_네트워크명} {연결하고자하는_컨테이너명}

C. 자바 애플리케이션 또한 네트워크 설정

$ docker network connect {생성한_네트워크명} {연결하고자하는_컨테이너명}

D. 네트워크 상태 확인

$ docker network inspect mynetwork

예상과는 달리, 네트워크에 자바 애플리케이션 컨테이너는 없고, mysql 컨테이너만 등록되어 있었다.

이유를 찾아보니 '자바 애플리케이션 컨테이너'의 경우 이미지를 컨테이너화 하고 나면
설정된 mysql에 연결이 안된다는 이슈로 인해 종료되어 네트워크 설정이 안됬음.

그래서 자바 애플리케이션은 이미지를 컨테이너화 할 때, 네트워크를 설정해주기로함. 

$ docker run --network={생성한_네트워크_이름} -d --name {생성하려는_컨테이너명} -d -p 8080:8080 {앱_이미지명}

 

[결론]

1. docker-compose.yml 을 이용해 여러 개의 컨테이너를 관리할 땐,
자동으로 같은 네트워크로 소속되어 컨테이너 간에 소통이 가능하다.
2. 각 개의 컨테이너를 관리할 땐, 네트워크를 꼭 같은 네트워크로 할당해주어야 한다.
3. 컨테이너가 실행 중일 땐, 네트워크 할당이 가능하지만, 실행되지 않은 상태면 네트워크 할당 불가.
4. 컨테이너를 생성할 때 네트워크를 할당할 수 있다.