도커 컨테이너의 외부 포트가 임의로 있음에도 불구하고 유레카 사용
저는 몇 가지 스프링 부트 기반 마이크로 서비스로 구성된 애플리케이션을 작성하고 있습니다. 앞에 zuul 기반 역방향 프록시가 있습니다.
컴퓨터에서 서비스를 시작할 때 작동하지만 서버 롤아웃의 경우 서비스에 도커를 사용하고 싶지만 지금은 불가능할 것 같습니다.
일반적으로 컨테이너 외부에는 고정된 "내부" 포트와 무작위 포트가 있습니다.그러나 컨테이너에 있는 앱은 외부 포트(및 IP)를 알지 못합니다.
넷플릭스 도구는 효율적인 마이크로서비스 아키텍처를 만들고 싶은 것과 일치하며 개념적으로 도커를 정말 좋아합니다.제가 보기에 컨테이너를 시작하고 호스트의 외부 포트를 모아서 앱에 전달하는 것은 매우 번거로울 것입니다. 앱이 시작된 후에는 단순히 포트를 변경할 수 없기 때문입니다.
도커 기반 클라이언트에서 유레카를 사용할 수 있는 방법이 있습니까?
[업데이트] 제가 문제 설명을 잘못했나 봐요.그래서 아마 이것이 좀 더 명확하게 설명해 줄 것입니다.
eureka 서버 자체는 도커에서 실행할 수 있습니다. 왜냐하면 저는 하나만 가지고 있고 외부 포트는 문제가 되지 않기 때문입니다.링크 기능을 사용하여 클라이언트에서 액세스할 수 있습니다.
문제는 고객이 직접 등록하는 URL입니다.예를 들어 https://localhost:8080/이지만 동적 포트 할당으로 인해 실제로는 https://localhost:54321/을 통해서만 액세스할 수 있습니다.
Soureka는 서비스에 대한 잘못된 URL을 반환할 것입니다.
업데이트 아래 답변을 업데이트했으니 확인해 보세요.
제가 직접 해결책을 찾았는데, 그게 최선의 해결책은 아닐 수도 있지만, 제게 맞는 해결책입니다.
"--net=host"(호스트 네트워킹)로 도커를 시작하면 호스트 네트워크 스택을 직접 사용합니다.그런 다음 0을 스프링 부팅용 포트로 사용하고 스프링은 포트를 랜덤화하며 호스트 네트워킹 스택을 사용하기 때문에 다른 포트(및 IP)로 변환할 수 없습니다.
하지만 몇 가지 단점이 있습니다.
- 호스트 네트워킹을 사용하는 경우 이러한 컨테이너에 대한 링크 기능을 링크 소스 또는 대상으로 사용할 수 없습니다.
- 호스트 네트워크 스택을 사용하면 프로젝트에 따라 문제가 발생할 수 있는 인스턴스의 캡슐화가 줄어듭니다.
도움이 되길 바랍니다.
많은 시간이 흘렀고 저는 이것을 조금 더 자세히 설명해야 한다고 생각합니다.
도커를 사용하여 스프링 응용 프로그램을 호스팅하는 경우 랜덤 포트를 사용하지 마십시오!모든 컨테이너는 모든 서비스가 동일한 포트를 사용할 수 있도록 자체 IP를 가지기 때문에 고정 포트를 사용합니다.이것은 삶을 훨씬 더 쉽게 만듭니다.
공공 대면 서비스가 있다면 어쨌든 고정 포트를 사용할 것입니다.
메이븐을 통한 로컬 시작의 경우 또는 예를 들어 명령줄에 랜덤 포트를 사용하는 전용 프로필이 있으므로 충돌이 발생하지 않습니다(단, 랜덤 포트 및 서비스 등록과 관련된 버그가 있거나 발생한 적이 있음).
호스트 네트워킹을 사용하고 싶거나 사용해야 하는 이유가 무엇이든 간에 랜덤화된 포트를 사용할 수 있지만 대부분의 경우 사용하면 안 됩니다!
각 도커 인스턴스에 대한 디렉토리를 설정하고 호스트와 인스턴스 간에 디렉토리를 공유한 다음 해당 디렉토리의 파일에 포트와 IP 주소를 쓸 수 있습니다.
$ instanceName=$(generate random instance name)
$ dirName=/var/lib/docker/metadata/$instanceName
$ mkdir -p $dirName
$ docker run -name $instanceName -v ${dirName}:/mnt/metadata ...
$ echo $(get port number and host IP) > ${dirName}/external-address
그런 다음 응용 프로그램에서 /mnt/metadata/external-address를 읽고 해당 정보를 Eureka에 사용합니다.
언급URL : https://stackoverflow.com/questions/29971909/use-eureka-despite-having-random-external-port-of-docker-containers
'programing' 카테고리의 다른 글
| 범위에서 비어 있지 않은 첫 번째 셀 찾기 (0) | 2023.07.16 |
|---|---|
| v11.0\웹 응용 프로그램\Microsoft.파일이 실제로 v10을 참조할 때 WebApplication.targets를 찾을 수 없습니다. (0) | 2023.07.16 |
| SSIS 스크립트 구성 요소가 수동으로 열 때까지 어셈블리를 로드할 수 없음 (0) | 2023.07.11 |
| 외부 IP 주소에서 웹 서버에 액세스할 수 있도록 spring-boot을 설정하는 방법 (0) | 2023.07.11 |
| 일부 Excel 파일이 공유 경로에서 SQL Server로 이동하지 않음 (0) | 2023.07.11 |