gpt4 book ai didi

rest - Docker : java.net.ConnectException:连接被拒绝 - 在端口 8083 上运行的应用程序无法访问端口 3000 上的其他应用程序

转载 作者:行者123 更新时间:2023-12-02 18:08:03 24 4
gpt4 key购买 nike

我必须使用 Spring Boot 使用外部休息 API(使用 restTemplate.exchange)。我的 REST API 在端口 8083 上运行,URL 为 http://localhost:8083/myrest (Docker 命令:docker run -p 8083:8083 myrest-app)

外部 API 以公共(public) docker 镜像的形式提供,在命令下面运行后,我可以在本地拉取并运行它。

 docker pull dockerExternalId/external-rest-api docker
run -d -p 3000:3000 dockerExternalId/external-rest-api

a) 如果我输入外部 rest API URL,例如 http://localhost:3000/externalrestapi/testresource直接在 chrome 中,然后我得到有效的 JSON 数据。

b)如果我使用来自 eclipse(Spring Boot 应用程序)的 myrest 应用程序调用它,我仍然得到有效的 JSON 响应。 (我正在使用 Windows 平台进行测试)

c) 但是如果我在 Docker 上运行它并执行 myrest 服务(比如 http://localhost:8083/myrest ),那么我将面临 java.net.ConnectException: Connection refused
更多详情:
org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:3000/externalrestapi/testresource": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)

P.S - 我在 Windows 上使用 Docker。

最佳答案

# 问题

你运行:

docker run -p 8083:8083 myrest-app

但是你需要像这样运行:
docker run --network "host" --name "app" myrest-app

所以通过标志 --network有值 host将允许您的容器访问您的计算机网络。

请忽略我的第一种方法,而是使用不将容器暴露给整个主机网络的更好的替代方法......可以使它工作,但不是最佳实践。

更好的选择

创建一个供两个容器使用的网络:
docker network create external-api

然后运行带有 --network external-api 标志的两个容器.
docker run --network "external-api" --name "app" -p 8083:8083 myrest-app


docker run -d --network "external-api" --name "api" -p 3000:3000 dockerExternalId/external-rest-api

标志的使用 -p发布 api 的端口仅当您想从计算机浏览器访问容器时才需要容器,否则只需将它们排除在外,因为 2 个容器在 external-api 中进行通信不需要它们。网络。

TIP: docker pull is not necessary, once docker run will try to pull the image if does not found it in your computer. Let me know how it went...



调用外部 API

因此,在这两种解决方案中,我都添加了 --name标记,以便我们可以到达网络中的另一个容器。

因此,要从我的 rest 应用程序访问外部 api,您需要使用 url http://api:3000/externalrestapi/testresource .

请注意我如何替换 localhost通过 api--name 的值匹配在 docker run 命令中为您的外部 api 标记。

关于rest - Docker : java.net.ConnectException:连接被拒绝 - 在端口 8083 上运行的应用程序无法访问端口 3000 上的其他应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54692666/

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