使用docker和gradle在spring-client上拒绝连接

时间:2015-11-17 13:27:29

标签: spring gradle docker netflix-eureka connection-refused

我在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就可以了。

1 个答案:

答案 0 :(得分:3)

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

这可能会有所帮助:

通过application.yml

在客户端应用的配置中指定Eureka的位置
eureka:
  client:
    serviceUrl:
      defaultZone: <IP-address-of-Eureka-server>/eureka/

<IP-address-of-Eureka-server>可以是IP地址,也可以是 in 容器中解析的主机名。如果要传递主机 VM(运行Docker容器的主机)的地址,可以使用--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应用程序的 resolvable 主机名和端口发布到Eureka 。您可以将以下内容添加到application.yml

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

其中,    <client-host>是客户端应用容器的可解析主机名;和    <client-port>是主机VM的端口,它绑定到容器的公开端口&gt;

同样,您可以使用--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地址。