一只小开发仔...

Windwos10利用WSL2安装Docker

287 2021-01-02 07:49:51

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