【发布时间】:2018-12-27 05:33:43
【问题描述】:
我有两个SpringBoot 微服务M1(port 2002) 和M2(port 2004)
如果我使用eclipse 运行M1 和M2(作为Java 项目或SpringBoot 项目运行),则它们通信成功。
但是,我想使用Docker container 与他们交流。
所以我使用以下命令为Microservices(M1 和M2)构建图像:
docker build -f Dockerfile -t image_name .
并使用以下命令运行图像:
docker run -p 2004:2004 image_name
注意:我从 docker 暴露了与上面定义的相同的端口
但是 M1 和 M2 无法通信。
我正在使用RestTemplate
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Boolean> isUp = restTemplate.getForEntity("http://localhost:2002/apis/test",Boolean.class);
我遇到了异常:
I/O error on GET request for \"http://localhost:2002/apis/test\": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)
但是,如果我使用我的机器的 IP 调用其他微服务,它会成功通信
ResponseEntity<Boolean> isUp = restTemplate.getForEntity("http://XX.XX.XX.XXX:2002/apis/test",Boolean.class);
谁能告诉我是在写(使用 IP 地址)还是有另一种好方法可以使用 Docker 从另一个微服务调用一个微服务?
【问题讨论】:
-
您是否尝试过使用
--net=host(docker run 的参数)?这应该可以解决 localhost 引用容器的内部 ip 而不是机器 ip 的问题。 -
@Ben 不,您能否将其添加为答案。我用什么替换
host? -
因为它更像是一个建议而不是一个直接的答案,所以在这里评论就可以了。你也确定这没有帮助?因为 localhost 在那一刻应该 100% 引用主机。参考this问题,接受的答案非常详细地解释了事情。
-
尽管 Ben 的回答可能会奏效,但这可能不是最好的做法。你应该先阅读文档docs.docker.com/network
标签: java rest docker spring-boot microservices