使用 docker-compose 时未注册到 eureka 的应用程序

Posted

技术标签:

【中文标题】使用 docker-compose 时未注册到 eureka 的应用程序【英文标题】:Applications not registering to eureka when using docker-compose 【发布时间】:2018-04-26 06:44:22 【问题描述】:

我以https://github.com/paulc4/microservices-demo 为例,并从中创建了 3 个 docker 镜像,其中包含以下 Dockerfile:

springdocker注册:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/microservice-demo-1.1.0.RELEASE.jar app.jar
EXPOSE 1111
ENTRYPOINT exec java -jar /app.jar registration

springdocker 帐户:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/microservice-demo-1.1.0.RELEASE.jar app.jar
EXPOSE 2222
ENTRYPOINT exec java -jar /app.jar accounts

springdocker-web:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/microservice-demo-1.1.0.RELEASE.jar app.jar
EXPOSE 3333
ENTRYPOINT exec java -jar /app.jar web

如果我分别运行这三个图像,一切正常,webaccounts 服务注册到registration 服务(这是尤里卡注册表的实现),我可以使用我的应用程序。但是,当使用 docker-compose 和以下 docker-compose.yml 文件时

version: "3.4"
services:
 registration:
  image: springdocker-registration
  ports:
   - "1111:1111"

 accounts:
  image: springdocker-accounts
  ports:
   - "2222:2222"
  links:
   - registration
  depends_on:
   - registration

 web:
  image: springdocker-web
  ports:
   - "3333:3333"
  depends_on:
   - registration
   - accounts
  links:
   - registration

服务webaccounts 无法注册到registration 服务。以下是应用程序的配置文件:

registration-server.yml:

eureka:
  instance:
    hostname: localhost
  client:  
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
     defaultZone: http://localhost:1111/eureka/

server:
  port: 1111   

spring:
  thymeleaf:
    enabled: false 

accounts-server.yml:

spring:
  application:
     name: accounts-service  
  freemarker:
    enabled: false           
  thymeleaf:
    cache: false            
    prefix: classpath:/accounts-server/templates/    

error:
  path: /error

server:
  port: 2222   

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1111/eureka
  instance:
    leaseRenewalIntervalInSeconds: 5   
    preferIpAddress: true

web-server.yml

spring:
  application:
    name: web-service 
  freemarker:
    enabled: false     
  thymeleaf:
    cache: false       
    prefix: classpath:/web-server/templates/   

error:
  path: /error

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1111/eureka
  instance:
    leaseRenewalIntervalInSeconds: 5 
    preferIpAddress: true

server:
  port: 3333  

我可以发布docker-compose up 的完整控制台日志,但我认为这是有趣的一点:

1: ERROR RedirectingEurekaHttpClient - Request execution error
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused (Connection refused)

1: ERROR DiscoveryClient - DiscoveryClient_WEB-SERVICE/e3b5e6b3396c:web-service:3333 - was unable to refresh its cache! status = Cannot execute request on any known server
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server

【问题讨论】:

【参考方案1】:

对于那些使用 docker-compose 的人,如果在您的服务 yml 文件中,您有以下内容:

eureka:
  client:
    serviceUrl:
      # Will get overridden in docker-compose
      defaultZone: http://localhost:1111/eureka

您可以在运行 docker-compose up 时在 docker-compose 文件中覆盖它,如下所示

version: "3.3"
services:

 # Other services registered above

 web:
  image: springdocker-web
  environment: 
   # Important for clients to register with eureka
   - eureka.client.serviceUrl.defaultZone=http://registration:8761/eureka/
  ports:
   - "3333:3333"
  depends_on:
   - registration
   - accounts
  links:
   - registration

在 Docker 版本 19.03.8 上测试

【讨论】:

这是正确答案。接受的答案无效。【参考方案2】:

因为它在 docker 中运行,所以不要使用localhost。 Docker compose 允许您引用容器名称。

eureka:
  client:
    serviceUrl:
      defaultZone: http://registration:1111/eureka

旁注:defaultZone 必须准确,我花了 2 天的时间想知道为什么它不起作用,因为 intellij 自动完成了做 default-zone 这不起作用。

【讨论】:

为了记录,docker 让我们为容器指定主机名:hostname: registration

以上是关于使用 docker-compose 时未注册到 eureka 的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

通过库共享时未注册 NestJS 自定义 PassportStrategy

使用 swift 4 以编程方式注册时未显示自定义单元格

在 Swift 中注册远程通知时未收到设备令牌

通过推送通知打开应用程序时未注册后退按钮处理程序

使用 ajax 加载模板时未呈现脚本

使用 docker-compose 的 Elastic Beanstalk Docker 私有注册表