Spring客户端连接被docker和gradle拒绝

我在Docker上用eureka构build了一个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作品。

在容器内部运行的Spring Boot客户端应用程序试图到达localhost:8761,并且由于在这个Docker容器的上下文中,'localhost'指向容器的地址。 没有任何东西在容器的端口8761上运行,因此你看到connection refused错误。

这可能有助于:

通过application.yml在客户端应用程序的configuration中指定尤里卡的位置:

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

<IP-address-of-Eureka-server>的IP地址可以是IP地址,也可以是容器内部可以parsing的主机名。 如果要传递主机虚拟机(运行Docker容器的主机)的地址,可以使用--env eureka.client.serviceUrl.defaultZone=xx.xx.xx.xxforms将其作为环境variables传递。 像这样的东西:

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

在相关说明中,如果您的Spring Boot客户端应用程序也需要向Eureka注册,那么您需要额外的configuration才能将您的Spring Boot应用程序的可parsing主机名和端口发布到Eureka。 您可以将以下内容添加到您的application.yml

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

其中, <client-host>是客户端应用程序容器的可parsing主机名; 而<client-port>是绑定到容器的暴露端口的宿主虚拟机的端口>

再次,您可以使用--envparameter passing这些参数,如上所示。

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

请确保将yy.yy.yy.yy设置为虚拟机的IP地址。