我有一个使用 Spring Boot + Docker Compose + Eureka 的非常简单的演示。
我的服务器在端口 8671 上运行,具有以下应用程序属性:
server:
port: 8761
eureka:
instance:
prefer-ip-address: true
client:
registerWithEureka: false
fetchRegistry: false
server:
waitTimeInMsWhenSyncEmpty: 0
我的 Eureka 客户端在端口 9000 上运行,具有以下应用程序属性:
server:
port: 9000
spring:
application:
name: user-registration
eureka:
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
当我在父级 maven 项目中启动 docker.compose 文件时,这是我的 docker-compose 文件的内容:
eureka-server:
image: rosenthal/eureka-server
ports:
- "8761:8761"
user-registration:
image: rosenthal/user-registration
ports:
- "9000:9000"
links:
- eureka-server
当我通过首先启动尤里卡服务器运行我的应用程序时,然后通过客户端启动
mvn spring-boot:run
服务器成功注册我的客户端(我称之为用户注册)。
当我通过 docker-compose 运行应用程序时,客户端无法注册并显示以下输出:
DiscoveryClient_USER-REGISTRATION/0fd640cbc3ba:user-registration:9000:
registering service...
user-registration_1 | 2017-06-21 04:36:05.120 ERROR 1 --- [nfoReplicator-0]
c.n.d.s.t.d.RedirectingEurekaHttpClient : Request execution error
user-registration_1 |
user-registration_1 | com.sun.jersey.api.client.ClientHandlerException:
java.net.ConnectException: Connection refused (Connection refused)
我的第一个假设是,运行 docker-compose 在等待服务器启动时遇到了竞争条件,但我的 eureka 客户端似乎有一个心跳,试图回拨到它配置的服务器。这意味着它无法找到我已经注册的 Eureka 服务器(并且正在运行,我可以在 localhost:8671 上导航到它)。
我在这里缺少什么?使用 spring-boot 使用它自己的嵌入式 tomcat 容器启动,一切都可以在本地运行良好。一旦我开始用 docker-compose 来做,它就不想工作了。
EDIT
我相信我意识到了我的问题。所以docker不在本地主机上运行,它在我启动docker时分配的公共IP上运行。导航到此 IP + 端口显示我的服务正在为 Eureka Server 运行。客户仍然没有注册。
所以,我对我的 eureka 客户端的 application.yml 文件进行了更改:
serviceUrl:
defaultZone: http://192.168.59.103:8761/eureka/
该 IP 是我的 docker 守护进程正在运行的 IP。现在,当我执行 docker-compose 时,它错过了第一次注册,但第二次心跳接收了我的客户端。
如何确保客户端等待服务器完全启动?我在我的摘要撰写文件中使用了正确的 docker“链接”字段,但它没有像我希望的那样工作。另外,我怎样才能看到defaultZone文件是我的DOCKER_HOST IP?
最后结果
生成的 docker-compose 文件让一切对我有用的是:
eureka-server:
image: thorrism/eureka-server
ports:
- "8761:8761"
user-registration:
image: thorrism/user-registration
ports:
- "9000:9000"
links:
- eureka-server
environment:
EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://eureka-server:8761/eureka