我有两个SpringBoot
微服务M1
(端口2002)和M2
(端口2004)
M1
(作为Java Project或SpringBoot Project运行)运行 M2
和eclipse
,则通信成功。
但是,我想使用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从另一个服务调用一个微服务?
答案 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