对于软件开发者来说,Windows 的开发环境配置一直都是不小的麻烦,由于服务器往往是 Linux 环境,在 Windows 下开发,开发者需要解决各种各样的 Linux 兼容性问题。
微软在 2016 年正式推出了 Windows 的 Linux 子系统(Windows Subsystem for Linux,简称 WSL),又在 2019 年 5 月推出了 WSL 2,WSL 2 引入了完整的 Linux 内核。
既然有了这么好的工具,理论上开发者就可以很轻松地在 WSL 2 上布置开发环境并进行开发了,但实际情况却是 WSL 2 还存在不少小问题,有些直到近期才得到解决。
本文主要讲讲 WSL 2 在网络配置方面的问题和解决方法。因为在早期版本中,WSL 2 的网络配置相对复杂。用户经常遇到的问题包括:
- 网络隔离问题:WSL 2 默认的网络模式可能导致与宿主机的网络隔离,使得某些网络服务无法正常工作。
- 网络代理配置问题:在 WSL 2 中需要做很多命令行操作,但并不是所有命令行都会走网络代理。
- Docker 配置困难:我们有时候需要通过 Docker 在本地部署一些服务,但如果用错误的方法在 WSL 2 中安装 Docker。
- IP 地址变动问题:每次重启 WSL 2 或 Windows 系统后,WSL 2 分配的 IP 地址会发生变化,这导致需要频繁更新服务配置。
以往为了解决这些网络问题,用户不得不采取一些手动配置的步骤,比如用脚本动态获取 IP 地址,并在系统启动时运行,但这种方法既不方便又不稳定,往往需要用户具备一定的脚本编写能力,在某些情况下还可能导致网络无法连接。
随着 WSL 2 的更新,微软也逐渐提供了更加简化的网络配置方法。在最新版本中,已经可以较为简单地解决这些问题了。
解决网络隔离问题
首先我们来解决网络隔离问题。WSL 2 在早期版本中默认使用虚拟网络适配器,导致了与宿主机的网络隔离问题。
现在,你可以在 Windows 的用户目录 C:\Users\【用户名】\
下创建一个配置文件 .wslconfig
,将内容修改如下。就可以让 WSL 2 直接访问外部网络,同时宿主机也能够访问 WSL 2 中运行的服务。
[wsl2]
networkingMode=mirrored
firewall=true
- networkingMode:这一项设置为 mirrored 的作用是「启用镜像网络模式」,如果输入其他字符串会生成 NAT 网络。
- firewall:如果设置为 true,则 Windows 防火墙规则以及特定于 Hyper-V 流量的规则可以筛选 WSL 网络流量。
解决网络代理配置问题
.wslconfig
文件中的 autoProxy
设置可以用来配置网络代理。你可以设置 autoProxy
为 true
,这样 WSL 2 就会自动使用 Windows 的代理设置。这可以通过在 .wslconfig
文件中添加以下内容来实现:
[wsl2]
dnsTunneling=true
autoProxy=true
解决 Docker 问题
很多人在安装 WSL 2 后,往往想以 Linux 的方式安装 Docker。但实际上在 WSL 2 中有更简便的方法来安装 Docker。
方法就是在 Windows 上安装 Docker Desktop,然后启用 WSL Integration 即可,宿主机的 Docker Desktop 会自动处理 WSL 2 的网络配置。
再分享一个踩坑经验:如果采用了这种方式,千万不要在 Windows 和 WSL 2 中同时安装 Docker,这会导致在 WSL 中执行 Docker 命令时,无法在 Docker Desktop 图形界面中看到对应的容器状态。VSCode 的插件也会不知道识别哪一个 Docker。解决方法也不难,就是卸载掉 WSL 中的版本。只是排查这种问题非常浪费时间,因为两个 Docker 都在正常运行,不会产生报错信息。
解决 IP 地址变动问题
关于这一点,我找到很多文章,用各种方法去固定 WSL 2 的 IP 地址,或者动态获取 WSL 2 的 IP 地址。我试过一部分,效果并不算好,往往会造成其他的问题。
后来了解到 WSL 2 的设计目的本就是在动态环境下工作,微软官方也不建议用静态 IP 地址去访问它。再加上「获取 WSL 2 IP 地址」的目的很可能就是为了解决上面的几个问题,所以我的解决方法是遵循微软的建议:通过端口转发忽略 IP 地址变动的问题。
- 在 WSL 2 中启动你的服务:首先在 WSL 2 中启动你想要访问的服务,比如一个 Web 服务器或数据库。
- 找出服务运行的端口:确定这个服务运行在哪个端口上。例如,一个标准的 Web 服务可能运行在端口 80 或 8080 上。
- 使用 Windows 主机 IP 地址访问服务:你可以直接使用 Windows 主机的 IP 地址加上服务的端口来访问 WSL 2 中的服务。
- 例如,如果你的 Windows IP 地址是
192.168.1.5
,服务运行在端口 8080 上,你可以在浏览器中输入http://192.168.1.5:8080
来访问该服务。
- 例如,如果你的 Windows IP 地址是
- 配置端口转发(如果需要):如果服务不在 WSL 2 和 Windows 之间自动转发,你可能需要手动设置端口转发,或者利用 VSCode 之类的工具的 GUI 界面做一层转发。
使用这种方法,你就无需担心 WSL 2 的 IP 地址变动了,只需使用 Windows 的稳定 IP 地址和适当的端口即可访问 WSL 2 中的服务。这是目前微软官方推荐的、简单且高效的方法来访问 WSL 2 中的网络服务。