如何使用Docker映像从另一个微服务调用一个微服务

时间:2018-07-19 07:16:12

标签: java rest docker spring-boot microservices

我有两个SpringBoot微服务M1(端口2002)和M2(端口2004)

如果我使用M1(作为Java Project或SpringBoot Project运行)运行

M2eclipse,则通信成功。

但是,我想使用Docker container与他们进行交流。

因此,我使用以下命令为MicroservicesM1M2)构建图像:

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从另一个服务调用一个微服务?

2 个答案:

答案 0 :(得分:5)

尝试与其他容器通信无法与localhost一起使用。

您应该创建一个自定义的桥接网络,该网络将允许您按名称引用这些容器。如果您只是在内部进行交谈,则无需发布端口。

# create network
docker network create -d bridge mynet
# container 1
docker container run --network mynet --name container1 -d image_name
# container 2
docker container run --network mynet --name container2 -d some_other_image_name

然后可以将代码段中的IP替换为另一个容器的名称

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Boolean> isUp = restTemplate.getForEntity("http://container2:2002/apis/test",Boolean.class)

答案 1 :(得分:2)

或者,您也可以通过<?php $ht = array('day1' => 1,'day2' =>2,'day3' =>3,'day4' =>4); var_dump($ht); for ($x = 1; $x <= 10; $x++) { if (isset($ht['day' . $x])) { if($ht['day' . $x] == $x){ echo 'x'; } } else{ echo $x; } } ?> 将两个容器链接在一起。假设您要使用container1作为container2的客户端,则可以使用以下代码:

xxxx5678910