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

h4cxqtbf  于 2023-01-08  发布在  Docker
关注(0)|答案(4)|浏览(352)

我使用的是Windows 10 1909,安装了WSL 2,使用的是Ubuntu 20. 04,19. 03. 13-beta2 Docker版本,使用WSL 2选项安装了Docker for Windows Edge版本。集成工作得很好,但我有一个问题无法解决。
在WSL 2示例上,有一些服务正在运行,并公开了一些端口(3000、3001、3002...),我需要从其中一个Docker容器访问特定开发场景(API Gateway)的服务,但这无法实现。
我试过直接使用WSL 2 IP地址,但是连接超时了。我也试过使用host.docker.internal,它解析为WSL 2 IP地址以外的其他地址,但是仍然不起作用。
是否有特殊的技巧需要我拉,或者是这种路由目前不支持,但将是,或者这是由于一些其他原因不可能?
这说明了我正在努力实现的目标:

其他的路由也可以工作--也就是说,我可以从Windows浏览器访问来自WSL 2内部node.js进程的所有服务端口,也可以从WSL 2内部和Windows的容器访问公开的服务端口。

yiytaume

yiytaume1#

因此,您需要在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"

在container docker运行命令中,您必须添加

--add-host=host.docker.internal:host-gateway

或者如果您使用的是docker-compose:

extra_hosts:
      - "host.docker.internal:host-gateway"

在容器里你应该可以 curl 到

curl host.docker.internal:4000

然后得到回应!

r7knjye2

r7knjye22#

不管怎样:如果您使用WSL 2子系统IP地址,则此方案*有效。
如果您使用host.docker.internal,它
工作-这个DNS别名是在容器中定义的,但是它Map到Windows主机的IP地址,而不是WSL 2主机的IP地址,并且在WSL 2主机内部的路由不工作。
为什么这个(可能是暂时的)不起作用的原因有点不清楚-如果问题再次出现,我会重新考虑这个答案,我设法追踪实际的问题可能是什么。

ntjbwcob

ntjbwcob3#

我在最新的Docker桌面上遇到了这个问题。我把它回滚到4. 2,它工作了。

  • Docker桌面4.2
  • windows 19044.1466
  • Ubuntu 20.04

我有一个java服务在linux本地主机上运行(使用ifconfig命令访问IP地址),我的其他容器使用基于WSL2的引擎在docker桌面上运行,它可以使用IP地址与我的java服务通信。

lf5gs5x2

lf5gs5x24#

这听起来像是here讨论的问题。对我来说,唯一起作用的是用--net=host运行Docker容器,然后在容器中使用[::1]而不是localhost来访问在WSL中运行的其他容器。
例如,container 1使用docker run --net=host启动,然后像这样调用container 2:http://[::1]:8000/container 2(根据您的特定应用程序调整端口和路径)

相关问题