我是Docker容器的新手,我遇到了以下问题。我正在开发一个网页,向暴露的api发出请求。它们都发布在通过网络链接的不同容器上。 这是我的docker-compose.yml文件:
version: '2'
services:
api:
image: my/api
networks:
- api
ports:
- "8080:5000"
container_name: api
web:
build:
context: ./DockerWeb
networks:
- api
ports:
- "80:5000"
container_name: web
networks:
api:
driver: bridge
我注意到如果我附加到运行我的网页的容器,我可以使用ping api
尝试对api容器进行任何Web服务调用时出现问题。我正在尝试初始化一个HttpClient对象,但是这样一个对象的BaseAddress属性必须设置为有效的Uri。
_client = new HttpClient();
_client.BaseAddress = new Uri(config.ApiUrl); //config.ApiUrl = "api"
这会引发以下错误
UriFormatException:无效的URI:无法确定URI的格式。
有没有办法要么a)以不同的方式公开容器名称,或者b)调用Web服务而不需要使用URI? 我怎么能做到这一点?
更新
我已更新ApiUrl以包含值http:api:8080
,但现在我在执行调用时遇到异常
System.AggregateException:发生了一个或多个错误。 (发送请求时发生错误。)---> System.Net.Http.HttpRequestException:发送请求时发生错误。 ---> System.Net.Http.CurlException:无法连接到服务器
我还尝试使用wget
直接从我的Web容器调用api端点wget http://api:8080/
但是我仍然收到错误:
连接到api(api)| 172.24.0.4 |:8080 ...失败:拒绝连接
这可能是API配置错误吗?
答案 0 :(得分:3)
api
只是主机名。如果您设置了SSL / TLS,则URI为http://api:8080
(或https://api:someotherport
。)
答案 1 :(得分:0)
这里有两种沟通方式:
容器网络>容器api
在这种情况下,确实可以使用主机名" api"连接到你的api。 如果您的html是在服务器端生成的,那么您就必须这样做。
网络客户端>容器api
然而,我想你正在使用某种JavaScript Web应用程序(Angular或其他)。在这种情况下,html(和调用)不是从Web容器创建的,而是直接从Web浏览器创建的。
所以在这种情况下你必须使用http://localhost:8080(我想Docker正在你的本地机器上运行)。
我希望它有所帮助
答案 2 :(得分:0)
内部端口用于docker网络内部的连接。所以在这种情况下,请求需要转到 http://api:5000