【问题标题】:Docker and Spring BootDocker 和 Spring Boot
【发布时间】: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


【解决方案1】:

问题 1::您可以为 eureka 容器使用别名,并为您的所有服务使用一个网络。例如,您可以拥有一个带有所有容器的docker-composedefaultZone: http://eureka-service:8761/eureka/eureka-serviceeureka 实例的别名。

例如,您可能有application.yml 用于服务

 client:
    serviceUrl:
      defaultZone: ${eureka_url:http://eureka-server:8761/eureka/}

docker-compose 的示例。 Docker-compose 将为所有服务创建一个网络

  eureka-server:
    image: eureka-server
    ports:
     - "8761:8761"

Full github example

问题 2::为此我会使用一些网关。例如代理,它将能够将请求分发到某些微服务。 The API Gateway Pattern(基于 Zuul 代理)。使用 eureka 的一个网络中的服务将确定每个服务使用哪个端口。

在上面的例子中,他们也使用了 zuul 网关。使用网关,您不需要为每个微服务公开端口。而且你可以有一些额外的监控和安全性。

【讨论】:

  • 我尝试了你对 question1 的建议,所以有 2 个服务在尤里卡注册。 service1 仍然无法使用带有“未知主机异常”的 IP 地址对 service2 执行 restful。我可以通过 eureka/apps/ (172.21.0.2, 172.21.0.3) 查看 IP 地址,但也无法连接这些地址
  • @maspen service1 正在尝试打电话给service1?如果是,请不要使用 IP 地址。当您从service2 调用service1 时,您可以使用eureka-service 之类的服务名称,但例如service1,反之亦然。如果您尝试在 docker 网络之外调用 service1,则需要公开端口。但你说你有为你的服务随机生成的端口。所以这很棘手,应该有gateway,它将能够与eureka一起玩,并且会知道服务的端口。
  • 我正在公开“静态”端口(即现在不担心动态端口)。我的rest模板调用SERVICE2....但是当它执行时,得到未知的主机异常b/c eureka将'service2'与链接c286a550d1a9:service2:8083相关联
猜你喜欢
  • 2016-12-24
  • 2019-04-12
  • 2019-01-23
  • 1970-01-01
  • 2020-01-09
  • 2018-12-15
  • 2015-08-08
  • 2018-05-06
  • 2017-09-28
相关资源
最近更新 更多