为什么 Docker 中的 curl 对同一主机中的子域使用私有 IP 地址?

为什么 Docker 中的 curl 对同一主机中的子域使用私有 IP 地址?

假设我docker-subdomain.mydomain.com指向 Docker 容器中的一个网站,并host-subdomain.mydomain.com指向主机本身中的一个网站。这两个网站都位于同一个主机和 IP 地址中。

当 Docker 内部的 PHP 代码docker-subdomain.mydomain.com调用并记录调用者的 IP 地址curl时,它似乎是一个以“172.”开头的 IP 地址,这意味着它是 Docker 容器的私有 IP 地址。host-subdomain.mydomain.comhost-subdomain.mydomain.com

我想知道私有 IP 地址是如何使用的,如果 DNShost-subdomain.mydomain.com是公共 IP,那么我认为它会使用外部接口进行连接?(就像当 PHP 脚本curl在主机本身中执行时发生的情况一样,在 Docker 之外)

Docker如何知道host-subdomain.mydomain.com指向同一台主机?

--

笔记:我并不是在问如何绕过/改变这种行为 - 我只是好奇,因为它正在做我想要它做的事情,但我不明白为什么。

答案1

我想知道私有 IP 地址是如何使用的,如果 host-subdomain.mydomain.com 的 DNS 是公共 IP,那么我认为它会使用外部接口进行连接?

您正在查看客户,而不是要连接的 IP 地址 curl。该过程如下所示:

  1. 你的 PHP 代码调用类似curl host-subdomain.mydomain.com

  2. curl查找名字host-subdomain.mydomain.com

  3. curl找到地址(例如)100.64.0.100

  4. curl打开与 100.64.0.100 的连接

  5. 内核寻找到该地址的路由

  6. 在容器内部,路由表如下所示:

    default via 172.17.0.1 dev eth0
    172.17.0.0/16 dev eth0 scope link  src 172.17.0.2
    
  7. 由于容器没有到 100.64.0.100 的直接路由,因此它使用默认路由,该路由对应于主机上的 docker bridge。

  8. 主机上的应用程序会看到来自 docker bridge 的带有容器 IP 地址的连接。

在所有这些步骤中,连接都是容器 IP 地址的解析地址host-subdomain.mydomain.com


你有这个:

在此处输入图片描述

您的容器 ( 172.20.0.2) 通过其默认路由 ( ) 路由到主机地址(本例中为“100.64.0.100”)172.20.0.1。您的主机有一条到容器的路由(通过接口br-1234)。

相关内容