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正在你的本地机器上运行)。
我希望它有帮助