Windows10 本地只能通过 localhost 访问 WSL2 容器?

2020-05-13 11:47:53 +08:00
 cai314494687
这两天搭建了 WSL2 环境,在里面安装好了 docker 和 laradock,localhost 可以成功访问,但是配置的 nginx sites 之后使用域名方式访问 WSL2 容器,一直没成功,提示 ERR_CONNECTION_REFUSED,查了半天资料也没看到解决方案,是我姿势不对还是本身就不支持这种方式?
17614 次点击
所在节点    程序员
43 条回复
laogui
2020-05-13 12:11:56 +08:00
上次用了 2 发现不能用 IP 访问,还是继续用 1 了,懒得折腾了。
cai314494687
2020-05-13 12:21:57 +08:00
@laogui https://github.com/microsoft/WSL/issues/4210 刚才通过这个成功解决了问题 😊
forrestshuang
2020-05-13 16:20:51 +08:00
我写了一个脚本可以。 通过 访问 wsl.ip 在 windows10 和 wsl2 相互访问。
wsl 里可以通过 wsl.ip 访问 windows 的端口,windows 里面浏览器也可以通过 wsl.ip 访问 wsl2 里面的端口

https://gist.github.com/Double1996/6a2178313b44c6bbdc90f0b9f881981a

```bash
sudo python3 wsl_ip.py
```
noe132
2020-05-13 16:21:55 +08:00
wsl2 的端口转发只有本地有效。
cai314494687
2020-05-13 18:27:27 +08:00
@forrestshuang 请问你这个要用管理员权限的终端执行吗?
Yourshell
2020-05-13 18:41:24 +08:00
docker 容器端口映射有时侯会不成功但是没有任何提示。
iccfish
2020-05-13 19:11:14 +08:00
是的。WSL2 的容器端口在宿主访问只有两种方式,一种是`localhost`,是且只能是`localhost`,不能妄图用解析后的`127.0.0.1`或`::1`来取而代之;第二种是用 WSL2 机器的自己私有 IP 。

加上 WSL2 资源消耗大、启动慢(虽然也只有几秒钟,但是比 WSL1 慢多了),所以不是必须用 WSL2 (比如 Docker )的场合,我都选择用 WSL1 。我的默认实例也是 WSL1 。
cai314494687
2020-05-13 22:17:11 +08:00
@iccfish 我没用过 WSL1,顺便请教一下,相比 WSL1,WSL2 有什么优势吗?
jim9606
2020-05-13 23:18:20 +08:00
@cai314494687
WSL2 是调整过的虚拟机,用 hyper-V 运行,所以宿主和 wsl2 的通信是通过一个内部 hyper-v vswitch 进行的,host 和 wsl2 会有不同的 IP ;而且开了之后跟部分虚拟机软件冲突。但因为跑的是真正的 linux 内核,所以大部分内核功能都能用(最典型的就是 docker 所依赖的 cgroup )。
因为我用 wsl 是为了那些 shell 实用工具或者跑些小程序编译,不追求 IO 性能,所以我用 wsl1 。
sola97
2020-05-14 02:33:13 +08:00
有没有人遇在暴露 UDP 端口的时候,Docker 内外端口不一致导致 UDP 转发失败,在搞 ss 客户端的时候发现的
levelworm
2020-05-14 03:23:06 +08:00
@forrestshuang 求问怎么在编辑器里头输入代码块?多谢
linxl
2020-05-14 09:24:51 +08:00
要咋知道自己使用的 wsl 是 1 还是 2 ?
forrestshuang
2020-05-14 09:31:00 +08:00
@cai314494687 当然啊,你要改 host
forrestshuang
2020-05-14 09:31:43 +08:00
@linxl wsl -l
cai314494687
2020-05-14 10:02:26 +08:00
@forrestshuang #13 我知道要改 host,我只是不知道的是 WSL2 不是静态 IP,而是动态 IP
cai314494687
2020-05-14 10:04:28 +08:00
@linxl #12 wsl -l -v
cai314494687
2020-05-14 10:05:55 +08:00
@forrestshuang #13 抱歉,刚才那个回复,没看上下文,请忽略。
qiyuey
2020-05-14 10:44:01 +08:00
hyper-v 的保留端口才是大坑,导致 8080,3306 等端口提示被占用,但是通过命令行查询不到使用该端口的进程
iccfish
2020-05-14 12:50:32 +08:00
@jim9606 主要是内核功能都能用;至于性能差异,你这说的不对。

1. WSL1 的 IO 性能要远高于 WSL2,因为 WSL2 走的是 9P 协议,而 WSL1 用的是 lxfs,性能更高(差异非常明显,比如你用的是 zsh 加自动补全,那在 /mnt/c 下,WSL1 接近可用,而 WSL2 会非常卡)。我测试下来,WSL1 下,访问 NTFS 分区的性能,WSL1 接近于原生速度( NVME 的硬盘,写入速度接近 1GB/S ),但是在 WSL2 下就只有 97.3M/S (数据见后)
2. WSL2 的 CPU 性能比 WSL1 高,因为不用经过内核转换(但是实际看起来不是特别明显),在 CPU 密集型的应用下会有影响,比如编译

WSL1 下测试磁盘性能和结果:
time dd if=/dev/zero of=/mnt/c/TEMP/wsl bs=8k count=100000
100000+0 records in
100000+0 records out
819200000 bytes (819 MB, 781 MiB) copied, 0.829945 s, 987 MB/s
dd if=/dev/zero of=/mnt/c/TEMP/wsl bs=8k count=100000 0.11s user 1.42s system 99% cpu 1.538 total

WSL2 下测试磁盘性能和结果:
time dd if=/dev/zero of=/mnt/c/TEMP/wsl bs=8k count=100000
100000+0 records in
100000+0 records out
819200000 bytes (819 MB, 781 MiB) copied, 8.41766 s, 97.3 MB/s
dd if=/dev/zero of=/mnt/c/TEMP/wsl bs=8k count=100000 0.34s user 1.32s system 19% cpu 8.479 total
iccfish
2020-05-14 12:59:07 +08:00
@jim9606 补充一下就是,由于 WSL2 是真正的 linux 文件系统,所以这下面的原生( WSL2 内文件)性能以及权限这些要比 WSL1 好,上面说的是互通访问,即 WSL 里访问宿主机的文件系统。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/671206

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX