1 概述
作为一名使用 win10 的开发者,搭建开发环境往往是一件比较痛苦的事,需要从网上*载下**各种软件,在电脑上配置不同软件运行环境,对软件进行各种设置,不仅耗时,而且容易出现各种问题。搭建的环境还会存在下面一些问题:
- 安装大量程序造成路径污染。
- 安装和卸载比较麻烦。
- 开发环境不能迁移,重装系统或者换电脑需要重新搭建开发环境。
- 软件版本不好控制。
为了解决上面这些问题,我们可以使用 WSL+Docker+Scoop 搭建开发环境,取代通过图形界面安装软件和 VMware 安装 Linux 环境的传统方式。
WSL 是适用于 Linux 的 Windows 子系统, 可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上。
Scoop 是 Windows 的命令行安装程序,可以让我们从命令行以最小的安装量安装程序, 它消除了安装界面和安装程序造成的路径污染,它安装和卸载软件只需一行命令就可以完成,它还可以随意切换软件的版本。
一个完整的开发环境组成:首先使用 WSL 搭建一个 Linux 环境,然后在 Linux 环境里安装 Docker 应用,使用 Docker 来安装一些常用软件,比如数据库、web 环境等,Scoop 则是在本机上安装一些开发用到的软件,比如 jdk 、 maven 、 idea 等。WSL 和 Scoop 都是比较容易备份和还原的,这两个搭建好了,我们利用备份还原可以快速在另一台机器上搭建同样的一套环境,下面是搭建环境的具体流程。
2 WSL
2.1 WSL 安装
- 使用 WINDOWS 键 + R,输入 winver ,检查 win10 版本,确保内部版本号是 18362.1049 以上,否则更新 win10 到最新版本。

- 以管理员身份打开 PowerShell 并运行下面命令:
dism*ex.e** /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism*ex.e** /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

- 重新启动计算机。
- *载下** Linux内核更新包 [1] ,然后安装。
- 将 wsl2 设置为默认版本, 以管理员身份打开 PowerShell 并运行下面命令:
wsl --set-default-version 2

- 安装 Ubuntu 20.04 LTS , 打开 Microsoft Store [2] ,搜索 Ubuntu 20.04 LTS [3] 安装, 安装完成后打开 Ubuntu 20.04 LTS , 等候几分钟会提示设置用户名和密码,如果不设置用户名和密码直接关闭窗口则默认以 root 登录,这里我们直接关闭窗口,不设置用户名和密码。

- 然后重新打开 Ubuntu 20.04 LTS 就会进入 Ubuntu 20.04 LTS 了,我们也可以在 powershell 使用 wsl 这个命令进入 Ubuntu 20.04 LTS 。
2.2 WSL 配置
WSL 每次启动后,windows 都会给它分配一个随机的 IP 地址,这样是不利于我们访问 docker 里的服务的,为了解决这个问题,我们可以创建一个脚本文件 wsl2-ip.bat 来给 wsl 分配一个固定的 IP,在每次启动 wsl 后用管理员权限运行这个脚本,文件内容如下:
@echooff
setlocalenabledelayedexpansion
::setwsl2ip
wsl-urootipaddr|findstr"192.168.169.2">nul
if!errorlevel!equ0(
echowsliphasset
)else(
wsl-dUbuntu-20.04-urootipaddradd192.168.169.2/28broadcast192.168.169.15deveth0labeleth0:1
echosetwslipsuccess:192.168.169.2
)
::setwindowsip
ipconfig|findstr"192.168.169.1">nul
if!errorlevel!equ0(
echowindowsiphasset
)else(
netshinterfaceipaddaddress"vEthernet(WSL)"192.168.169.1255.255.255.240
echosetwindowsipsuccess:192.168.169.1
)
pause
其中 192.168.169.2 表示 Linux 的 IP 地址, 192.168.169.1 表示主机的 IP 地址。
有时会遇到 Ubuntu 20.04 LTS 无法连接网络,这个非常重要,我们可以运行下面命令解决:
sed-i'4d'/etc/resolv.conf
sed-i'3a\nameserver8.8.8.8'/etc/resolv.conf
sed-i'4a\nameserver114.114.114.114'/etc/resolv.conf
2.3 Ubuntu 配置
2.3.1 替换镜像源
- 备份 sources.list 文件,运行下面命令:
mv/etc/apt/sources.list/etc/apt/sources.list.bak
- 创建 source.list 文件,运行下面命令:
vim/etc/apt/sources.list
- 然后在文件里添加下面内容,下面源任选其一即可。
#清华源
#默认注释了源码镜像以提高aptupdate速度,如有需要可自行取消注释
debhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focalmainrestricteduniversemultiverse
#deb-srchttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focalmainrestricteduniversemultiverse
debhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-updatesmainrestricteduniversemultiverse
#deb-srchttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-updatesmainrestricteduniversemultiverse
debhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-backportsmainrestricteduniversemultiverse
#deb-srchttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-backportsmainrestricteduniversemultiverse
debhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-securitymainrestricteduniversemultiverse
#deb-srchttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-securitymainrestricteduniversemultiverse
#预发布软件源,不建议启用
#debhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-proposedmainrestricteduniversemultiverse
#deb-srchttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-proposedmainrestricteduniversemultiverse
#阿里源
debhttp://mirrors.aliyun.com/ubuntu/focalmainrestricteduniversemultiverse
#deb-srchttp://mirrors.aliyun.com/ubuntu/focalmainrestricteduniversemultiverse
debhttp://mirrors.aliyun.com/ubuntu/focal-securitymainrestricteduniversemultiverse
#deb-srchttp://mirrors.aliyun.com/ubuntu/focal-securitymainrestricteduniversemultiverse
debhttp://mirrors.aliyun.com/ubuntu/focal-updatesmainrestricteduniversemultiverse
#deb-srchttp://mirrors.aliyun.com/ubuntu/focal-updatesmainrestricteduniversemultiverse
debhttp://mirrors.aliyun.com/ubuntu/focal-proposedmainrestricteduniversemultiverse
#deb-srchttp://mirrors.aliyun.com/ubuntu/focal-proposedmainrestricteduniversemultiverse
debhttp://mirrors.aliyun.com/ubuntu/focal-backportsmainrestricteduniversemultiverse
#deb-srchttp://mirrors.aliyun.com/ubuntu/focal-backportsmainrestricteduniversemultiverse
#中科大源
debhttps://mirrors.ustc.edu.cn/ubuntu/focalmainrestricteduniversemultiverse
#deb-srchttps://mirrors.ustc.edu.cn/ubuntu/focalmainrestricteduniversemultiverse
debhttps://mirrors.ustc.edu.cn/ubuntu/focal-updatesmainrestricteduniversemultiverse
#deb-srchttps://mirrors.ustc.edu.cn/ubuntu/focal-updatesmainrestricteduniversemultiverse
debhttps://mirrors.ustc.edu.cn/ubuntu/focal-backportsmainrestricteduniversemultiverse
#deb-srchttps://mirrors.ustc.edu.cn/ubuntu/focal-backportsmainrestricteduniversemultiverse
debhttps://mirrors.ustc.edu.cn/ubuntu/focal-securitymainrestricteduniversemultiverse
#deb-srchttps://mirrors.ustc.edu.cn/ubuntu/focal-securitymainrestricteduniversemultiverse
debhttps://mirrors.ustc.edu.cn/ubuntu/focal-proposedmainrestricteduniversemultiverse
#deb-srchttps://mirrors.ustc.edu.cn/ubuntu/focal-proposedmainrestricteduniversemultiverse
#网易163源
debhttp://mirrors.163.com/ubuntu/focalmainrestricteduniversemultiverse
debhttp://mirrors.163.com/ubuntu/focal-securitymainrestricteduniversemultiverse
debhttp://mirrors.163.com/ubuntu/focal-updatesmainrestricteduniversemultiverse
debhttp://mirrors.163.com/ubuntu/focal-proposedmainrestricteduniversemultiverse
debhttp://mirrors.163.com/ubuntu/focal-backportsmainrestricteduniversemultiverse
#deb-srchttp://mirrors.163.com/ubuntu/focalmainrestricteduniversemultiverse
#deb-srchttp://mirrors.163.com/ubuntu/focal-securitymainrestricteduniversemultiverse
#deb-srchttp://mirrors.163.com/ubuntu/focal-updatesmainrestricteduniversemultiverse
#deb-srchttp://mirrors.163.com/ubuntu/focal-proposedmainrestricteduniversemultiverse
#deb-srchttp://mirrors.163.com/ubuntu/focal-backportsmainrestricteduniversemultiverse
- 进行更新,运行下面命令:
aptupdate
aptupgrade-y
2.3.2 开启 systemctl
- 安装 daemonize 和 fontconfig 软件,运行下面命令:
aptinstall-yfontconfigdaemonize
- 运行 vim /etc/profile 命令,在末尾添加下面内容:
SYSTEMD_PID=$(ps-ef|grep'/lib/systemd/systemd--system-unit=basic.target#39;|grep-vunshare|awk'{print$2}')
if[-z"$SYSTEMD_PID"];then
sudo/usr/bin/daemonize/usr/bin/unshare--fork--pid--mount-proc/lib/systemd/systemd--system-unit=basic.target
SYSTEMD_PID=$(ps-ef|grep'/lib/systemd/systemd--system-unit=basic.target#39;|grep-vunshare|awk'{print$2}')
fi
if[-n"$SYSTEMD_PID"]&&["$SYSTEMD_PID"!="1"];then
execsudo/usr/bin/nsenter-t$SYSTEMD_PID-asu-$LOGNAME
fi
- 运行 vim /etc/sudoers 命令,在末尾添加下面内容:
%sudoALL=(ALL)NOPASSWD:/usr/sbin/daemonize/usr/bin/unshare--fork--pid--mount-proc/lib/systemd/systemd--system-unit=basic.target
%sudoALL=(ALL)NOPASSWD:/usr/bin/nsenter-t[0-9]*-asu-[a-zA-Z0-9]*
- 刷新 profile 文件,运行下面命令:
source/etc/profile
2.3.2 开启 ssh
- 设置 root 账号的密码,用作后续登陆使用,运行下面命令:
passwdroot

- 备份原始的 sshd_config ,运行下面命令:
cp/etc/ssh/sshd_config/etc/ssh/sshd_config.bak
- 修改 sshd_config 文件,运行下面命令:
sed-i'15cPort22'/etc/ssh/sshd_config
sed-i'17cListenAddress0.0.0.0'/etc/ssh/sshd_config
sed-i'34cPermitRootLoginyes'/etc/ssh/sshd_config
sed-i'58cPasswordAuthenticationyes'/etc/ssh/sshd_config
- 重启 sshd ,运行下面命令
systemctlrestartsshd
2.4 Docker 安装与配置
官方和阿里的源选择其一,建议使用阿里源,速度快。
2.4.1 官方安装
- 卸载旧版本,运行下面命令:
apt-getremovedockerdocker-enginedocker.iocontainerdrunc
- 更新 apt 软件包索引并安装软件包以允许 apt 通过 HTTPS 使用存储库,运行下面命令:
apt-getinstall-yapt-transport-httpsca-certificatescurlgnupglsb-release
- 添加 Docker 的官方 GPG 密钥,运行下面命令:
curl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|sudogpg--dearmor-o/usr/share/keyrings/docker-archive-keyring.gpg
- 设置稳定的存储库,运行下面命令:
echo"deb[arch=amd64signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]https://download.docker.com/linux/ubuntu$(lsb_release-cs)stable"|sudotee/etc/apt/sources.list.d/docker.list>/dev/null
- 安装最新版本的 Docker Engine 和容器,运行下面命令:
apt-getupdate
apt-getinstall-ydocker-cedocker-ce-clicontainerd.io
apt-markholddocker-cedocker-ce-clicontainerd.io
2.4.2 阿里源安装
- 卸载旧版本,运行下面命令:
apt-getremovedockerdocker-enginedocker.iocontainerdrunc
- 更新 apt 软件包索引并安装软件包以允许 apt 通过 HTTPS 使用存储库,运行下面命令:
apt-getinstall-yapt-transport-httpsca-certificatescurlgnupglsb-release
- 添加 Docker 的阿里 GPG 密钥,运行下面命令:
curl-fsSLhttp://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg|sudoapt-keyadd-
- 设置稳定的存储库,运行下面命令:
add-apt-repository"deb[arch=amd64]http://mirrors.aliyun.com/docker-ce/linux/ubuntu$(lsb_release-cs)stable"
- 安装最新版本的 Docker Engine 和容器,运行下面命令:
apt-getupdate
apt-getinstall-ydocker-cedocker-ce-clicontainerd.io
apt-markholddocker-cedocker-ce-clicontainerd.io
2.4.3 配置镜像加速
创建 /etc/docker/daemon.json 文件,并填写以下内容:
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn/"]
}
3 Scoop
3.1 Scoop 安装
- 以管理员权限打开 PowerShell 。
- 自定义用户软件和全局软件安装位置,运行下面命令:
$env:SCOOP='D:\Softwares\Scoop\LocalApps'
[Environment]::SetEnvironmentVariable('SCOOP', $env:SCOOP, 'User')
$env:SCOOP_GLOBAL='D:\Softwares\Scoop\GlobalApps'
[Environment]::SetEnvironmentVariable('SCOOP_GLOBAL', $env:SCOOP_GLOBAL, 'Machine')

- 配置安全策略以及安装 Scoop,运行下面命令:
Set-ExecutionPolicyRemoteSigned-scopeCurrentUser
Invoke-Expression(New-ObjectSystem.Net.WebClient).DownloadString('https://get.scoop.sh')

3.2 安装失败解决方案
- 如果发生下面错误,这是因为网络原因无法访问 GitHub。

- 访问 IP地址查询网站 [4] ,输入 raw.githubusercontent.com 域名,查询对应的 IP 地址。

- 配置 C:\Windows\System32\drivers\etc\hosts 文件,在修改前赋予 hosts 文件读写权限。



- 修改 host 文件内容如下,第一列是查询出来的ip地址,第二列是其对应的域名,中间有个空格。

- 保存后重新运行安装命令。
Invoke-Expression(New-ObjectSystem.Net.WebClient).DownloadString('https://get.scoop.sh')
3.3 Scoop 配置
- 安装 Scoop 运行所需要的基础软件:
scoopinstallsudo
sudoscoopinstall7zipgitinnounpdark-g

- 运行下面命令,检查Scoop还存在的问题,输入提示运行的命令,来解决存在的问题,如果你使用的安装路径不是我的路径,请修改命令中的软件安装位置:
scoopcheckup
Add-MpPreference-ExclusionPath'D:\Softwares\Scoop\LocalApps'
Add-MpPreference-ExclusionPath'D:\Softwares\Scoop\GlobalApps'
Set-ItemProperty'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem'-Name'LongPathsEnabled'-Value1

- 配置软件仓库,官方软件仓库目前收录的软件很少,不足以支持我们的使用,添加下面的软件仓库,能让我们安装更多的软件:
scoopbucketaddextras
scoopbucketaddversions
scoopbucketaddnightlies
scoopbucketaddnirsoft
scoopbucketaddphp
scoopbucketaddnerd-fonts
scoopbucketaddnonportable
scoopbucketaddjava
scoopbucketaddgames
scoopbucketaddjetbrains
scoopbucketadddoradohttps://github.com/chawyehsu/dorado
scoopbucketaddAsh258https://github.com/Ash258/Scoop-Ash258.git
scoopbucketaddpleiadeshttps://github.com/jfut/scoop-pleiades.git
scoopbucketaddScoop-Appshttps://github.com/ACooper81/scoop-apps
scoopbucketaddscoop-zappshttps://github.com/kkzzhizhou/scoop-zapps
scoopbucketaddlemonhttps://github.com/hoilc/scoop-lemon
scoopbucketaddraresofthttps://github.com/L-Trump/scoop-raresoft

如果软件仓库添加失败,还是因为网络的原因,大家可以把这些仓库 fork 到自己的码云账户下,然后再添加。
- 使用 aria2 来加速软件的安装:
scoopinstallaria2-g
scoopconfigaria2-max-connection-per-server16
scoopconfigaria2-split16
scoopconfigaria2-min-split-size1M
如果想关闭 aria2,可以运行 scoop config aria2-enabled false 命令。
3.4 Scoop 常用命令
#搜索app
scoopsearch<应用名>
#检查哪些软件有更新
scoopstatus
#版本切换
scoopreset<应用名>@<版本切换>
#禁止某app更新
scoophold<应用名>
#更新所有app
scoopupdate*
#安装app
scoopinstall<应用名>
#全局安装app
scoopinstall-g<应用名>
#安装extras软件源下的app
scoopinstallextras/<应用名>
#卸载app
scoopuninstall<应用名>
#卸载全局安装的app
scoopuninstall-g<应用名>
4 总结
开发环境软件的安装与配置到这里就完成了,利用上面这些软件,你可以快速搭建 Java 、 Go 、 C++ 、 Python 等开发环境。
参考资料
[1] Linux内核更新包: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
[2] Microsoft Store: https://aka.ms/wslstore
[3] Ubuntu 20.04 LTS: https://www.microsoft.com/store/apps/9n6svws3rx71
[4] IP地址查询网站: https://www.ipaddress.com/