如何将 DNS 名称别名为 docker 容器内的 host.docker.internal?

问题描述 投票:0回答:2

TL;DR:如何让容器中的客户端与主机上的服务建立 HTTPS 连接?

我在本地开发计算机 (macOS) 上的虚拟机上运行了一项服务,该服务在端口 8443 上提供 HTTPS 服务;它有一个

dev.mycoolproject.com
的证书,并且
dev.mycoolproject.com
有一个指向 127.0.0.1 的
A
记录。 因此,如果我在本地计算机上运行客户端并将其指向
https://dev.mycoolproject.com:8443
,它将与我的本地服务建立安全连接。

我想在 docker 容器内运行我的客户端,并仍然连接到主机上的本地服务器。 但显然

dev.mycoolproject.com
指向 127.0.0.1 是行不通的,而且我不能只使用
/etc/hosts
来重定向它,因为主机的 IP 是动态的。 我可以通过
host.docker.internal:8443
访问本地服务器,但我会收到 TLS 错误,因为主机名不匹配。

有什么方法可以让docker的DNS将

dev.mycoolproject.com
映射到主机IP吗?我考虑在容器中本地运行 dnsmasq,但我无法使其正常工作。

docker dns
2个回答
10
投票

在容器中,您可能无法访问

dig
nslookup
等工具,并且不想安装另一个 55MB 软件包(如 debian 的 dnsutils)只是为了获取
host.docker.internal
IP,最好使用
 getent
代替
dig

getent hosts host.docker.internal | awk '{ print $1 }'

5
投票

我昨天遇到了类似的问题,并想出了一个解决方法,添加一个条目到

/etc/hosts
解析主机 IP。

您需要

dig
或其他DNS工具来查询IP。

如果您以 root 身份运行,您可以使用:

echo "$(dig +short host.docker.internal) dev.mycoolproject.com" >> /etc/hosts

如果你有 sudo 你可以运行:

echo "$(dig +short host.docker.internal) dev.mycoolproject.com" | sudo tee -a /etc/hosts

最初我希望

--add-host
运行选项允许在主机ip参数中使用特殊的docker条目(如
host.docker.internal
),但不幸的是他们没有。

我想避免更多的容器配置,所以我选择了这个。设置

dnsmasq
将是一个更稳定的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.