在本地解析Docker主机名时HttpClient花费太多时间

时间:2018-06-20 23:06:34

标签: asp.net docker asp.net-core docker-networking docker-for-windows

我们在Windows Server 16上使用Docker,但未更新1709。我们正在Docker容器中运行多个.Net-Core项目,并刚刚开始使用.Net Standard上的Selenium在这些容器上运行UI测试。我们在本地而不是在容器内运行这些测试。

我们正在使用docker-compose运行容器。撰写文件由多个服务组成,类似于以下内容:

web:
 image: web
 build:
  context: ./Web/Web
  dockerfile: Dockerfile
 hostname: web

simulator:
 image: simulator
 build:
  context: ./simulator/simulator
  dockerfile: Dockerfile
 hostname: simulator

在测试中,我们使用模拟器通过发布请求并使用REST获得对适当控制器的响应来模拟电子邮件激活和电话验证。我们尝试为此使用HttpClient和Refit。测试运行太慢。因此,我们在寻找提高速度的方法。

然后,我们将问题缩小到DNS。当我们使用在组合文件中定义的主机名时,一个简单的getAsync请求将花费大约24秒的时间来运行。当我们使用容器IP地址时,只需几毫秒。

澄清一下,这很慢:

var client = new HttpClient ("http://Simulator");
var result = client.GetAsync("controller/action");

这很快:

var client = new HttpClient ("http://172.32.40.1");  //containerIp
var result = client.GetAsync("controller/action");

此外,当我们尝试使用带有获取请求的HttpClient连接到google.com时,仍然只需要毫秒。因此,仅当我们解析docker容器的IP时,才会出现DNS问题。该问题如何解决?我既不是网络专家,也不是Docker专家,您能告诉我在哪里看吗?这是另一个WS-not-1709问题吗?

编辑:另一种情况,如果我在不处理HttpClient的情况下进行遍历,则第一个调用很慢,但随后的调用又很快。

for (int i = 0; i<SOME_LOOP_COUNT) {
    var client = new HttpClient ("http://simulator");   //slow when i == 0
    var result = client.GetAsync("controller/action");
}

1 个答案:

答案 0 :(得分:1)

使用Docker嵌入式DNS服务器“ 127.0.0.11”设置DNS解析器

更多信息Docker docLinux doc