如何从 Docker 容器内部访问在 WSL2 上运行的服务?

don*_*tin 8 routes docker wsl-2

我正在使用 Windows 10 1909 并安装了 WSL2,使用 Ubuntu 20.04,19.03.13-beta2 docker 版本,使用 WSL2 选项为 Windows Edge 版本安装了 Docker。集成工作得非常好,但我有一个无法解决的问题。

在 WSL2 实例上,有一些服务正在运行,暴露了一些端口(3000、3001、3002...)。从其中一个 docker 容器,我需要访问特定开发场景(API 网关)的服务,而我无法开始工作。

我曾尝试直接使用 WSL2 IP 地址,但随后连接超时。我也尝试使用host.docker.internal,它解析为 WSL2 IP 地址以外的其他内容,但它仍然不起作用。

是否有我需要使用的特殊技巧,或者目前不支持这种路由,但会支持,还是由于其他原因不可能?

这说明了我想要实现的目标:

从 docker 容器访问 WSL2 服务

其他路由工作 - 即我可以从 Windows 浏览器访问来自 WSL2 内部 node.js 进程的所有服务端口,并且我还可以从 WSL2 内部和 Windows 访问容器中公开的服务端口。只是这个缺失的链接我无法工作。

fer*_*uis 12

所以你需要在Windows机器上做的事情是将你在WSL机器上运行的端口转发,这个脚本端口转发端口4000

netsh interface portproxy delete v4tov4 listenport="4000" # Delete any existing port 4000 forwarding
$wslIp=(wsl -d Ubuntu -e sh -c "ip addr show eth0 | grep 'inet\b' | awk '{print `$2}' | cut -d/ -f1") # Get the private IP of the WSL2 instance
netsh interface portproxy add v4tov4 listenport="4000" connectaddress="$wslIp" connectport="4000"
Run Code Online (Sandbox Code Playgroud)

在容器 docker run 命令上,您必须添加

--add-host=host.docker.internal:host-gateway
Run Code Online (Sandbox Code Playgroud)

或者如果您正在使用 docker-compose:

    extra_hosts:
      - "host.docker.internal:host-gateway"
Run Code Online (Sandbox Code Playgroud)

然后在容器内你应该能够卷曲到

curl host.docker.internal:4000
Run Code Online (Sandbox Code Playgroud)

并得到回应!


don*_*tin 6

其价值在于:如果您使用 WSL2 子系统 IP 地址,则此方案有效

如果使用,则不起作用-host.docker.internal此 DNS 别名是在容器中定义的,但它映射到 Windows 主机的 IP 地址,而不是 WSL2 主机的 IP 地址,并且返回 WSL2 主机内部的路由不起作用。

为什么这个(可能暂时)不起作用的原因有些不清楚 - 如果问题再次出现并且我设法找出实际问题可能是什么,我将重新审视这个答案。