有Spring Boot的Docker和Eureka无法注册客户端

我有一个使用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] cndstdRedirectingEurekaHttpClient : 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客户端似乎有一个心跳尝试调用它configuration的服务器的主页。 这意味着它只是无法find我注册的Eureka服务器(并且正在运行,我可以在本地主机上导航到:8671)。

我在这里错过了什么? 一切运行良好运行本地与弹簧启动与自己的embedded式tomcat容器启动。 一旦我开始用docker-compose做它,它不想工作。

编辑

我相信,我意识到我的问题。 所以docker不能在本地主机上运行,​​它运行在我启动docker时分配的公有IP上。 导航到这个IP +端口显示我的服务运行Eureka服务器。 客户仍然不注册。

所以我修改了我的eureka客户端的application.yml文件来:

 serviceUrl: defaultZone: http://192.168.59.103:8761/eureka/ 

那个IP就是我的docker守护进程运行的那个IP。 现在,当我做docker撰写时,它错过了第一次注册,但第二次心跳拿起我的客户。

我如何确保客户端等到服务器完全运行? 我在我的文件撰写文件中使用了正确的docker“链接”字段,但没有按照我的希望工作。 另外,我怎样才能看到defaultZone文件是我的DOCKER_HOST IP?

最后结果

由此产生的一切为我工作的docker组成文件是:

 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 

如果对您有用,那么在某种程度上,我如何为我的生产环境(docker-compose文件版本2)对其进行configuration:

 version: '2' services: eureka-server: image: rosenthal/eureka-server expose: - "8761" user-registration: image: rosenthal/user-registration container_name: user-registration ports: - "9000:8080" environment: server.port: 8080 eureka.client.enabled: 'true' eureka.host: eureka-server eureka.instance.preferIpAddress: 'true' 

从文档 expose是:

公开端口而不将它们发布到主机 – 它们只能被链接的服务访问。 只能指定内部端口。

因为你已经拥有了同一个networking中的所有东西,所以容器之间可以看到彼此之间的链接。

边注

请记住,通过此configuration,端口9000将在主机上公开访问,并映射到用户注册容器的8080端口。

设置环境属性以覆盖eureka.client.serviceUrl.defaultZone以匹配泊坞窗撰写文件中的服务名称。

 eureka-server: image: rosenthal/eureka-server ports: - "8761:8761" user-registration: image: rosenthal/user-registration ports: - "9000:9000" environment: - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://eureka-server:8761/eureka 

这将覆盖打包的application.properties的属性。

注:注释中所述,您不需要撰写文件中的links部分。 我删除是这样的。 有关这方面的信息,请参阅https://docs.docker.com/compose/networking/