对于软件开发者来说,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
- dnsTunneling:更改将 DNS 请求从 WSL 代理到 Windows 的方式。
- autoProxy:强制 WSL 使用 Windows 的 HTTP 代理信息。
解决 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 中的版本。只是排查这种问题非常浪费时间,因为两个 Doc
