使用 docker-compose 时未注册到 eureka 的应用程序
Posted
技术标签:
【中文标题】使用 docker-compose 时未注册到 eureka 的应用程序【英文标题】:Applications not registering to eureka when using docker-compose 【发布时间】:2018-04-26 06:44:22 【问题描述】:我以https://github.com/paulc4/microservices-demo 为例,并从中创建了 3 个 docker 镜像,其中包含以下 Dockerfile:
springdocker注册:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/microservice-demo-1.1.0.RELEASE.jar app.jar
EXPOSE 1111
ENTRYPOINT exec java -jar /app.jar registration
springdocker 帐户:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/microservice-demo-1.1.0.RELEASE.jar app.jar
EXPOSE 2222
ENTRYPOINT exec java -jar /app.jar accounts
springdocker-web:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/microservice-demo-1.1.0.RELEASE.jar app.jar
EXPOSE 3333
ENTRYPOINT exec java -jar /app.jar web
如果我分别运行这三个图像,一切正常,web
和accounts
服务注册到registration
服务(这是尤里卡注册表的实现),我可以使用我的应用程序。但是,当使用 docker-compose
和以下 docker-compose.yml
文件时
version: "3.4"
services:
registration:
image: springdocker-registration
ports:
- "1111:1111"
accounts:
image: springdocker-accounts
ports:
- "2222:2222"
links:
- registration
depends_on:
- registration
web:
image: springdocker-web
ports:
- "3333:3333"
depends_on:
- registration
- accounts
links:
- registration
服务web
和accounts
无法注册到registration
服务。以下是应用程序的配置文件:
registration-server.yml:
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:1111/eureka/
server:
port: 1111
spring:
thymeleaf:
enabled: false
accounts-server.yml:
spring:
application:
name: accounts-service
freemarker:
enabled: false
thymeleaf:
cache: false
prefix: classpath:/accounts-server/templates/
error:
path: /error
server:
port: 2222
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka
instance:
leaseRenewalIntervalInSeconds: 5
preferIpAddress: true
web-server.yml
spring:
application:
name: web-service
freemarker:
enabled: false
thymeleaf:
cache: false
prefix: classpath:/web-server/templates/
error:
path: /error
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka
instance:
leaseRenewalIntervalInSeconds: 5
preferIpAddress: true
server:
port: 3333
我可以发布docker-compose up
的完整控制台日志,但我认为这是有趣的一点:
1: ERROR RedirectingEurekaHttpClient - Request execution error
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused (Connection refused)
1: ERROR DiscoveryClient - DiscoveryClient_WEB-SERVICE/e3b5e6b3396c:web-service:3333 - was unable to refresh its cache! status = Cannot execute request on any known server
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
【问题讨论】:
【参考方案1】:对于那些使用 docker-compose 的人,如果在您的服务 yml 文件中,您有以下内容:
eureka:
client:
serviceUrl:
# Will get overridden in docker-compose
defaultZone: http://localhost:1111/eureka
您可以在运行 docker-compose up
时在 docker-compose 文件中覆盖它,如下所示
version: "3.3"
services:
# Other services registered above
web:
image: springdocker-web
environment:
# Important for clients to register with eureka
- eureka.client.serviceUrl.defaultZone=http://registration:8761/eureka/
ports:
- "3333:3333"
depends_on:
- registration
- accounts
links:
- registration
在 Docker 版本 19.03.8 上测试
【讨论】:
这是正确答案。接受的答案无效。【参考方案2】:因为它在 docker 中运行,所以不要使用localhost
。 Docker compose 允许您引用容器名称。
eureka:
client:
serviceUrl:
defaultZone: http://registration:1111/eureka
旁注:defaultZone
必须准确,我花了 2 天的时间想知道为什么它不起作用,因为 intellij 自动完成了做 default-zone
这不起作用。
【讨论】:
为了记录,docker 让我们为容器指定主机名:hostname: registration
以上是关于使用 docker-compose 时未注册到 eureka 的应用程序的主要内容,如果未能解决你的问题,请参考以下文章