使用Eureka,尽管有随机的docker容器外部端口

使用Eureka,尽管有随机的docker容器外部端口,docker,spring-boot,netflix-eureka,netflix-zuul,Docker,Spring Boot,Netflix Eureka,Netflix Zuul,我正在编写一个应用程序,它由几个基于spring引导的微服务组成,前面有一个基于zuul的反向代理- 当我在我的机器上启动服务时,它就可以工作了,但是对于服务器卷展,我想使用docker来提供服务,但是现在似乎不可能 通常,您会在容器外部有一个固定的“内部”端口和随机端口。但是容器中的应用程序不知道外部端口(和IP) Netflix工具符合我想要编写的高效微服务架构,从概念上讲,我非常喜欢docker。 据我所知,启动容器、收集主机上的外部端口并将其传递给应用程序将非常麻烦,因为在应用程序启动后

我正在编写一个应用程序,它由几个基于spring引导的微服务组成,前面有一个基于zuul的反向代理-

当我在我的机器上启动服务时,它就可以工作了,但是对于服务器卷展,我想使用docker来提供服务,但是现在似乎不可能

通常,您会在容器外部有一个固定的“内部”端口和随机端口。但是容器中的应用程序不知道外部端口(和IP)

Netflix工具符合我想要编写的高效微服务架构,从概念上讲,我非常喜欢docker。 据我所知,启动容器、收集主机上的外部端口并将其传递给应用程序将非常麻烦,因为在应用程序启动后,您不能简单地更改端口

有没有办法将eureka与基于docker的客户端一起使用

[更新] 我想我在解释这个问题时做得很糟糕。因此,也许这更能说明问题:

eureka服务器本身可以在docker中运行,因为我只有一个,外部端口并不重要。我可以使用链接功能从客户端访问它

问题是客户端注册自己的URL。 例如,由于动态端口分配,它实际上只能通过

因此,eureka将为服务返回错误的URL

更新
我已经更新了下面的答案,请看一下。

我自己找到了一个解决方案,这可能不是最好的解决方案,但它适合我

当您使用“-net=host”(主机网络)启动docker时,则直接使用主机网络堆栈。然后我只使用0作为spring引导的端口,spring为我随机化该端口,因为它使用主机网络堆栈,所以没有转换到其他端口(和IP)

但也有一些缺点:

  • 使用主机网络时,不能将这些容器的链接功能用作链接源或目标
  • 使用主机网络堆栈会减少实例的封装,这可能是一个问题,具体取决于您的项目
我希望有帮助

很多时间已经过去了,我想我应该进一步阐述一下:

  • 如果您使用docker托管spring应用程序,请不要使用随机端口!使用固定端口,因为每个容器都有自己的IP,所以每个服务都可以使用相同的端口。这让生活变得容易多了

  • 如果您有面向公众的服务,那么您无论如何都会使用固定端口

  • 对于通过maven或例如命令行进行的本地启动,命令行有一个使用随机端口的专用配置文件,这样您就不会有冲突(但请注意,随机端口和服务注册周围存在或曾经存在一些错误)

  • 如果出于任何原因您想要或需要使用主机网络,您当然可以使用随机端口,但大多数情况下您不应该使用


  • 您可以为每个docker实例设置一个目录,并在主机和实例之间共享该目录,然后将端口和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。

    您有14个带Eureka的docker映像和3个zuul,也许您应该查看相关的docker文件。问题是没有带Eureka的docker映像。问题是客户端无法使用其随机外部世界端口在eureka中注册,因为应用程序本身只知道内部端口。>>>应用程序本身只知道内部端口-->您可以使用卷来写入和读取内部端口,请参阅
    docker run--
    中的卷,有多种方法可以获取主机上的外部端口,然后仍然需要让eureka客户端使用此端口而不是检测到的内部端口。我希望有人已经尝试使用这种组合。您是否在一台计算机上运行更多(相同服务的)docker实例,或者为什么不能同时使用固定(外部)端口?谢谢您的这种方法!我想过类似的事情。这需要有一个特殊的启动脚本,在启动应用程序之前等待设置端口和IP数据。由于我计划稍后使用kubernetes之类的工具进行扩展和管理,我希望尽可能减少对特殊脚本的需求。您只需在应用程序中轮询文件,并在填充后向Eureka注册即可。虽然启动容器时确实需要特殊处理。正确,只要主机网络模式没有问题,我就使用它。当我必须使用标准网络时,我会尝试你的建议。谢谢在AWS中,每个服务都将位于自己的主机上,对吗?然后你可以使用“常规”(又称Netflix)的方式使用固定端口,对吗?端口没有问题,问题在于主机。在容器内,我无法确定主机的IP地址。然而,AWS SDK能够做到这一点,我通过编程解决了我的问题。