卷曲挂在docker中,但不在主机上

Tob*_*lor 5 ubuntu networking tcp google-bigquery docker

我们目前遇到一个问题,curl bigquery.googleapis.com有时会无限期地挂在ubuntu:20.04本地 docker 容器内,但在主机 macOS 计算机和生产环境中始终可以工作(返回 404)。该容器正在运行 Python Flask 应用程序。

一些观察结果:

  • 它很不稳定,curl bigquery.googleapis.com在容器初始化时可以工作,但大约 10 分钟后再次尝试会挂起。最终,该命令将再次运行并curl -v显示它正在尝试连接到不同的 IP。
  • 我们在生产或任何主机上都没有这个问题。
  • 我们团队中的不同人员在不同时间、不同 IP 上遇到该问题。
  • 在此问题期间,与其他谷歌服务(例如curl servicemanagement.googleapis.com)的连接工作正常。
  • 在此问题期间,该命令在另一个具有不同映像的 docker 容器中运行。
  • 许多 macOS Docker 版本都出现了问题。
  • 直接卷曲到 IPv4 地址也会挂起。

有趣的是,netstat在主机上执行将所有连接显示为ESTABLISHED,但netstat在容器内执行将它们显示为SYN_SENT

我们假设连接在主机上保持活动状态,但在容器中被终止。或者,由于某种原因,某些 ACK 没有正确转发到容器。

netstat在 macOS 上 容器内的netstat

netstat容器内 主机上的 netstat

TCP 转储 TCP 转储

卷曲-v输出

root@cf8bd850e9ab:/code# curl -v bigquery.googleapis.com
*   Trying 142.251.35.170:80...
* TCP_NODELAY set
*   Trying 2607:f8b0:4006:81e::200a:80...
* TCP_NODELAY set
* Immediate connect fail for 2607:f8b0:4006:81e::200a: Cannot assign requested address
*   Trying 2607:f8b0:4006:81e::200a:80...
* TCP_NODELAY set
* Immediate connect fail for 2607:f8b0:4006:81e::200a: Cannot assign requested address
*   Trying 2607:f8b0:4006:81e::200a:80...
* TCP_NODELAY set
* Immediate connect fail for 2607:f8b0:4006:81e::200a: Cannot assign requested address
*   Trying 2607:f8b0:4006:81e::200a:80...
* TCP_NODELAY set
* Immediate connect fail for 2607:f8b0:4006:81e::200a: Cannot assign requested address
Run Code Online (Sandbox Code Playgroud)

附加输出:

小智 0

您可以在使用标志运行容器时指定 DNS --dns,也可以通过添加/etc/docker/daemon.json可能有助于解决问题的条目来配置它。