【发布时间】:2018-01-23 17:32:42
【问题描述】:
我们有许多 Spring Boot 应用程序并开始使用 Docker 进行“容器化”。
现在,我们正在运行 Eureka(Spring Boot)和客户端应用程序(所有其他 Spring Boot 应用程序),它们的 application.yml 文件中有:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
这在在 docker化之前有效。
现在,当我对(Eureka 客户端)应用程序进行 docker 化时(Eureka 服务程序仍未进行 docker 化),我无法使用“localhost”,因为 Eureka 不在同一个容器中运行。我可以通过复制它的 url (192.168.2.77) 来连接到 Eureka,所以上面现在变成了:
eureka:
client:
serviceUrl:
defaultZone: http://192.168.2.77:8761/eureka/
这行得通。
问题 1:
当 Eureka 服务器被 dockerized 时,我如何将它的 url 传递给客户端应用程序?我想我可以将上述设置为:
eureka:
client:
serviceUrl:
defaultZone: ${eurekaURL}
在启动容器时使用“-e eurekaURL:xyz”,但我如何获得 Eureka 服务器 IP ... 理想情况下是动态的?
问题 2:
Spring Boot 应用程序没有分配端口。在他们的 application.yml 文件中,我使用:
server.port: 0
以便分配任何可用的端口。
但是,要公开端口以便访问正在运行的 Web 应用程序,我必须在 docker 命令中公开一个端口(... -p 8080:8080 ...)。这怎么可能,因为直到 Spring Boot 应用程序启动才知道“可用端口”?
【问题讨论】:
-
您可以创建 docker 网络并使那些应该通信的容器成为同一网络的一部分。您还可以将所有容器绑定到
--net=host,因此实际上可以通过localhost进行通信。 -
当您决定使用
--net=host时,您不必发布端口,因为它们直接在localhost上打开。 -
谢谢。将调查 --net=host
-
刚刚尝试过;使用 --net=host 运行服务注册表。使用“localhost”和使用已知端口的 IP 地址无法通过浏览器访问它。当我执行“docker ps”时,没有暴露端口,所以不理解这种方法:(
-
在你的 Dockerfile 中暴露一个端口吗?
标签: docker spring-boot