docker 容器之间的 TCP 连接在约 10000 个连接后超时

docker 容器之间的 TCP 连接在约 10000 个连接后超时

我在 docker-compose.yml 文件中定义了 2 个容器,并使用它们在 CI 管道中运行一些 rspec 测试 - 第一个容器执行测试,第二个容器是配置为执行许多不同路径的重定向的 nginx 容器...但是在执行它们时我遇到了一些意外行为。

测试包含大约 12000 个 URL,第一个容器对每个 URL 向 nginx 容器执行 GET 请求,检查它是否重定向到预期位置。

当成功检查了大约 10000 个 URL 时,奇怪的事情发生了 - 其余尝试连接到 nginx 容器的连接因读取超时而终止。查看 nginx 日志发现它认为一切正常;它在读取超时之前提供预期的响应,然后第一个失败的测试 URL 将有 2 个条目,之后则没有。过了那个点,网络连接就停止工作了。

当我docker-compose up在本地机器上执行时,测试通过,一切顺利。当我尝试在我的 CI 代理之一上使用相同的 docker-compose.yml 运行相同的命令时,我们遇到了上述问题 - 约 10000 次测试成功,然后容器之间的读取超时。

到目前为止,我已经尝试重新定义测试,以便请求不会在 10 秒内全部到达 nginx(例如,每个请求之间延迟 0.05 秒,或每 100 个请求延迟 1 秒等)...我预计这可能会给 docker 时间来回收一些连接,但它所做的只是使构建在同一点失败的时间更长。我还确保最新版本的 docker 正在我的 CI 代理上运行(18.09),因为我看到一些 github 问题描述了我认为与我类似的问题,并且通过将 docker 升级到当前版本解决了 - 似乎不是我的情况。

我只是不确定下一步该去哪里找——我已经用最新的docker升级了CI代理,并多次重新定义了测试,我不知道是什么原因导致了这种情况。这肯定与docker有关,因为在docker环境之外一切都运行正常,但docker日志似乎也没有显示任何意外情况。

我的问题是:以前有人遇到过这种事情吗?我下一步应该去哪里寻找根本原因?

提前致谢。

答案1

好的,原来问题出在 docker-composer 上,具体来说是这个问题:https://github.com/docker/compose/issues/6018

通过将所有 nginx 的日志输出定向到 /dev/null 而不是 stdout/stderr,可以解决这个问题

相关内容