
Docker에서 redis, H2를 띄우고 intellij에서 Spring을 올린 상태로 개발을 완료했습니다.
이후, Spring도 컨테이너로 서버를 올리니 에러가 발생했다.
org.hibernate.exception.GenericJDBCException:
unable to obtain isolated JDBC connection [Connection is broken: "java.net.ConnectException: Connection refused: localhost
intellij에서 H2, redis 연결을 localhost로 잡아놨는데 Docker에 올리니 localhost를 잡지 못하는 듯 하다.
Docker Container는 아래 사진 처럼 컨테이너 별 별도의 구성을 갖게되고 각각의 구분된 공간으로 동작하게된다.

그렇다보니 이전 intellij에서 동작한 localhost는 OS 단위의 구성으로 하위 Docker가 포함이더라도 컨테이너에서 동작하는 localhost는 별도로 구성된 자기자신으로 당연히 H2와 redis를 찾을 수 없다.
docker inspect <컨테이너 명> | grep "IPAddress"
위 명령어를 통해 특정 컨테이너가 가지고 있는 IP를 확인할 수 있다.

h2, redis ip를 조회하고 수정합니다.
## h2
url: jdbc:h2:tcp://172.17.0.2:1521/redis_db
## redis
new LettuceConnectionFactory("172.17.0.3", 6379);
이후 수정된 jar파일로 다시 이미지 -> 컨테이너를 빌드하면 문제없이 기동되는 것을 확인할 수 있습니다.
Docker Container에서 서버를 올리는 순서에 따라 IP가 동적으로 적용됩니다.
예를 들어, H2를 올리고 redis를 올리는 경우 H2(172.17.0.2), redis(172.17.0.3) 로 ip를 할당 받습니다.
반대로 redis를 올리고 H2를 올리면 H2(172.17.0.3), redis(172.17.0.2) 로 ip를 할당 받습니다.
매번 서버 올리는 순서를 정하고 기동할 순 없으니, container를 고정 IP로 설정해보자
고정 IP를 할당받기 위해서는 네트워크를 만들어야합니다.
docker network create --subnet=172.17.0.0/24 fixed_network
만들어진 네트워크를 통해 run 시 --net, --ip 옵션을 통해 지정해주면 됩니다.
docker run --net fixed_network --ip 172.17.0.10