Docker 提示 - 如何在 macOS、Windows 和 Linux 上的 Docker 容器中使用主机的 IP 地址
!/bin/sh
有时,您可能需要 Docker 主机的 IP 地址。例如,您需要能够从 Docker 容器内部连接到主机网络,以访问在主机上本地运行的应用程序或数据库。在主机上运行调试或反向代理是另外两个示例用例。
我将向您展示如何轻松地使其同时在 macOS、Windows 和 Linux 上运行 - 因为它们的 docker 网络设置不同。
macOS 和 Windows 上的 Docker 网络与 Linux 上的 Docker 网络
对于 macOS 和 Windows,可以使用以下特殊 DNS 名称:
主机的 IP 地址会不断变化(如果没有网络访问权限,则为零)。从 18.03 版本开始,我们建议连接到一个特殊的 DNS 名称
host.docker.internal
,该名称会解析为主机使用的内部 IP 地址。此方法仅用于开发目的,不适用于 Docker Desktop for Mac/Windows 以外的生产环境。网关也可以通过 访问
gateway.docker.internal
。来源:https
://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds来源:https ://docs.docker.com/docker-for-windows/networking/#use-cases-and-workarounds
172.17.0.1
在 Docker for Linux 上,如果您使用默认网络,则Docker 主机和桥接网络之间的网关的 IP 地址是。
你看出问题了吗?它们之间是不同的,所以你不能简单地运行docker-compose up -d
,让所有操作系统都表现得一样。不过我已经帮你解决了,有一个简单的方法可以解决这个问题。
设置docker-compose
我看到过一些建议,比如创建一个特定于 Linux 的配置文件docker-compose.override.yml
(docs),但我的同事提出的解决方案对我来说似乎更优雅、更简单。
# docker-compose.yml
version: '3.7'
services:
app:
image: your-app:latest
ports:
- "8080:8080"
environment:
DB_UPSTREAM: http://${DOCKER_GATEWAY_HOST:-host.docker.internal}:3000
那么,这里发生了什么?DB_UPSTREAM
应该指向主机的 IP 和端口 3000。${DOCKER_GATEWAY_HOST:-host.docker.internal}
这是这里的关键部分。这个表达式告诉 docker-compose 在解析这个值时,是使用环境变量DOCKER_GATEWAY_HOST
还是使用 fallback 机制host.docker.internal
。
在 macOS 和 Windows 上,它现在都可以开箱即用,无需执行任何操作。🚀
如果您在 Linux 上运行此堆栈,则需要DOCKER_GATEWAY_HOST
为 Docker 网关主机设置环境变量。只需将以下行添加到您的.bashrc
(.bash_profile
或.zshrc
) 中:
export DOCKER_GATEWAY_HOST=172.17.0.1
现在,您可以从 macOS、Windows 和 Linux 启动堆栈,无需进一步配置或覆盖。如果您像我们一样坚持这种模式,那么它适用于您公司的每个项目。
太棒了,不是吗?希望这能帮你节省点时间!
参考
- compose-file#extra_hosts
/etc/hosts
:在构建时在容器内部创建带有 IP 地址和主机名的条目。
>> 让我们在 Twitter 上联系🐦:https://twitter.com/natterstefan <<
文章来源:https://dev.to/natterstefan/docker-tip-how-to-get-host-s-ip-address-inside-a-docker-container-5anh