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.xx
forms将其作为环境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>
是绑定到容器的暴露端口的宿主虚拟机的端口>
再次,您可以使用--env
parameter passing这些参数,如上所示。
$ docker run -p 9001:8080 ... \ --env eureka.instance.hostname=yy.yy.yy.yy \ --env eureka.instance.nonSecurePort=9001
请确保将yy.yy.yy.yy
设置为虚拟机的IP地址。