假设我docker-subdomain.mydomain.com
指向 Docker 容器中的网站,并host-subdomain.mydomain.com
指向主机本身中的网站。这两个网站都在相同的主机和 IP 地址中。
当 Docker 内部的 PHP 代码docker-subdomain.mydomain.com
调用,并记录调用者的 IP 地址时,它似乎是一个以“172.”开头的 IP 地址,这意味着它是 docker 容器的私有 IP 地址curl
。host-subdomain.mydomain.com
host-subdomain.mydomain.com
我想知道如何使用私有 IP 地址,如果 DNShost-subdomain.mydomain.com
是公共 IP,那么我认为它会使用外部接口进行连接?(就像当 PHP 脚本curl
在 Docker 外部的主机本身中执行时发生的那样)
Docker如何知道host-subdomain.mydomain.com
指向同一个主机?
--
注意:我不是在问如何绕过/改变这种行为——我只是好奇,因为它正在做我想做的事情,但我不明白为什么。
您正在查看客户端的 ip 地址,而不是正在连接的 ip 地址
curl
。该过程类似于:您的 PHP 代码调用类似
curl host-subdomain.mydomain.com
curl
查名字host-subdomain.mydomain.com
curl
找到地址(例如)100.64.0.100curl
打开到 100.64.0.100 的连接内核寻找到该地址的路由
在容器内部,路由表看起来像这样:
因为容器没有到 100.64.0.100 的直接路由,所以它使用默认路由,它对应于主机上的 docker 网桥。
您在主机上的应用程序会看到一个来自 docker 桥的连接,该连接具有容器的 ip 地址。
在所有这些步骤中,连接都是从容器 ip 地址到解析后的地址
host-subdomain.mydomain.com
。你有这个:
您的容器 (
172.20.0.2
) 通过其默认路由 ( ) 路由到主机地址(本例中为“100.64.0.100”)172.20.0.1
。您的主机有一个到容器的路由(通过接口br-1234
)。