Docker 提示 - 如何在 macOS、Windows 和 Linux 上的 Docker 容器中使用主机的 IP 地址 !/bin/sh

2025-06-07

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.ymldocs),但我的同事提出的解决方案对我来说似乎更优雅、更简单。

# 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
Enter fullscreen mode Exit fullscreen mode

那么,这里发生了什么?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
Enter fullscreen mode Exit fullscreen mode

现在,您可以从 macOS、Windows 和 Linux 启动堆栈,无需进一步配置或覆盖。如果您像我们一样坚持这种模式,那么它适用于您公司的每个项目。

太棒了,不是吗?希望这能帮你节省点时间!

参考


>> 让我们在 Twitter 上联系🐦:https://twitter.com/natterstefan <<

文章来源:https://dev.to/natterstefan/docker-tip-how-to-get-host-s-ip-address-inside-a-docker-container-5anh
PREV
🚀 每个 JavaScript 开发人员都应该掌握的 5 个高级 ES6 功能
NEXT
🦓 Zebras 在明暗模式下展示 Markdown 图片的指南 🚀