将应用程序从主机移动到 docker 会使 HTTP 延迟增加 5 秒

Moving app to docker from host increases HTTP lag by 5 seconds

我注意到我有一个应用程序在发出传出 HTTP 请求时表现不佳(额外延迟 5 秒)。通过大量试验/测试,我意识到将应用程序从 docker 移到主机中可以消除奇怪的 HTTP 延迟。

我正在为 docker 图像使用 alpine linux,并且 ubuntu 正在托管父计算机。

Docker 信息:

Docker 版本 1.11.2,构建 b9f10c9

      "NetworkSettings": {
        "Bridge": "",
        "SandboxID": "3ab81b8a66a99c6e9b1a1f49c5410d8260db37eee96c9231c0d83c1b40f84fa5",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": {
            "8084/tcp": null
        },
        "SandboxKey": "/var/run/docker/netns/3ab81b8a66a9",
        "SecondaryIPAddresses": null,
        "SecondaryIPv6Addresses": null,

        "EndpointID": "464acfb299941bbd301051ea05451823a7e527161185570c00f8569ce2afde88",
        "Gateway": "172.17.0.1",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "172.17.0.3",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "MacAddress": "02:42:ac:11:00:03",
        "Networks": {
            "bridge": {
                "IPAMConfig": null,
                "Links": null,
                "Aliases": null,
                "NetworkID": "32ebc75bc4c98106c6775905906723405c58bc3de914283234a8e1273cba7193",
                "EndpointID": "464acfb299941bbd301051ea05451823a7e527161185570c00f8569ce2afde88",

                "Gateway": "172.17.0.1",
                "IPAddress": "172.17.0.3",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "MacAddress": "02:42:ac:11:00:03"
            }
        }
    }

我 运行 docker 没有任何花哨的容器:

docker run -d test

我的代码 (python) 乘以整个请求周期所需的时间:

now = datetime.now()
response = http.request('POST', url, body=request_body, headers=headers)

print(
    "\nTotal Time: ",
    (datetime.now() - now).total_seconds()
)

固定时间是5-6秒,在容器外,不到一秒。

我进行了演练以从容器内部检查 DNS 和 tcpdump。从那里报告似乎没有什么有趣的。 DNS 看起来不错,数据包捕获报告 0.2 秒的请求时间。

我从数据包捕获中发现的唯一有趣的事情是,从调用 http.request 开始,需要 5 秒才能看到数据包的开头。

我确信这里某处存在 docker 网络配置错误。如果我需要添加更多信息,请告诉我。我们正在为 20 个其他服务使用 docker 而没有这个问题。

谢谢!

我不知道你是否还需要这些信息。我们已经看到类似的情况,通过升级 Docker.

解决了

不知道问题的原因导致我做了一点挖掘,我发现了这个:

https://github.com/docker/docker/issues/20661

简而言之,它与 docker 在尝试对 ipv4 执行相同操作之前尝试解析 ipv6 dns 有关。读一读。你可能比我更明白。

希望对你有所帮助