spring-客户端与 docker 和 gradle 的连接被拒绝
Connection refused on spring-client with docker and gradle
我在 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"]
这总是会导致
connection refused-error or more precisely to a ClientHandleException: Connection to http://localhost:8761 refused
我不太明白问题出在哪里?如果我不尝试以两种方式连接到服务器,但如果我尝试仅连接 distDocker
有效。
容器内 Spring 引导客户端应用程序 运行 正在尝试到达 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 地址或主机名,可以从容器内部 解析。如果要传递 host VM(运行 Docker 容器的主机)的地址,可以使用 --env eureka.client.serviceUrl.defaultZone=xx.xx.xx.xx
形式将其作为环境变量传递.像这样:
$ docker run ... --env eureka.client.serviceUrl.defaultZone=xx.xx.xx.xx
相关说明,如果您的 Spring 引导客户端应用程序也需要向 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 地址。
我在 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"]
这总是会导致
connection refused-error or more precisely to a ClientHandleException: Connection to http://localhost:8761 refused
我不太明白问题出在哪里?如果我不尝试以两种方式连接到服务器,但如果我尝试仅连接 distDocker
有效。
容器内 Spring 引导客户端应用程序 运行 正在尝试到达 localhost:8761,并且由于在此 Docker 容器的上下文中 'localhost'指的是容器的地址。容器的端口 8761 上没有任何 运行,因此您会看到 connection refused
错误。
这可能有帮助:
通过 application.yml
:
eureka:
client:
serviceUrl:
defaultZone: <IP-address-of-Eureka-server>/eureka/
<IP-address-of-Eureka-server>
可以是 IP 地址或主机名,可以从容器内部 解析。如果要传递 host VM(运行 Docker 容器的主机)的地址,可以使用 --env eureka.client.serviceUrl.defaultZone=xx.xx.xx.xx
形式将其作为环境变量传递.像这样:
$ docker run ... --env eureka.client.serviceUrl.defaultZone=xx.xx.xx.xx
相关说明,如果您的 Spring 引导客户端应用程序也需要向 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 地址。