WSL2 安裝 Docker

2021-02-07 Leaders工作室
WSL2相較於WSL除了I/O性能有了巨大的改進,最主要的:WSL2 的底層是一個跑在Hyper-V上的完整的Linux系統,而不是像WSL一樣是穿著Linux 的外衣和Windows打交道的系統。

因此,在WSL2沒有出現之前如果要在Windows上玩Docker很多人是不建議的。

因為即使是使用Docker官方的提供的Docker for Windows也是經常出些奇奇怪怪的錯誤並遲遲得不到解決。通過虛擬機安裝boot2docker.iso,在虛擬出來的Linux系統下玩,但啟動虛擬機是真慢。而且隨著WSL2的推出boot2docker也不在維護。

因此WSL2,對於經常需要使用一些辦公程序軟體、又想玩Docker、還沒錢買Mac的用戶來說,確實是一個福音!

安裝 WSL2查看系統版本

Update to WSL2 Requirements

即:最新的WSL2特性要求在 Windows 10 x64 Version 1903及以上版本的系統或ARM64 systems: Version 2004及以上版本的系統.

Win+R 輸入 winver,即可查看到當前自己Windows版本信息:

winver更新Windows工具:https://www.microsoft.com/zh-hk/software-download/windows10Windows 1909升級失敗問題:https://www.win10gw.com/win10wenzhang/6507.html安裝 WSL 並升級到 WSL2

一定要確保系統已經達到標準,不然通過WSL使用Docker會遇到各種不知道為啥的坑,而且啟動Docker也非常慢。

WSL2 更新特性:https://docs.microsoft.com/en-us/windows/wsl/compare-versions#whats-new-in-wsl-2

下列命令都需要使用管理員身份運行PowerShell,運行下列腳本!!!

安裝WSL:開啟Windows-Subsystem-Linux特性
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

升級完畢之後,需要重啟計算機!!!

查看系統類型,在 PowerShell 中輸入systeminfo即可查看,如下圖是x64的版本:

systeminfoWSL2 Linux kernel update package for x64 machinesWSL2 Linux kernel update package for ARM64 machines

下載對應補丁包安裝補丁!

要使用管理員身份運行PowerShell,運行下列腳本:

wsl --set-default-version 2

如果你之前已經通過 WSL1 安裝了 Linux,現在想轉為WSL2運行,可參考:https://docs.microsoft.com/en-us/windows/wsl/install-win10#set-your-distribution-version-to-wsl-1-or-wsl-2

安裝 Linux 子系統在Microsoft Store上搜索一個你自己喜歡的子系統進行安裝

Microsoft Store Result for search Linux

打開PowerShell,輸入wsl -l -v可以看到你的子系統運行版本

wsl -l -v

如果你想重啟 WSL 系統,使用管理員身份打開 PowerShell 執行下列命令

Get-Service LxssManager | Restart-Service

安裝Windows Terminal

Windows的命令行向來是以醜著稱,Windows Terminal總算是挽救了一點它的顏值。

Windows Terminal安裝:https://github.com/microsoft/terminal使用指南:https://docs.microsoft.com/zh-cn/windows/terminal/customize-settings/global-settings如何給 Windows Terminal 增加一個新的終端

下述是我將Git-Bash添加到Windows Terminal的配置

{
    // guid 可以通過網上查詢 guid 生成器生成:http://tool.pfan.cn/guidgen
    "guid": "{ce7a80b8-da75-4628-a2e1-663af0f3ce7c}", // 終端唯一標識號,用於設置`defaultProfile`-默認打開哪個終端
    "name": "Git Bash", // 終端名稱
    "icon": "C:\\Self\\code\\CVS\\Git\\git-for-windows.ico", // 終端ICON圖標路徑
    "commandline": "C:\\Self\\code\\CVS\\Git\\bin\\bash.exe --login -i", // 終端所在絕對路徑
    "startingDirectory":"D:\\htdocs", // 打開終端默認打開路徑,如果為null則默認上一次退出時路徑
    "hidden": false, // 是否隱藏不展示
    "useAcrylic" : true, // 是否使用磨砂效果
    "acrylicOpacity" : 0.8, // 磨砂效果
    "colorScheme" : "Campbell", // 配色方案
    "cursorColor" : "#FFFFFD", // 光標顏色
    "fontFace" : "Fira Code", // 終端字體
    "backgroundImage":"C:\\Users\\Minso\\Pictures\\Camera Roll\\view.jpg", // 終端背景圖
    "backgroundImageOpacity":0.75, // 背景圖透明度
}

方式一:Docker Desktop+WSL2 運行 Docker

Docker Desktop 將 Docker CE、Docker Compose、Kubernets 等軟體整合在了一起進行安裝,省去了一一安裝的煩惱。

Docker Daemon 由於是安裝在宿主機上的,因此可以直接使用宿主機的網卡信息對容器進行訪問。

下載安裝Docker Desktop運行 Docker,可以讓你在Windows中方便的管理配置DockerDocker for Windows:https://desktop.docker.com/win/stable/Docker%20Desktop%20Installer.exeDoecker for Mac:https://desktop.docker.com/mac/stable/Docker.dmg

傻瓜式安裝即可!

配置Docker Desktop使用WSL2運行Docker engine

Use the WSL 2 based engine

Configure which WSL 2 distros you want to access Docker from

現在你就可以在對應的子系統中玩 Docker 了,打開安裝好的子系統,輸入docker info就可以查看到對應的系統信息了.

方式二:WSL2子系統中安裝Docker

該方式是利用 Windows Hyper-v 將 Docker 裝在子系統虛擬機中的,但該方式裝的虛擬機啟動、讀寫性能方面要比使用Virtual Box、VM 的方式更好。


安裝最新Docker CE

curl -fsSL get.docker.com -o /tmp/get-docker.sh && sudo /bin/sh /tmp/get-docker.sh --mirror Aliyun && rm -f /tmp/get-docker.sh

啟動並檢驗安裝是否成功
# 啟動 docker 服務
sudo service docker start # 注意:有的Linux系統時通過`systemctl start docker`啟動

# 列印docker系統詳細信息
docker info

docker info

看到以上信息證明已經安裝完成並成功啟動了服務!

踩坑預警

使用docker info列印信息時可能會遇到下述信息,提示/var/run/docker.sock權限不足

Client:
 Debug Mode: false

Server:
ERROR: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/info: dial unix /var/run/docker.sock: connect: permission denied
errors pretty printing info

/var/run/docker.sock connect permission denied

通過ls -al /var/run/docker.sock查看該文件權限信息,發現文件是root用戶或docker組用戶才能進行讀寫

ls -al show files info

可以通過id或groups ${USER}查看當前用戶所在的組信息,發現當前用戶的附加組信息裡並沒有docker,那麼問題就好解決了:只需將當前用戶加入到docker組即可.

id show ${USER} groups
sudo groupadd docker

sudo usermod -aG docker ${USER}

你需要先登出再重新登錄一次,這樣當前系統會重新刷新你的身份信息。或者,使用下列方式不用退出即可刷新當前進程的用戶身份信息:

exec su -l ${USER}

此時再運行docker info應該就正常列印信息了!

安裝最新Docker Compose

可參考:https://docs.docker.com/compose/install/#install-compose-on-linux-systems

# 下載當前最新版本是:1.27.4

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 賦予 docker-compose 可執行權限
sudo chmod +x /usr/local/bin/docker-compose

# 刷新當前進程信息
exec $SHELL -l

# 檢查docker-compose是否安裝成功
docker-compose --version

設置Docker Server鏡像源加速Docker 官方中國區鏡像地址:https://registry.docker-cn.com網易鏡像地址:http://hub-mirror.c.163.comustc鏡像地址:https://docker.mirrors.ustc.edu.cn阿里雲鏡像地址設置參考文章底部:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

如果想使用阿里雲鏡像地址需要有阿里雲帳號,但我在廣州試用了上述的鏡像地址,確實設置了阿里雲的鏡像加速是效果最好的

通過Docker Desktop配置registry-mirrors

如果是使用 Docker Desktop+WSL 方式安裝 Docker 直接使用面板即可修改!

set registry-mirrors for Docker Desktop配置 WSL2 中的 Docker 鏡像加速地址

當你的docker版本較新(Docker Version >= 1.10)時,建議直接通過 /etc/docker/daemon.json 進行配置(若沒有該文件則直接新建,寫入下述配置即可)

{
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

若Docker版本比較舊,則需根據系統的不同而修改不同位置的配置文件,詳細參考此處

修改完成後,執行sudo service docker restart重啟docker

update setting registry-mirrors解決 WSL2 安裝 Docker 的一些問題1. 開機啟動Docker服務

WSL的是一個基於Windows系統的Hyper V服務運行的Linux系統,但沒有對應的開機自檢程序,因此在WSL中設置服務開機啟動是沒有用的。

因此,通過實現Windows的開機啟動項執行一端腳本調用WSL內的服務,從而達到 WSL 開機啟動服務的目的。

查閱並試驗了網上的一些文章,大致分為兩類:

通過將VBScript腳本的快捷方式放到C:\Users\{USER}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup下,從而實現開機自啟【試驗結果:Windows 10 似乎由於權限問題,不能將 *.vbs 格式腳本放置到該目錄下】通過修改註冊列表的實現開機自動執行一段命令【試驗結果:可行】

shell-script-init.wsl

配置/etc/sudoers文件,將下述信息加入到文件末端

# 設置sudo腳本-無需輸入密碼驗證
%sudo ALL=NOPASSWD: /etc/init.wsl

# -u root 通過roo用戶啟動wsl
# -e /etc/init.wsl 啟動執行 /etc/init.wsl腳本

wsl -u root -e /etc/init.wsl

powershell 調用 wsl內部腳本2. 解決 WSL2 內網IP變動問題

由於WSL 2新的體系結構使用虛擬化的網絡組件,每次計算機重啟的時候都會重置WSL 2的虛擬網卡,因此每次重啟完計算機後WSL2中的IP位址都不一定一樣。

Get-Servcie-LxssManager-Restarat-Service.png

雖然我們可以通過localhost訪問到WSL中的服務,但是當需要配置多個虛擬域名的時候該方法顯然就不適用了,此時若要在宿主機中通過虛擬域名訪問WSL 2中的網絡服務需要每次手動對宿主機的hosts文件修改其IP-Domain映射關係。

於是,想了兩個方案:

方法一:通過批處理腳本,啟動時自動獲取WSL 2的網卡信息,自動修改宿主機的hosts原有的IP-Domain信息

該方法需要懂批處理腳本語言,而且實際開發情景中開發環境一般都是整個開發組統一進行維護的。包括hosts文件一般也是統一進行維護然後通過SwitchHosts從遠端獲取。因此方式一比較適用個人本地項目,因為hosts一般不會變動,但並不適用協同辦公的情景。

方法二:想辦法將WSL的網卡信息「固定下來」-設置私有IP,組建宿主機-WSL 2區域網

由於WSL 2的網卡每次都會被重置,因此設置靜態IP的方式勢必是走不通的。因此:只能在每次計算機開機或重啟的時候通過腳本為WSL 2增置一個新的私有網卡IP,並同時在宿主機上增設一個一樣網段的乙太網卡私有IP,在宿主機與虛擬機之間組建一個小型的區域網進行服務通信。

# `WSL 2`新增網卡
# - 設置私有IP網段為192.168.33.10-192.168.33.28
# - 廣播地址為192.168.169.15
# - 網卡名稱為 eth0
# - 設置網卡標籤 eth0:1
wsl -u root ip addr add 192.168.33.10/28 broadcast 192.168.169.15 dev eth0 label eth0:1

# 設置宿主機網卡`vEthernet (WSL)`地址為 `192.168.33.1`-需要管理員權限
netsh interface ip add address "vEthernet (WSL)" 192.168.33.1 255.255.255.240

3. 修改註冊列表實現宿主機開機自動執行初始化腳本WSL2 開機啟動Docker服務腳本-放在虛擬機中/etc/init.wsl位置
#!/bin/sh

# 啟動docker服務
sudo service docker start
# 開啟 rpcbind 服務
sudo mkdir -p /run/sendsigs.omit.d/ && sudo /etc/init.d/rpcbind start

Windows宿主機開機需自動執行的init-wsl.bat腳本
@echo off
:: run task as administrator
%1 %2
ver|find "5.">nul&&goto :Admin
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :Admin","","runas",1)(window.close)&goto :eof
:Admin

:: set WSL distribution
set distribution=Ubuntu-20.04

:: 設置WSL初始化腳本位置
set initWSL=/etc/init.wsl

:: 配置宿主機私有網絡IP、WSL2私有網絡IP、廣播地址、子網掩碼
set hostOSIP=192.168.33.1
set WSL2IP=192.168.33.10
set WSL2Broadcast=192.168.33.15
set subnetMask=255.255.255.240

:: init WSL2 services
wsl -d %distribution% -u root -e %initWSL%
if %ERRORLEVEL% NEQ 0 (
echo init WSL services error OR Already init WSL!
pause
) else (
echo init WSL success!
)

:: set wsl2 ip
wsl -d %distribution% -u root ip addr | findstr "%WSL2IP%" > nul
if !errorlevel! equ 0 (
echo wsl ip has set!
) else (
wsl -d %distribution% -u root ip addr add %WSL2IP% broadcast %WSL2Broadcast% dev eth0 label eth0:1
echo set wsl ip success: %WSL2IP%
)

:: set windows ip
ipconfig | findstr %hostOSIP% > nul
if !errorlevel! equ 0 (
echo windows ip has set!
) else (
netsh interface ip add address "vEthernet (WSL)" %hostOSIP% %subnetMask%
echo set windows ip success: %hostOSIP%
)

Windows鍵+R,輸入regedit打開註冊列表,在地址欄輸入計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run定位到對應註冊表位置,右鍵新建一個字符串值,鍵入對應命令即可,如下圖!

set regist service

重啟計算機即可發現,WSL中的Docker服務已經被啟動,通過192.168.33.10可以直接訪問到WSL內部的網絡!

相關焦點

  • 從零實操基於WSL2 Docker部署Asp.Net Core項目
    安裝WSL 2WSL官方教程:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10Hyper-V說明:https://docs.microsoft.com
  • wsl2安裝Linux原生Docker
    其實wsl安裝Docker相關內容我已經在wsl整合k8s的相關內容中分享過了,但是為了方便各位小夥伴和自己查閱,我今天又做一個一次整理匯總,形成一個專門的文檔,算是對之前內容回顧和總結吧。準備工作daemonize安裝配置安裝daemonize是為了讓我們的wsl支持systemctl命令,然後激活Systemd,這些命令在後面啟動docker服務、創建集群的時候都要用到
  • Win10 Terminal + WSL 2 安裝配置指南,精緻開發體驗
    它有兩個版本,WSL 1 和 WSL 2。建議使用 WSL 2,它具有更好的整體性能。安裝 WSL 2,對不同架構的 CUP 有不同的 Win10 版本要求。為了簡單起見,你只需確保你的 Win10 版本號為 2004(內部版本19041或更高)即可。PS:使用 win + r 輸入 winver 可快速查看 Windows 版本。
  • 如何在Windows 10上安裝WSL 2(最新教程)
    因為在2020年8月,Microsoft將WSL 2反向移植到Windows 10的較早版本。任何使用1903或1909版本的人也可以安裝WSL 2——但必須先安裝Windows Update KB4566116。追求完美的Windows用戶還可以強制安裝Windows 10 2020 年 5 月更新,請記住,如果您按照這種方法操作,可能會遇到缺少的驅動程序,GUI故障或其他硬體故障。
  • AWS CDK 利用asset編譯Docker鏡像並部署到ECS Fargate (Python)
    win 升級包https://aka.ms/wsl2kernel圖 wls4在 Powershell 中運行命令「wsl --set-version2」升級指定 wls,是上面查到的已安裝的 WLS 的「Name」
  • 【win11】WSL2 遷移 & 遠程桌面 (xfce4版)
    遷移WSL2WSL命令查看安裝的虛擬機wsl -l -v關閉所有正在運行的虛擬機wsl --shutdown對需要遷移的分發或虛擬機導出虛擬機名稱:wsl -l -v可以查看名字,我的是Ubuntu-20.04文件導出路徑:我導出在D盤(D:\wsl-Ubuntu-20.04.tar
  • 使用 wsl-terminal 更好地體驗 Win 10 WSL 終端環境
    我是從去年 8 月開始開發 wsl-terminal[1](中文頁面[2])的,期間因為想不到可以添加什麼功能而擱置了比較長時間。最近心血來潮,添加了很多實用功能,用戶體驗也會上升很多。  install cbwin: 安裝 cbwin。  install dash: 安裝 Cygwin 中的 dash(用於調試)。  install busybox: 安裝 Cygwin 中的 busybox(用於調試)。
  • 【DB寶2】在CentOS7中安裝Docker
    一、安裝簡介二、在CentOS 7上安裝Docker常用命令三、執行過程: 3.1、卸載舊版本 3.2、安裝依賴包 3.3、安裝Docker四、一鍵安裝Docker一、安裝簡介Docker 運行在 CentOS 7 上,要求系統為64位、系統內核版本為 3.10 以上。
  • Docker 安裝
    # step 2: 安裝GPG證書curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -# Step 3: 寫入軟體源信息sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com
  • 通過docker安裝centos並安裝jenkins
    (系統環境MacOS,git版本2.0.1(很久之前裝的,一直沒再更新))docker常用命令
  • Docker學習1-CentOS 7安裝Docker
    前言docker 是一個開源的應用容器引擎,基於 Go語言 並遵從Apache2.0協議開源。docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。前提目前,CentOS 僅發行版本中的內核支持 docker。
  • Docker | 安裝——以Ubuntu為例
    整理自菜鳥教程 https://www.runoob.com/使用官方腳本自動安裝手動安裝卸載docker附:常見問題使用官方腳本自動安裝安裝命令如下:curl/docker | sh手動安裝卸載舊版本Docker 的舊版本被稱為 docker,docker.io 或 docker-engine 。
  • k8s Docker 安裝
    hostnameipresourcerolehsjry-16-114-128172.16.114.1282c2Gmasterhsjry-16-114-129172.16.114.1292c2Gnode1hsjry-16-114-130172.16.114.1302c2Gnode2二、介質準備需要下載安裝 docker 所需要的依賴和
  • 安裝虛擬機Centos系統並安裝Docker過程記錄
    前言本文主要介紹下1、Mac系統安裝虛擬機Centos72、Centos安裝docker、docker-compose的過程緣何說起這個話題,是因為之前一篇文章 遺留的問題安裝docker如果之前有安裝過docker 先刪除dockersudo yum remove docker \docker-client
  • Windows系統(離線)中安裝和使用Docker、Docker-compose
    本文將介紹如何在Windows系統(離線)中安裝和使用Docker、Docker-compose。該項目的Github地址為:https://github.com/percent4/windowns_install_docker。
  • Ubuntu安裝Docker採坑記錄
    更新apt包索引:sudo apt-get update# 2.2.2. 安裝DOCKER# 更新apt包索引。sudo apt-get update# 安裝最新版本的Docker,特定版本請添加版本號,如docker-ce=<VERSION_STRING>sudo apt-get install docker-ce docker-ce-cli containerd.io非root用戶使用docker如果您想以非root用戶使用Docker
  • 【Docker】:如何在 CentOS 8 中安裝 Docker Engine?
    系統要求 2. 配置倉庫 3. 安裝 Docker Engine 4. 啟動 Docker 5. 驗證 6. 小科普 6.1. libseccomp 是什麼?  6.2. seccomp是什麼?  6.3. BPF 又是什麼?sudo yum install -y yum-utils
  • Docker學習6-快速安裝jenkins及禪道系統
    前言今天我們來學習 docker 如何快速安裝 jenkins 和禪道系統。如果你們還沒有用禪道或其他管理工具,強烈推薦下趕緊 docker 安裝禪道就用用起來吧一、doocker 安裝 jenkins1、首先要安裝了 docker2、創建掛載目錄:jenkins,並且給與權限(不然起不來別怪我):# 更改目錄權限:給uid為1000的權限[root@iZbp19lugf22zbsubsf1y6Z ~]#
  • Ubuntu 20.04 LTS 上安裝 Docker Engine
    安裝的方法有多種,這裡用的是「repository」方法。