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,但我无法使其正常工作。
在容器中,您可能无法访问
dig
或 nslookup
等工具,并且不想安装另一个 55MB 软件包(如 debian 的 dnsutils)只是为了获取 host.docker.internal
IP,最好使用 getent
代替dig
:
getent hosts host.docker.internal | awk '{ print $1 }'
我昨天遇到了类似的问题,并想出了一个解决方法,添加一个条目到
/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
将是一个更稳定的解决方案。