假设我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.com
host-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
。该过程如下所示:
你的 PHP 代码调用类似
curl host-subdomain.mydomain.com
curl
查找名字host-subdomain.mydomain.com
curl
找到地址(例如)100.64.0.100curl
打开与 100.64.0.100 的连接内核寻找到该地址的路由
在容器内部,路由表如下所示:
default via 172.17.0.1 dev eth0 172.17.0.0/16 dev eth0 scope link src 172.17.0.2
由于容器没有到 100.64.0.100 的直接路由,因此它使用默认路由,该路由对应于主机上的 docker bridge。
主机上的应用程序会看到来自 docker bridge 的带有容器 IP 地址的连接。
在所有这些步骤中,连接都是从容器 IP 地址到的解析地址host-subdomain.mydomain.com
。
你有这个:
您的容器 ( 172.20.0.2
) 通过其默认路由 ( ) 路由到主机地址(本例中为“100.64.0.100”)172.20.0.1
。您的主机有一条到容器的路由(通过接口br-1234
)。