我有点搞不懂如何设置从 WSL docker 容器内部到 Windows 上的路由。我应该注意,我故意不使用 Docker Desktop。
场景如下:
我在 Windows 10 机器上安装了 MariaDB,其标准 IP 和端口为 127.0.01:3306。
我有一个通过 WSL 2 从 Windows 商店 Ubuntu 20.04 LTS 安装了更新的 Ubuntu 实例。
在 Ubuntu 上,我安装了一个 docker 并且与正在运行的 Centos 容器一起工作。
我需要我的 PHP 项目能够与 MariaDB 的 Windows 安装进行通信。我感到困惑的是,在我的 docker 容器 (centos) 中,我可以将 /etc/hosts 文件设置为将域 local_db 指向 -> 127.0.0.1,但我相信当我访问该域时,它只会尝试在 docker 映像本身内进行通信(其中不存在数据库实例)。此外,在 Unbuntu 上我可以做同样的事情,但我不能确定它是否真的会在 Windows 上与正确的端口通信,或者它是否只是包含在 Ubuntu 内部而无法退出。
那么问题是,我如何才能不仅从我的 Docker 容器到达/路由到 WSL,而且还能到达/路由到 Windows?
我的一些研究表明,我需要以某种方式使用 0.0.0.0 来“绑定到任何事物/所有事物”,但简单地尝试使用它而不是本地主机,我相信专家知道,这被证明是不够的。
谢谢您的指导!
答案1
与在 WSL 2 中的 Ubuntu 中安装 Docker 相比,直接在 Windows 上安装 Docker Desktop 可能会获得更好的效果。它仍然使用 WSL 2 来运行容器,但它与 Windows 的集成效果更好。
host.docker.internal
具体来说,Docker Desktop 会将主机名添加到名为解析主机的内部 DNS 解析器中。
您可能也可以不使用 Docker Desktop 来执行此操作,但这非常烦人,因为每次启动容器时都需要再次执行此操作,并且重新启动时信息会发生变化。以下是您需要执行的操作(我还没有实际测试过,但理论上应该可行):
- 确保您使用的是 Docker 20.04 或更新版本。
- 在您的 Ubuntu 实例中,确定 Windows 的内部 IP 地址 - 运行
route -n
并找到“网关”地址。请注意,当您重新启动计算机时此地址可能会发生变化。 - 使用以下两个附加参数启动您的 Docker 容器:
--add-host=host.docker.internal:<THE_GATEWAY_IP_ADDRESS_YOU_FOUND_BEFORE> --net=host
。这将使您的容器能够host.docker.internal
连接到 Windows 服务。
(请注意,您不能使用--add-host=host.docker.internal:host-gateway
许多教程中印刷的内容,因为这将指向 WSL 中的 Ubuntu,而不是 Windows。)