Sangil's blog

https://github.com/ChoiSangIl Admin

Docker 재미있는 논쟁(Docker Eureka Client detect exposed ports) DEV / DOCKER

2022-05-07 posted by sang12


https://github.com/moby/moby/issues/3778

도커에서는 왜? 내부 컨테이너에서 외부로 동적으로 열린 포트정보를 가져올 수 없나에 대한 논쟁이다.

MSA를 공부하던중, Eureka Client를 아래와 같이 동적 포트로 여러개 올려 Eureka에 client를 등록하고 싶었다.

하지만, 올라간 Client입장에서 등록할 수 있는 ip는 내부 스프링어플리케이션 설정에 따른 server.port=8080 이였다.

결과적으로 여러개를 등록하면 동일한 포트로 유레카에 동일하게 등록이 된다.

허면 어플리케이션 입장에서는 어떻게 도커가 외부적으로 랜덤으로 만든 포트를 알아내서 해당 포트로 유레카에 등록 할 수 있을까?

결과적으로 해당 이슈 게시물을 보면 도커에서 공식적으로 지원해주는 방법은 없는 거 같다.

해결 할 수 있는 가장 간단한 방법으로는 아래와 같이 명시한 포트를 환경변수로 넘겨줘서, Spring Boot에서 해당 Port를 받아 유레카에 등록하는 것이다.

docker run -P 40015:8080 -e PORT=40015 myImage

하지만 이렇게 하면 컨테이너를 올릴때마다 포트를 지정해주는 작업등을 해야 할것이다...

그럼 더 좋은 방법은 무엇일까

스크립트로 사용가능한 포트를 찾고 해당 포트를 넘겨주는 방법이다. (https://github.com/moby/moby/issues/3778) 해당 게시물 중간에 보면 

NullHypothesis 이란 분이 올려놓은 스크립트를 참고하면 될거같다. 그리고 참고로 AWS에서는 스프링 어플리케이션단에서 외부에서 열려있는 정보를 가져올 수 있는거 같다.

아.. 또 1가지 방법으로는 도커 컨테이너가 올라가면 해당 ip, port정보를 공유 Volume에 저장해두고, 해당 어플리케이션에서 Volume의 정보를 가져와서 유레카에 등록하는 방법도 있다.!

어쨋거나.. 깔끔한 방법은 없는거 같다.

일단 공부하는 거니... docker-compose로 포트를 여러개 지정해서 올리는 방법으로 해야겠다..^^

#Eureka Client Docker external port
REPLY