将 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.dev
或 domain-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 会将其解析为容器而不是您的计算机。
前言
我的 rails 应用关心主机名。因此,例如,当请求来自 domain-a.dev
时,它的行为不同于请求来自 domain-b.dev
时的行为。我想测试此行为,因此已将完整的 *.dev
TLD 路由到本地计算机上的 127.0.0.1
,因此我可以将测试中的服务器域设置为我想要的,但它始终使用我的本地机器测试服务器。
这是必要的,因为我的测试使用 selenium
,它启动外部浏览器并浏览到 domain-a.dev
或 domain-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 会将其解析为容器而不是您的计算机。