如何将我的 WSL docker 容器连接到 Windows 上的 Mariadb/MySql 本地实例?

Eri*_*ric 0 networking linux routing docker windows-subsystem-for-linux

我对如何设置从 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 项目能够与 Windows 安装的 MariaDB 进行通信。我的困惑是,在我的 docker 容器(centos)中,我可以设置我的 /etc/hosts 文件将域 local_db 指向 -> 127.0.0.1 但我相信这使得它只尝试在 docker 镜像中进行自我通信(其中当我访问该域时,不存在数据库实例。此外,在 Unbuntu 上我可以做同样的事情,但我不能确定它是否真的会在 Windows 上与正确的端口通信,或者它是否只是包含在 Ubuntu 中无法退出。

那么问题是,我如何不仅能够从 docker 容器到达/路由到 WSL,而且还能到达/路由到 Windows?

我的一些研究表明,我需要以某种方式使用 0.0.0.0 来“绑定到任何东西/所有东西”,但仅仅尝试使用它而不是 localhost(我相信各位专家都知道)被证明是不够的。

感谢您的指导!

Mos*_*atz 6

直接在 Windows 上安装 Docker Desktop 可能会获得更好的结果,而不是在 WSL 2 中的 Ubuntu 中安装 Docker。它仍然使用 WSL 2 来运行容器,但它与 Windows 集成得更好。

host.docker.internal具体来说,Docker Desktop 将主机名添加到名为解析主机的内部 DNS 解析器中。


您也可以在没有 Docker Desktop 的情况下执行此操作,但这非常烦人,因为每次启动容器时都需要再次执行此操作,并且重新启动时信息会发生变化。这是你必须做的(我没有实际测试过,但理论上它应该有效):

  1. 确保您使用的是 Docker 20.04 或更高版本。
  2. 在您的 Ubuntu 实例中,确定 Windows 的内部 IP 地址 - 运行route -n并找到“网关”地址。请注意,当您重新启动计算机时,此地址可能会更改。
  3. 使用以下两个附加参数启动 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。)