V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cai314494687
V2EX  ›  程序员

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

  •  
  •   cai314494687 ·
    forecho · 2020-05-13 11:47:53 +08:00 · 17566 次点击
    这是一个创建于 1637 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这两天搭建了 WSL2 环境,在里面安装好了 docker 和 laradock,localhost 可以成功访问,但是配置的 nginx sites 之后使用域名方式访问 WSL2 容器,一直没成功,提示 ERR_CONNECTION_REFUSED,查了半天资料也没看到解决方案,是我姿势不对还是本身就不支持这种方式?
    43 条回复    2020-10-16 09:35:25 +08:00
    laogui
        1
    laogui  
       2020-05-13 12:11:56 +08:00 via Android
    上次用了 2 发现不能用 IP 访问,还是继续用 1 了,懒得折腾了。
    cai314494687
        2
    cai314494687  
    OP
       2020-05-13 12:21:57 +08:00
    @laogui https://github.com/microsoft/WSL/issues/4210 刚才通过这个成功解决了问题 😊
    forrestshuang
        3
    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
        4
    noe132  
       2020-05-13 16:21:55 +08:00
    wsl2 的端口转发只有本地有效。
    cai314494687
        5
    cai314494687  
    OP
       2020-05-13 18:27:27 +08:00
    @forrestshuang 请问你这个要用管理员权限的终端执行吗?
    Yourshell
        6
    Yourshell  
       2020-05-13 18:41:24 +08:00 via iPhone
    docker 容器端口映射有时侯会不成功但是没有任何提示。
    iccfish
        7
    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
        8
    cai314494687  
    OP
       2020-05-13 22:17:11 +08:00
    @iccfish 我没用过 WSL1,顺便请教一下,相比 WSL1,WSL2 有什么优势吗?
    jim9606
        9
    jim9606  
       2020-05-13 23:18:20 +08:00   ❤️ 1
    @cai314494687
    WSL2 是调整过的虚拟机,用 hyper-V 运行,所以宿主和 wsl2 的通信是通过一个内部 hyper-v vswitch 进行的,host 和 wsl2 会有不同的 IP ;而且开了之后跟部分虚拟机软件冲突。但因为跑的是真正的 linux 内核,所以大部分内核功能都能用(最典型的就是 docker 所依赖的 cgroup )。
    因为我用 wsl 是为了那些 shell 实用工具或者跑些小程序编译,不追求 IO 性能,所以我用 wsl1 。
    sola97
        10
    sola97  
       2020-05-14 02:33:13 +08:00
    有没有人遇在暴露 UDP 端口的时候,Docker 内外端口不一致导致 UDP 转发失败,在搞 ss 客户端的时候发现的
    levelworm
        11
    levelworm  
       2020-05-14 03:23:06 +08:00 via Android
    @forrestshuang 求问怎么在编辑器里头输入代码块?多谢
    linxl
        12
    linxl  
       2020-05-14 09:24:51 +08:00
    要咋知道自己使用的 wsl 是 1 还是 2 ?
    forrestshuang
        13
    forrestshuang  
       2020-05-14 09:31:00 +08:00
    @cai314494687 当然啊,你要改 host
    forrestshuang
        14
    forrestshuang  
       2020-05-14 09:31:43 +08:00
    @linxl wsl -l
    cai314494687
        15
    cai314494687  
    OP
       2020-05-14 10:02:26 +08:00
    @forrestshuang #13 我知道要改 host,我只是不知道的是 WSL2 不是静态 IP,而是动态 IP
    cai314494687
        16
    cai314494687  
    OP
       2020-05-14 10:04:28 +08:00
    @linxl #12 wsl -l -v
    cai314494687
        17
    cai314494687  
    OP
       2020-05-14 10:05:55 +08:00
    @forrestshuang #13 抱歉,刚才那个回复,没看上下文,请忽略。
    qiyuey
        18
    qiyuey  
       2020-05-14 10:44:01 +08:00   ❤️ 2
    hyper-v 的保留端口才是大坑,导致 8080,3306 等端口提示被占用,但是通过命令行查询不到使用该端口的进程
    iccfish
        19
    iccfish  
       2020-05-14 12:50:32 +08:00   ❤️ 1
    @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
        20
    iccfish  
       2020-05-14 12:59:07 +08:00
    @jim9606 补充一下就是,由于 WSL2 是真正的 linux 文件系统,所以这下面的原生( WSL2 内文件)性能以及权限这些要比 WSL1 好,上面说的是互通访问,即 WSL 里访问宿主机的文件系统。
    linxl
        21
    linxl  
       2020-05-14 13:25:14 +08:00
    @forrestshuang
    PS C:\Users\Administrator> wsl -l
    适用于 Linux 的 Windows 子系统:
    Ubuntu-18.04 (默认)

    结果如上,表示看不懂这是 wsl1 还是 2 。。
    iccfish
        22
    iccfish  
       2020-05-14 13:27:45 +08:00
    @linxl 要加 -v 参数:

    wsl -l -v
    NAME STATE VERSION
    * Ubuntu Running 1
    Ubuntu-20.04 Stopped 2
    linxl
        23
    linxl  
       2020-05-14 13:32:34 +08:00
    @iccfish 这个命令它只提示我 wsl 命令的各种选项,那估计我这个是 wsl1 了
    hakono
        24
    hakono  
       2020-05-14 14:29:09 +08:00
    wsl2 搞了这么多年,连个静态 ip 都不给,本来是想把工作从 Linux 上迁移到 wsl2 上的,但是怎奈何 wsl2 实在是扶不起来

    比如,我这么个简单的问题至今没有人能解决(估计微软也不想解决)
    https://www.v2ex.com/t/668362
    hakono
        25
    hakono  
       2020-05-14 14:29:56 +08:00
    @hakono 漏了重要的关键字 “本来是想把工作从 Hyper-V 的 Linux 虚拟机 迁移到 wsl2 上的”
    iccfish
        26
    iccfish  
       2020-05-14 15:53:17 +08:00
    @linxl WSL2 目前正式版的 win10 上还没有。
    dawnh
        27
    dawnh  
       2020-05-14 17:12:53 +08:00   ❤️ 1
    @iccfish 关于磁盘性能实际上 wsl 的目标和你的结果是相反的,也就是提供更加高的 IO 性能。其实 WSL1 的 IO 反倒是一直被诟病的。WSL2 则是给了 2 个方式:
    在根目录下的文件访问是走 utility VM 的原生 ext4 文件读写是.vhdx,性能接近原生 ext4 。支持 POSIX 文件权限和 ACL 。但是如果要在 Windows 下访问则需要\\WSL$\path\to\file 这样走 Plan9 。
    /mnt/<drive>是用 Plan9 mount 的 Windows 文件系统,性能一般,但可以无缝在 Windows 下互操作,对于文件系统特性支持有限。

    你如果追求 IO 性能,则不应该把 WSL2 的文件放在 /mnt/<drive>下面,而是保持在 ext4 文件系统下。另外好像 WSL2 还有方法 mount 一个新的.vhdx 作为数据盘。
    jim9606
        28
    jim9606  
       2020-05-14 18:06:15 +08:00
    @iccfish IO 性能这边我听分析是说 defender 自动实时扫描 wsl 目录导致性能下降的,加一下白名单就可以解决。
    我比较关注互通能力,纯计算的我还是搞个正经 VM 做就是了。
    iccfish
        29
    iccfish  
       2020-05-15 01:23:09 +08:00
    @jim9606 不是,这是互通方案决定的,和 defender 没有任何关系。
    iccfish
        30
    iccfish  
       2020-05-15 01:27:50 +08:00
    @dawnh WSL1 的 IO 性能还算可以了。至少没有明显瓶颈。我上面测试也印证了在 WSL1 下,NTFS 分区读写速度接近原生( 1GB/S )。ext4 的读写性能于我没多少价值,毕竟那和一个纯粹的 VM 里的读写性能没有啥区别。P9 协议走网络,太慢了,不是一般。WSL2 下读写 ext4 的性能高不高我不是很在意,但是访问宿主机的磁盘速度比 WSL1 慢上将近十倍。而 WSL1 下 IO 性能一直没遇到什么问题。而且我一直看到的说法其实是 WSL1 下的 CPU 性能不高(相对于 WSL2 来说),我不太清楚你说的 WSL1 的 IO 一直被诟病是从哪些资料看到的,如有请指出。

    总之我用 WSL 最大的意义在于互通访问,且能使用 Linux 的工具集。在这前提下,除非是需要底层的功能,否则 WSL2 对我没有多大意义。
    lonewolfakela
        31
    lonewolfakela  
       2020-05-15 09:40:55 +08:00
    @iccfish WSL1 访问 Linux 分区(也就是非 /mnt )的速度确实比 WSL2 要低得多……可以参考这里的评测:
    aHR0cHMlM0EvL3Z4bGFicy5jb20vMjAxOS8xMi8wNi93c2wyLWlvLW1lYXN1cmVtZW50cy8=
    lonewolfakela
        32
    lonewolfakela  
       2020-05-15 09:45:45 +08:00
    @iccfish 微软自己的文档也说了 WSL2 访问 linux 分区的速度提升很明显( aHR0cHMlM0EvL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL3dzbC9jb21wYXJlLXZlcnNpb25z ):
    "File intensive operations like git clone, npm install, apt update, apt upgrade, and more are all be noticeably faster with WSL 2.

    The actual speed increase will depend on which app you're running and how it is interacting with the file system. Initial versions of WSL 2 run up to 20x faster compared to WSL 1 when unpacking a zipped tarball, and around 2-5x faster when using git clone, npm install and cmake on various projects."
    forrestshuang
        33
    forrestshuang  
       2020-05-15 11:39:27 +08:00
    @hakono 用静态 IP, 直接用我的上面的脚本就好了。
    hakono
        34
    hakono  
       2020-05-15 13:21:52 +08:00
    @forrestshuang 看了下 python 脚本的原理是编辑 windows 和 wsl2 的 hosts,动态设置 wsl.ip 的解析地址,并不是静态 ip 啊,依旧没法解决 wsl2 文件没法共享给局域网的问题

    比如试想这个场景,我宿主机上还有一台 windows 虚拟机(或者我在局域网有另一台电脑),我想在 windows 虚拟机里或者局域网里访问 wsl2 中的文件,不给 wsl2 一个真正的静态 ip 是没法解决这个问题的
    iccfish
        35
    iccfish  
       2020-05-16 02:26:45 +08:00
    @lonewolfakela 额。我想我大概知道你的意思,咱俩说的不是一回事,我说的是互通的。毕竟用 WSL 更希望的是能实现 Windows 和 Linux 的互通访问,而不是纯粹访问的 Linux 分区。访问 Linux 分区的话,WSL2 和虚拟机没啥区别啊,这不是优势。和宿主的互通才是优势。所以访问纯粹的 linux 分区( windows 没法访问,或必须通过网络共享访问)速度提升,在我看来和技能树点错没啥区别 :-)
    lonewolfakela
        36
    lonewolfakela  
       2020-05-16 09:26:18 +08:00
    @iccfish 我只是想指出“WSL1 的 IO 一直被诟病是从哪些资料看到的”这个说法的一些来源而已。
    以及确实不是所有人都更希望互通访问……比如我日常使用的时候就更希望有一个能够配置方便、启动迅速的小虚拟机能够顺手编译一些东西,大规模的文件互通倒是需求不大……
    dawnh
        37
    dawnh  
       2020-05-19 16:19:52 +08:00
    @iccfish 官方文档 https://docs.microsoft.com/en-us/windows/wsl/wsl2-about:
    Increased file IO performance
    File intensive operations like git clone, npm install, apt update, apt upgrade, and more will all be noticeably faster. The actual speed increase will depend on which app you’re running and how it is interacting with the file system. Initial versions of WSL 2 run up to 20x faster compared to WSL 1 when unpacking a zipped tarball, and around 2-5x faster when using git clone, npm install and cmake on various projects.

    Channel9 开发者频道有视频演示实际速度比较,在重 IO 访问情况下保底有 2 倍性能提升,具体就不放链接了。
    iccfish
        38
    iccfish  
       2020-05-20 16:04:07 +08:00
    @dawnh 你发的这个我懂。我上面说过了,我说的不是 WSL2 里访问虚拟机本身文件系统的性能( eg. ext4 ),这个文件系统只能在 WSL2 里访问,在外面的宿主( Windows10 )里只能通过共享访问,性能贼差。我一直说的性能,是跨宿主访问的性能(如 WSL 里访问 NTFS 分区、Windows 里访问 WSL 里的系统文件)。
    iccfish
        39
    iccfish  
       2020-05-20 16:05:59 +08:00
    @lonewolfakela 我持相反意见,我反倒认为越是“日常使用的时候、能顺手编译一些东西”,越需要随时的互通。比如我下载了一个小工具的源码,当然是 windows 里下载的,我肯定期望的是下载了解压了随手开个 WSL 就很快的编译了,而绝对不是还要启动到 WSL2 里,为了提高 IO 速度,先把文件从 NTFS 分区拷贝到 WSL2 里的 Ext4 分区上。
    liu35118665
        40
    liu35118665  
       2020-06-30 11:28:05 +08:00
    其实我想不通 wsl2 的定位到底是什么,如果要完整的 linux 体验,那就该提供完整的虚拟机一样的能力啊,在这个基础上提供些 wsl 特有的增强能力即可
    ungrown
        41
    ungrown  
       2020-10-12 10:21:22 +08:00
    @liu35118665 #40 减缓用户流失吧应该是
    ijliym
        42
    ijliym  
       2020-10-15 18:17:21 +08:00
    折腾了半天,要用的时候,才发现在只能用 localhost 连接,瞎耽误工夫!!!
    cai314494687
        43
    cai314494687  
    OP
       2020-10-16 09:35:25 +08:00 via iPhone
    @ijliym 可以自定义 host 的,就是有点麻烦,因为每次启动 WSL 都会分配一个新的 IP,所以每次使用之前都要改一下映射的 IP
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3471 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 00:07 · PVG 08:07 · LAX 16:07 · JFK 19:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.