如何在 docker 容器内将 DNS 名称别名为 hosts.docker.internal?

Emo*_*ses 5 dns docker

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

我在本地开发机器 (macOS) 的 VM 上运行了一项服务,该服务在端口 8443 上提供 HTTPS;它有一个证书dev.mycoolproject.comdev.mycoolproject.com有一个A指向 127.0.0.1的记录。因此,如果我在本地计算机上运行我的客户端并将其指向它,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 但我无法让它工作。

dpr*_*dpr 10

在容器中,您可能无法访问dig或 等工具nslookup,并且不想安装另一个 55MB 软件包(例如 debian 的 dnsutils)只是为了获取 IP,host.docker.internal最好使用getent以下命令dig

getent hosts host.docker.internal | awk '{ print $1 }'
Run Code Online (Sandbox Code Playgroud)


tgt*_*gtb 5

我昨天遇到了类似的问题,并想出了一个解决方法,添加一个条目来/etc/hosts解析主机 IP。

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

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

echo "$(dig +short host.docker.internal) dev.mycoolproject.com" >> /etc/hosts
Run Code Online (Sandbox Code Playgroud)

如果你有 sudo 你可以运行:

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

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

我想避免更多的容器配置,所以我选择了这个。设置dnsmasq将是一个更稳定的解决方案。