Pla*_*nee 0 spring gradle docker connection-refused netflix-eureka
我在 docker 上使用 eureka 构建了一个 spring-server 和一个 spring-client,并尝试将客户端连接到服务器。当我在我的中尝试这个时build.gradle:
docker {
maintainer = 'Me'
baseImage = 'java:8'
}
distDocker {
exposePort 8080
setEnvironment 'JAVA_OPTS', '-Dspring.profiles.active=docker'
}
Run Code Online (Sandbox Code Playgroud)
一切正常。
但我想使用Dockerfile我写的,所以我使用buildDocker而不是distDocker这样使用它:
task buildDocker(type: Docker, dependsOn: build) {
dockerfile = file('src/main/docker/Dockerfile')
doFirst {
copy {
from jar
into stageDir
}
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个Dockerfile:
FROM java:8
ADD myjar-1.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
Run Code Online (Sandbox Code Playgroud)
这总是会导致
连接被拒绝错误或更准确地说是 ClientHandleException:连接到http://localhost:8761被拒绝
我实在不明白问题出在哪里?如果我不尝试连接到服务器,两种方法都可以工作,但如果我尝试连接则只能distDocker工作。
在容器内运行的 Spring Boot 客户端应用程序正在尝试访问 localhost:8761,因为在此 Docker 容器的上下文中,“localhost”指的是容器的地址。容器的端口 8761 上没有任何运行,因此您会看到错误connection refused。
这可能有帮助:
通过以下方式在客户端应用程序的配置中指定 Eureka 的位置application.yml:
eureka:
client:
serviceUrl:
defaultZone: <IP-address-of-Eureka-server>/eureka/
Run Code Online (Sandbox Code Playgroud)
可以是可以从容器内部<IP-address-of-Eureka-server>解析的 IP 地址或主机名。如果要传递主机VM(运行 Docker 容器的主机)的地址,可以使用form 将其作为环境变量传递。像这样的东西:--env eureka.client.serviceUrl.defaultZone=xx.xx.xx.xx
$ docker run ... --env eureka.client.serviceUrl.defaultZone=xx.xx.xx.xx
Run Code Online (Sandbox Code Playgroud)
与此相关的是,如果您的 Spring Boot 客户端应用程序还需要向 Eureka 注册,那么您将需要额外的配置来将Spring Boot 应用程序的可解析主机名和端口发布到 Eureka。您可以将以下内容添加到您的application.yml:
eureka:
instance:
hostname: <client-host>
nonSecurePort: <client-port>
Run Code Online (Sandbox Code Playgroud)
其中,
<client-host>是客户端应用程序容器的可解析主机名;是
<client-port>主机虚拟机的端口,绑定到容器的公开端口>
同样,您可以使用--env如上所示的参数传递这些。
$ docker run -p 9001:8080 ... \
--env eureka.instance.hostname=yy.yy.yy.yy \
--env eureka.instance.nonSecurePort=9001
Run Code Online (Sandbox Code Playgroud)
请务必设置yy.yy.yy.yy为您的虚拟机的 IP 地址。
| 归档时间: |
|
| 查看次数: |
3717 次 |
| 最近记录: |