【问题标题】:Curl request from docker container to host timeout从 docker 容器到主机超时的 curl 请求
【发布时间】:2017-03-22 08:43:22
【问题描述】:

我遇到了一个 docker 问题,我认为这是由于我对 docker 网络的了解存在差距。

我有一个运行 nginx 和 php 的 docker 映像。暴露了必要的端口。这是我用来运行映像的简化命令。

docker run --name php-app -p 80:80 php-app

问题在于,对于安装设置,php 应用程序使用主机公共 IP 卷曲到自身。

例如, curl http://105.15.25.120/phpsetup.php?setup

这个 IP 似乎无法从容器内部访问,因为 curl 超时

curl -vvv 105.15.25.120
About to connect() to 105.15.25.120 port 80 (#0)
Trying 105.15.25.120...
Connection timed out
Failed connect to 105.15.25.120:80; Connection timed out
Closing connection 0
curl: (7) Failed connect to 105.15.25.120:80; Connection timed out

我可以从容器内部成功地 curl 到其他 IP,而不是主机的。

在主机上使用 curl 可以正常工作,并且不会导致任何奇怪的行为。

为了简单和测试,我使用官方 nginx 镜像重现了该行为,以帮助得出结论,这不是我自己的镜像的问题。

docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -p 80:80

根据我的研究,这似乎是一个路由问题?没有把握。

【问题讨论】:

  • 您的主机可能有防火墙规则,禁止来自 Docker 容器内部的连接。特别查看filter 表的INPUT 链中的规则。
  • 如何从容器内部知道宿主机的IP地址?启动容器时是否提供给容器?
  • 是的,通过 ENV 变量

标签: curl nginx docker docker-networking


【解决方案1】:

容器不应卷曲主机。它应该自己卷曲,因为它托管了您希望卷曲的内容。

curl http://127.0.0.1/phpsetup.php?setup

【讨论】:

  • 感谢您的回复。请问这是有意设计的吗?
  • 这是一个最佳实践。容器不应该关心主机或主机/上/关于主机的任何内容,而应该独立运行。 docker run 命令向容器提供的内容(数据卷、环境变量和其他位)是个例外
  • 还有办法让curl到主机IP吗?我知道这不是很好,但它涵盖了 php 应用程序中的边缘情况。
猜你喜欢
  • 2017-10-18
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
相关资源
最近更新 更多