作者:宝贝不哭522502903183 | 来源:互联网 | 2022-11-16 17:36
如何解决《Docker:java.net.ConnectException:连接被拒绝-在端口8083上运行的应用程序无法访问端口3000上的其他应用程序》经验,为你挑选了1个好方法。
我必须在Spring Boot中使用外部rest API(使用restTemplate.exchange)。我休息API在端口8083上运行带有URL 的http://本地主机:8083 / myrest(泊坞窗命令:docker run -p 8083:8083 myrest-app
)
外部API以公共docker映像的形式提供,在命令下运行后,我可以在本地拉并运行它。
docker pull dockerExternalId/external-rest-api docker
run -d -p 3000:3000 dockerExternalId/external-rest-api
a)如果我直接在chrome中输入外部rest API URL,例如http:// localhost:3000 / externalrestapi / testresource,那么我会获得有效的JSON数据。
b)如果我使用eclipse(春季启动应用程序)中的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)
PS-我在Windows上使用Docker。
1> Exadra37..:
# 问题
您运行:
docker run -p 8083:8083 myrest-app
但是您需要像这样运行:
docker run --network "host" --name "app" myrest-app
因此,将标志--network
与值一起传递host
将使您的容器可以访问您的计算机网络。
请忽略我的第一种方法,而是使用一种更好的替代方法,即不将容器暴露给整个主机网络……可以使其正常工作,但这不是最佳实践。
更好的选择
创建要由两个容器使用的网络:
docker network create external-api
然后使用flag运行两个容器--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
网络中进行通信不需要它们。
提示:不需要docker pull,一旦在您的计算机中找不到镜像,则docker run将尝试拉镜像。让我知道怎么回事...
调用外部API
因此,在这两种解决方案中,我都添加了--name
标志,以便我们可以访问网络中的另一个容器。
因此,要从我的rest应用访问外部api,您需要使用url http://api:3000/externalrestapi/testresource
。
请注意我如何取代localhost
被api
认为对的值相匹配--name
国旗在泊坞窗运行命令你的外部API。