1.检查环境win10系统版本,打开设置,点击系统,再点击关于,就可以看到系统版本号和操作系统版本号。系统要求如下:
-
对于 x64 系统:版本 1903 或更高版本,采用 内部版本 18362 或更高版本。
-
对于 ARM64 系统:版本 2004 或更高版本,采用 内部版本 19041 或更高版本。
-
低于 18362 的版本不支持 WSL 2。 使用Windows Update助手更新 Windows 版本。
2.启用“适用于 Linux 的 Windows 子系统”可选功能,以管理员身份打开 PowerShell 并运行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
然后重启计算机,一定要先重启计算机。
3.下载Linxu内核更新包并安装:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi。
4.将WSL2设置为默认版本。
wsl --set-default-version 2
5.安装Linux Ubuntu系统和Windows Terminal。
打开微软商店Misrosoft Store,分别搜索Ubuntu和Windows Terminal,选择点击安装。
6.使用Windows Terminal操作Ubuntu。
打开Windows Terminal,点击下拉会看到刚才安装的Ubuntu系统,点击进入。系统初始化会出现要求创建用户和用户密码,自己定一个即可。
为了减少sudo操作带来的输入密码操作,可以选择修改root用户密码并是root用户操作。
sudo passwd root
su root
更换apt安装源为阿里云地址源。
cp /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.aliyun.com/ubuntu/ focal main restricted
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ focal universe
deb http://mirrors.aliyun.com/ubuntu/ focal-updates universe
deb http://mirrors.aliyun.com/ubuntu/ focal multiverse↵deb http://mirrors.aliyun.com/ubuntu/ focal-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted
deb http://mirrors.aliyun.com/ubuntu/ focal-security universe
deb http://mirrors.aliyun.com/ubuntu/ focal-security multiverse">/etc/apt/sources.list
执行更新。
apt update && apt upgrade -y
7.安装docker。
注意:不同于完全Linux虚拟机方式,WLS2下通过apt install docker-ce命令安装的Docker无法启动,因为WSL2方式的Ubuntu里面没有systemd。下面官方get-docker.sh安装的Docker,dockerd进程是用Ubuntu传统的init方式而非systemd启动的。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo service docker start
执行脚本安装过程中,脚本提示“建议使用Docker Desktop for windows”,20s内按Ctrl+C会退出安装,所以需要等待20s,另外此种方式需要访问外网。
查看Docker状态。
service docker status
拉取镜像测试。
docker pull php:7.4
启动镜像。
docker run -it php:7.4 /bin/bash
后台启动镜像。
docker run -dit php:7.4 /bin/bash
访问子系统内的服务服务时,不能使用localhost,应该使用子系统的IP。但是每次重启后,子系统的IP都会变动,所以需要采取自动bat脚本去修改wsl的IP。
新建wsl2-ip.bat脚本文件,下面代码的IP请设置你想要的IP,保存放置在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp,电脑每次开机后就会执行该脚本。
::::::::::::::::::::::::::::::::::::::::::::
:: wsl2-ip
::::::::::::::::::::::::::::::::::::::::::::
@echo off
CLS
ECHO.
ECHO =============================
ECHO Running WSL2-IP shell
ECHO =============================
:init
setlocal DisableDelayedExpansion
set cmdInvoke=1
set winSysFolder=System32
set "batchPath=%~0"
for %%k in (%0) do set batchName=%%~nk
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
:getPrivileges
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
ECHO.
ECHO **************************************
ECHO Invoking UAC for Privilege Escalation
ECHO **************************************
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
ECHO args = "ELEV " >> "%vbsGetPrivileges%"
ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg ^& " " >> "%vbsGetPrivileges%"
ECHO Next >> "%vbsGetPrivileges%"
if '%cmdInvoke%'=='1' goto InvokeCmd
ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
goto ExecElevation
:InvokeCmd
ECHO args = "/c """ + "!batchPath!" + """ " + args >> "%vbsGetPrivileges%"
ECHO UAC.ShellExecute "%SystemRoot%\%winSysFolder%\cmd.exe", args, "", "runas", 1 >> "%vbsGetPrivileges%"
:ExecElevation
"%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
exit /B
:gotPrivileges
setlocal & cd /d %~dp0
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul & shift /1)
::::::::::::::::::::::::::::
:: Start
::::::::::::::::::::::::::::
setlocal enabledelayedexpansion
wsl -u root service docker start | findstr "Starting Docker" > nul
if !errorlevel! equ 0 (
echo docker start success
:: set wsl2 ip
wsl -u root ip addr | findstr "192.168.31.154" > nul
if !errorlevel! equ 0 (
echo wsl ip has set
) else (
wsl -u root ip addr add 192.168.31.154/28 broadcast 192.168.169.159 dev eth0 label eth0:1
echo set wsl2 ip success: 192.168.31.154
)
:: set windows ip
ipconfig | findstr "192.168.131.145" > nul
if !errorlevel! equ 0 (
echo windows ip has set
) else (
netsh interface ip add address "vEthernet (WSL)" 192.168.31.145 255.255.255.240
echo set windows ip success: 192.168.31.145
)
)
pause