networkingDocker容器上的HttpClient请求

我是新的docker集装箱和进出口遇到以下问题。 我正在开发一个网页,请求暴露的API。 它们都发布在通过networking链接的不同容器上。 这是我的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容器,没有任何问题,使用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? 我怎样才能做到这一点?

UPDATE

我更新了ApiUrl以包含值http:api:8080 ,但是现在我在执行调用时遇到exception

System.AggregateException:发生一个或多个错误。 (发送请求时发生错误。)—> System.Net.Http.HttpRequestException:发送请求时发生错误。 —> System.Net.Http.CurlException:无法连接到服务器

我也尝试使用wget直接从我的Web容器调用API端点

 wget http://api:8080/ 

不过,我仍然收到一个错误:

连接到api(api)| 172.24.0.4 |:8080 …失败:连接被拒绝

这可能是一个APIconfiguration错误?

api只是主机名。 该URI将是http://api:8080 (或https://api:someotherport如果您设置了SSL / TLS)。

这里有两种沟通方式:

容器web>容器api

在这种情况下,的确可以使用主机名“api”连接到你的api。 这是如果你的HTML生成服务器端,你将不得不做的。

Web客户端>容器API

不过在这里,我想你正在使用某种JavaScript Web应用程序(Angular或其他)。 在这种情况下,HTML(和调用)不是从Web容器制作的,而是直接来自您的Web浏览器。

所以在这种情况下,你必须使用http:// localhost:8080 (我猜Docker正在你的本地机器上运行)。

我希望它有帮助