联网的docker容器

时间:2017-03-20 23:24:42

标签: c# docker asp.net-core-webapi docker-networking

我是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

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配置错误吗?

3 个答案:

答案 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