0

我在docker上用eureka构建了一个spring-server和一个spring-client,我尝试将客户端连接到服务器。当我在我的build.gradle

docker {
  maintainer = 'Me'
  baseImage = 'java:8'
}

distDocker {
  exposePort 8080
  setEnvironment 'JAVA_OPTS', '-Dspring.profiles.active=docker'
}

一切正常。

但我想用Dockerfile我写的,所以我用buildDocker代替,distDocker我用这种方式:

task buildDocker(type: Docker, dependsOn: build) {
  dockerfile = file('src/main/docker/Dockerfile')
  doFirst {
    copy {
      from jar
      into stageDir
    }
  }
}

有了这个Dockerfile

FROM java:8
ADD myjar-1.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]

这总是导致

连接被拒绝错误或更准确地说是 ClientHandleException:连接到http://localhost:8761被拒绝

我真的不明白问题出在哪里?如果我不尝试连接到服务器,两种方式都可以工作,但如果我尝试连接,则只能distDocker工作。

4

1 回答 1

4

在容器内运行的 Spring Boot 客户端应用程序正在尝试访问 localhost:8761,因为在此 Docker 容器的上下文中,“localhost”指的是容器的地址。容器的端口 8761 上没有运行任何东西,因此您会看到connection refused错误。

这可能会有所帮助:

通过以下方式在客户端应用程序的配置中指定 Eureka 的位置application.yml

eureka:
  client:
    serviceUrl:
      defaultZone: <IP-address-of-Eureka-server>/eureka/

<IP-address-of-Eureka-server>可以是可以从容器内部解析的IP 地址或主机名。如果要传递主机VM(运行 Docker 容器的主机)的地址,可以使用 form.properties 将其作为环境变量传递--env eureka.client.serviceUrl.defaultZone=xx.xx.xx.xx。像这样的东西:

$ docker run ... --env eureka.client.serviceUrl.defaultZone=xx.xx.xx.xx

在相关说明中,如果您的 Spring Boot 客户端应用程序还需要向 Eureka 注册自身,那么您将需要额外的配置来将Spring Boot 应用程序的可解析主机名和端口发布到 Eureka。您可以将以下内容添加到您的application.yml

eureka:
  instance:
    hostname: <client-host>
    nonSecurePort: <client-port>

其中, <client-host>是客户端应用程序容器的可解析主机名;并且 <client-port>是绑定到容器暴露端口的主机 VM 的端口>

--env同样,您可以使用如上所示的参数传递这些。

$ docker run -p 9001:8080 ... \
             --env eureka.instance.hostname=yy.yy.yy.yy \
             --env eureka.instance.nonSecurePort=9001

请务必设置yy.yy.yy.yy为您的 VM 的 IP 地址。

于 2015-11-18T04:17:55.297 回答