将 docker 图像中的 TLD 路由到 127.0.0.1

Routing TLD in docker image to 127.0.0.1

前言

我的 rails 应用关心主机名。因此,例如,当请求来自 domain-a.dev 时,它的行为不同于请求来自 domain-b.dev 时的行为。我想测试此行为,因此已将完整的 *.dev TLD 路由到本地计算机上的 127.0.0.1,因此我可以将测试中的服务器域设置为我想要的,但它始终使用我的本地机器测试服务器。

这是必要的,因为我的测试使用 selenium,它启动外部浏览器并浏览到 domain-a.devdomain-b.dev。所以我不能简单地在我的测试中覆盖 request.hostname (或左右),因为这对外部浏览器没有影响。

现在我想使用docker 镜像进行测试,所以我不必在多台服务器上配置测试环境,只需启动docker 镜像即可。到目前为止一切正常,但 *.dev 解析。


AFAIK Docker 默认使用主机名称服务器或 google 名称服务器 (https://docs.docker.com/articles/networking/#dns),但这意味着更改主机的 dns 以实现我的目标,但我没有想要。

我想构建一个 docker 图像,其中一个特殊的 TLD,例如 dev,总是路由到 127.0.0.1 而不会触及 [=55] =]主机.

这意味着对于每个人 运行 这个 docker 图像,例如 domain.dev 将在容器内解析为 127.0.0.1。 (不仅 domain.dev,而且每个 *.dev 域。)。其他 TLD 应该照常工作。

我的一个想法是在容器内启动 dnsmasq,配置为将 *.dev 解析为 127.0.0.1 并将其余部分转发到通常的名称服务器。但我是 docker 的新手,不知道这是否太复杂或如何实现。

另一个想法可能是用特殊域的固定条目覆盖容器中的 /etc/hosts。但这意味着我必须更新 docker 容器,以防我想将新域解析为 127.0.0.1,如果域经常更改,这是一个缺点。

docker 专家怎么说?

我现在基本上是通过使用 http://xip.io/

来解决这个问题的

通过使用像 sub.127.0.0.1.xip.io 这样的 url,我可以连接到我的本地机器。我的应用程序只需要知道 127.0.0.1.xip.io 被视为 "top level domain",而 sub 是没有顶级域名的域名。 (例如,在 Rails 上的 Ruby 应用中,这可以通过调整 config.action_dispatch.tld_length = 6 来完成。

如果您使用 docker run 启动您的容器,您有 --add-host="" 参数,它接受写入容器 /etc/hosts 的主机名和 IP。

您的启动命令如下所示:

docker run -d --add-host="domain-a.dev:192.168.0.10" [...]

192.168.0.10 替换为您计算机的本地 IP 地址。

不要使用 127.0.0.1,因为 Docker 会将其解析为容器而不是您的计算机。