我有两个Docker容器。
Testweb容器调用TestApi容器。主机可以从端口8080与TestWeb容器通信。主机可以使用8081与TestApi通信。
我可以让TestWeb在我的开发框中调用TestApi(Windows 10)但是当我将代码部署到AWS(ECS)时,我得到“未知主机”异常。两个容器都工作正常,我可以单独调用它们。但是当我调用一个方法在内部使用HttpClient对一个方法在Container2中进行Rest调用时,它会给出错误:
发送请求时发生错误。 ---> System.Net.Http.CurlException:无法解析主机名。
代码:
using (var client = new HttpClient())
{
try
{
string url = "http://testapi/api/Tenant/?i=" + id;
var response = client.GetAsync(url).Result;
if (response.IsSuccessStatusCode)
{
var responseContent = response.Content;
string responseString = responseContent.ReadAsStringAsync().Result;
return responseString;
}
return response.StatusCode.ToString();
}
catch (HttpRequestException httpRequestException)
{
return httpRequestException.Message;
}
}
以下是我尝试过的事情:
两个容器(TestWeb,TestAPI)在AWS ECS中位于相同的任务定义中。当我检查容器时,我得到每个容器的IP地址。我可以使用他们的IP地址从container1 ping容器2。但我无法ping使用container2名称。它给了我“未知主机”错误。
答案 0 :(得分:0)
AWS不使用Docker撰写,但提供了添加任务定义的界面。 需要一起通信的容器可以放在相同的任务定义中。然后我们还可以在links部分中指定将从当前容器调用的容器。可以在" Host"上为每个容器指定其容器名称。任务定义部分。一旦我将容器名称添加到" Host" field1,Test1(TestWeb)能够与Container2(TestAPI)进行通信。
答案 1 :(得分:0)
它似乎 ECS并未在幕后使用合法的docker-compose
,但是其实现确实支持Compose V2“ links”功能。
这是我组成文件的一部分,我刚刚在ECS上运行,它需要相同的功能并且遇到与您相同的“无法解析主机”错误。我添加的“链接”修复了我在Elastic Container Service上的主机名解析问题!
version: '3'
services:
appserver:
links:
- database:database
- socks-proxy:socks-proxy
这使我的应用服务器可以与database
和socks-proxy
主机名进行通信。格式为“ SERVICE:ALIAS”,可以将两者保持默认设置相同。
在您的示例中为:
version: '3'
services:
testapi:
links:
- testweb:testweb
testweb:
links:
- testapi:testapi