使用zuul路由到docker中的不同容器不起作用

Posted

技术标签:

【中文标题】使用zuul路由到docker中的不同容器不起作用【英文标题】:Routing to different container in docker using zuul not working 【发布时间】:2017-01-26 23:53:55 【问题描述】:

我有 2 个微服务(spring boot 应用程序)在不同的 docker 容器中运行并配置了 zuul api 网关。路由到其他容器不起作用。容器 1 运行在 8030 端口,容器 2 运行在 8030 端口。

下面是application.yml中的zuul配置-

server:
  port: 8030

# TODO: figure out why I need this here and in bootstrap.yml

spring:
  application:
    name: zuul server

endpoints:
  restart:
    enabled: true
  shutdown:
    enabled: true
  health:
    sensitive: false

zuul:
  routes:
    zuultest:
         url: http://localhost:8080
         stripPrefix: false 

ribbon:
  eureka:
    enabled: false

当通过 localhost:8030/zuultest/test 访问时,我得到的异常为 -

2016-09-19 09:10:14.597  INFO 1 --- [nio-8030-exec-3] hello.SimpleFilter                       : GET request to http://localhost:8030/zuultest/test
2016-09-19 09:10:14.600  WARN 1 --- [nio-8030-exec-3] o.s.c.n.z.filters.post.SendErrorFilter   : Error during filtering

我能知道我为什么会得到这个吗?

【问题讨论】:

【参考方案1】:

您可以使用 docker-compose.yml 中的链接选项来链接两个容器。

demo1:
  image: <demo1 image name>
  links: - demo2
demo2:
  image: <demo2 image name>

然后在 zuul:routs:url 配置中,您可以使用容器名称,demo2,而不是 IP。

【讨论】:

【参考方案2】:

您是如何启动这 2 个容器的?如果您将它们暴露给 docker 主机,则两者不能具有相同的端口。

docker run --name service A --net=host -p 8030:8030 ...
docker run --name service B --net=host -p 8030:8031 ...

没有这个,如果你调用 localhost:8030,你调用的是主机(而不是容器),你没有得到响应。

使用不同端口启动它们时需要将端口映射到主机,并使用localhost调用它们到正确的暴露端口

【讨论】:

以上是关于使用zuul路由到docker中的不同容器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

子进程在 docker 容器中不起作用

SpringCloud微服务(05):Zuul组件,实现路由网关控制

SpringCloud微服务(05):Zuul组件,实现路由网关控制

Docker容器上传到gcp cloud-run,核心Web api应用程序不起作用

Zuul 代理在 Tomcat vai SpringBootServlet 上不起作用

Docker容器跨主机通信之:直接路由方式