Docker+Spring cloud访问报错Whitelabel Error Page

三台测试服务器:10.167.200.75、10.167.200.76、10.167.200.77
两个项目:question-service(8861)、question-views(8862)、question-center(8761)
spring cloud 、 Docker 、 nginx

service、views项目通过center的注册中心,将服务注册到注册中心,然后由注册中心进行分配消费。
docker 启动容器的命令:

docker run -d -p 8861:8861 --name question-service-c question-service-i
docker run -d -p 8862:8862 --name question-view-c question-view-i

使用docker命令启动项目都能正常启动,但是通过view项目验证页面的时候,浏览器报出下面错误:

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Thu May 24 00:55:01 EDT 2018
There was an unexpected error (type=Internal Server Error, status=500).
Error resolving template "initTelCheck", template might not exist or might not be accessible by any of the configured Template Resolvers

后台日志报错如下错误:

2018-05-24 00:53:25.182 [http-nio-8862-exec-8] ERROR org.thymeleaf.TemplateEngine - [THYMELEAF][http-nio-8862-exec-8] Exception processing template "initTelCheck": Error resolving template "initTelCheck", template might not exist or might not be accessible by any of the configured Template Resolvers
org.thymeleaf.exceptions.TemplateInputException: Error resolving template "initTelCheck", template might not exist or might not be accessible by any of the configured Template Resolvers
at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:870)
at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607)

因为项目用到了thymeleaf模板,以为是模板问题。但是经过分析和猜想,其实是view项目通过注册中心访问service项目的时候,无法访问到service项目的地址。(实在是没想明白为什么会报模板的错误??)

既然找到了问题所在,就要找什么原因导致的。
其实单独75、76、77三台机器访问service的地址,都是可以访问的(也就是说明service项目是启动起来了)
但是为什么view找不到service地址呢? 原因是容器启动的时候,都会有容器自己的命名空间,分配属于容器独立的IP,在注册中心这里,service项目会将容器的独立IP注册到注册中心上,这样注册中心注册的映射IP不是真实可访问的IP(比如75这台机器,正常访问service项目应该是http://10.167.200.75:8861/service, 但是注册中心上的注册信息的IP却是0.0.0.0 而非10.167.200.75),这就导致view通过注册中心请求service项目时,注册中心就映射错误的地址(http://0.0.0.0:8861/service)

问题的症结就找到了,那么该如何解决呢?
既然是service的注册IP有问题,那就应该想办法将正确的IP注册到center(注册中心)中。 怎么做呢?
通过修改 创建容器的命令就可以做到:

docker run -d -p 8861:8861 --name question-service-c question-service-i

修改为

docker run -d -p 8861:8861 --net=host --name telrobot-question-service-c-test telrobot-question-service-i

是的,增加一个启动参数 --net=host 什么意思呢?
这个模式下创建出来的容器,将不拥有自己独立的Network Namespace,即没有独立的网络环境。它使用宿主机的ip和端口。
如此一来,service项目在注册中心注册的IP地址就成了宿主的实际IP(75/76/77)。

问题解决!
仅此记录!

你可能感兴趣的:(Docker+Spring cloud访问报错Whitelabel Error Page)