gpt4 book ai didi

java - 如何使用 docker 镜像从另一个微服务调用一个微服务

转载 作者:IT老高 更新时间:2023-10-28 21:43:54 32 4
gpt4 key购买 nike

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

M1M2 如果我使用 eclipse 运行它们(作为 Java 项目或 SpringBoot 项目运行),则它们通信成功。

但是,我想使用 Docker 容器 与它们通信。

所以我使用以下命令为 Microservices(M1M2)构建图像:

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

最佳答案

尝试与其他容器通信将无法使用 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)

关于java - 如何使用 docker 镜像从另一个微服务调用一个微服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51416552/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com