Win10 WSL2 安裝Docker

背景

由于新款Mac性價比走低,近期轉為使用Windows作為主力開發(fā)系統(tǒng)。但是在開發(fā)過程中需要上Linux測試,或者說部署一些服務,例如MySQL,Nexus OSS等。本人又是一個Docker重度依賴者。之前一直是長期在Windows下啟動一個Linux虛擬機輔助開發(fā)操作。占用大量磁盤內存資源不說,操作和維護也極為繁瑣。

直到近期了解到Win10 2004正式版版本支持WSL2,問題得到了完美的解決。WSL2相比WSL1來說可以完美支持Docker。與WSL1的模擬Linux API不同的是,WSL2采用在Hyper-V虛擬機中運行的方案??梢哉fWSL2和原汁原味的Linux已經十分接近。本人實驗了一番,安裝部署成功,將整個步驟分享給大家。

步驟

下面為大家詳細介紹具體的操作步驟。

更新 Win10 到2004版本

使用Windows Update自動更新到2004版本。如果沒有檢測到更新,可以去微軟官網下載“易升”工具并安裝運行。工具會檢測到更新并安裝。

啟用Linux子系統(tǒng)

打開 控制面板 -> 程序 -> 啟用或關閉Windows功能。找到“適用于Linux的Windows子系統(tǒng)”和“虛擬機平臺”,勾選這兩項之后確定,并重新啟動計算機。

切換系統(tǒng)WSL默認版本到2

使用管理員用戶打開CMD,運行:

wsl --set-default-version 2

注意,有可能會出現如下提示:

WSL 2 需要更新其內核組件。有關信息,請訪問 https://aka.ms/wsl2kernel

出現這個提示,說明需要更新WSL2的內核。按照提示打開https://aka.ms/wsl2kernel鏈接。點擊下圖中的下載鏈接,下載并安裝WSL2內核。

WSL2內核下載鏈接

安裝Ubuntu發(fā)行版

打開Microsoft Store,搜索ubuntu,界面如下所示:


Ubuntu搜索頁面

根據自己的需要,選擇對應的Ubuntu版本并安裝。
完成之后在開始菜單會出現Ubuntu菜單項。打開它,Ubuntu將會進行初始化操作。等待幾分鐘后按照提示,為Ubuntu設置用戶名和密碼。
最后,我們需要驗證Ubuntu是否在WSL2的環(huán)境下啟動。以管理員用戶打開CMD,執(zhí)行:

wsl -l -v

如果看到如下信息:

  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2

說明Ubuntu在WSL2環(huán)境下運行。到此為止安裝完畢。
如果發(fā)現VERSION為1,說明Ubuntu運行在WSL1下。需要手工切換。
首先關閉WSL下運行的Linux,執(zhí)行:

wsl --shutdown

然后執(zhí)行:

wsl --set-version <Linux發(fā)行版名稱> 2

其中Linux發(fā)行版名稱為前面安裝的Linux名稱,可以通過wsl -l -v命令查看。執(zhí)行命令后等待片刻。等命令行提示轉換完成,我們已經成功將Linux切換到WSL2環(huán)境。

安裝Docker

首先進入Ubuntu shell,更換Ubuntu官方源為國內源,加快下載速度。執(zhí)行。

vim /etc/apt/sources.list

將內容替換為下方:

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

接下來添加Docker源:
依次執(zhí)行如下命令:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
   "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

sudo apt update

配置完成軟件源之后下一步是安裝Docker,命令如下:

sudo apt install -y docker-ce

最后一個步驟,啟動Docker daemon。但是此處有一個問題,WSL2經過測試無法使用systemctl命令(此問題已經解決,參見博客末尾FAQ),因此我們使用service命令啟動Docker daemon。命令如下所示:

sudo service docker start

至此,Docker 在WSL2下安裝完畢。

注:WSL2 Docker最爽的地方是和宿主機Win10共享network,我們在宿主機Win10使用localhost加端口號就可以訪問Docker中對應container中的服務,十分方便。

關閉虛擬機

WSL2實際上是在虛擬機中運行。我們一旦進入WSL2 Linux的命令行,虛擬機會自動啟動運行。如果我們查看任務管理器,會發(fā)現一個Vmmem進程。如下所示:


Vmmem進程

該進程是虛擬機的進程。它比較占內存。不使用WSL2的時候我們可以關閉它以節(jié)省內存。關閉WSL2 Linux的方法如下。使用管理員打開CMD,運行:

wsl --shutdown

卸載發(fā)行版

有時候某個Linux發(fā)行版不再使用,或者是環(huán)境被搞壞需要重裝,這時候我們可以卸載掉這個Linux發(fā)行版。方法如下。
首先使用:

wslconfig /l

命令查看系統(tǒng)內安裝的Linux發(fā)行版。
然后使用:

wslconfig /u <發(fā)行版名稱>

卸載掉指定的發(fā)行版Linux。

和宿主機Win10文件系統(tǒng)相互訪問

在Win10下訪問Linux子系統(tǒng)文件

進入CMD或者PowerShell,輸入:

cd \\wsl$\Ubuntu-20.04\

可以進入到Linux子系統(tǒng)根目錄。如下圖所示:


CMD進入Linux子系統(tǒng)根目錄

或者打開文件資源管理器,在地址欄輸入\\wsl$\Ubuntu-20.04,也可以跳轉到Linux子系統(tǒng)根目錄。

文件資源管理器進入Linux子系統(tǒng)根目錄

Linux子系統(tǒng)訪問Win10文件

進入Linux子系統(tǒng)運行df -h,看到如下輸出:

df -h輸出

注意觀察后兩行。本人電腦有兩個分區(qū)。/mnt/c/mnt/d正好分別對應本機的C盤和D盤。

和VMWare的共存問題

目前VMWare 15版本無法在啟用Hyper-V虛擬機,即啟用WSL2的Win10上運行。但是經過本人實驗,VMWare最新的測試版是可以和Hyper-V共存的。下面是測試版VMWare的下載鏈接:
https://download3.vmware.com/software/wkst/file/VMware-workstation-full-e.x.p-16227267.exe
下載安裝包之后,按照向導提示升級安裝VMWare即可。該版本VMWare可以和WSL2完美共存。

更新內容:

VMWare Workstation 16 正式版本已經發(fā)布,無需再使用測試版。已經安裝測試版的用戶建議升級為正式版。

Docker Desktop for Windows

后來發(fā)現Docker Desktop windows版已經能夠支持WSL作為Docker Engine運行,可以同時支持在Linux和Windows命令行下操作docker,這樣遠比前文中單獨安裝Linux Docker使用起來靈活。下面將安裝Docker Desktop for Windows的方法分享。

  1. 瀏覽器打開https://www.docker.com/products/docker-desktop
    點擊Download for Windows (stable),下載Docker安裝程序。

  2. 確保WSL內的Docker已經卸載,如果沒有卸載,可以執(zhí)行:

sudo apt remove docker-ce
sudo apt remove docker-ce-cli
  1. 雙擊下載的安裝程序安裝,記住選擇使用WSL作為Docker引擎。

  2. 在Windows注銷當前用戶重新登錄。到此Docker Desktop for Windows安裝完畢。

注意:如果發(fā)現在WSL下無法執(zhí)行docker命令,可以通過如下操作打開:
進入Docker Desktop的settings,如下所示:


Settings界面

依次點擊Resources -> WSL INTEGRATION,打開右側的Ubuntu開關,點擊對話框右下角的Apply & Restart按鈕

遷移WSL 到非系統(tǒng)盤

默認WSL總是安裝到C盤,這樣對于C盤空間緊張的用戶完全不友好。

我們可以使用LxRunOffline工具來遷移WSL到其他磁盤分區(qū)。

LxRunOffline的下載鏈接:https://github.com/DDoSolitary/LxRunOffline/releases。在Win10 PowerShell運行需要下載LxRunOffline-vx.x.x-msvc.zip版本。解壓到任意目錄即可使用。

LxRunOffline是一個第三方WSL Linux發(fā)行版管理工具,可以認為是wsl命令的增強版。它可以安裝和卸載Linux發(fā)行版,遷移,復制,導入導出和設置環(huán)境變量等。具體的使用幫助可執(zhí)行.\LxRunOffline.exe \h查看命令介紹。

遷移過程分為3步:

  1. 獲取準備遷移的發(fā)行版名稱。執(zhí)行:
PS C:\Users\xxx\Desktop> .\LxRunOffline.exe list
Ubuntu-20.04

獲取系統(tǒng)當前已安裝的發(fā)行版。例子中返回的發(fā)行版名稱為Ubuntu-20.04

  1. 執(zhí)行遷移命令。格式如下:
.\LxRunOffline.exe m -n <發(fā)行版名稱> -d <目標路徑>

比如我們要將Ubuntu-20.04移動到D:\Ubuntu-20.04,執(zhí)行如下命令:

.\LxRunOffline.exe m -n Ubuntu-20.04 -d D:\Ubuntu-20.04

等待命令執(zhí)行完畢返回。

  1. 查看遷移后發(fā)行版的安裝路徑。執(zhí)行:
PS C:\Users\xxx\Desktop> .\LxRunOffline.exe di -n Ubuntu-20.04
D:\Ubuntu-20.04

返回的安裝位置是D:\Ubuntu-20.04,說明遷移成功。

FAQ

systemctl命令無法使用

現象為在命令行執(zhí)行systemctl命令,報如下錯誤:

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

參考了https://forum.snapcraft.io/t/running-snaps-on-wsl2-insiders-only-for-now/13033之后給出如下解決方案:

  1. 安裝daemonize和fontconfig
apt install -y fontconfig daemonize
  1. 編輯/etc/profile腳本,加入如下內容:
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | 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$' | grep -v unshare | awk '{print $2}')
fi

if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
    exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -a su - $LOGNAME
fi
  1. 修改/etc/sudoers文件,加入如下內容:
%sudo ALL=(ALL) NOPASSWD: /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
%sudo ALL=(ALL) NOPASSWD: /usr/bin/nsenter -t [0-9]* -a su - [a-zA-Z0-9]*
  1. 執(zhí)行source /etc/profile或者是重新打開terminal,執(zhí)行systemctl驗證是否能夠正常操作。

Vmmem 進程占用過多內存

我們可以通過WSL的配置文件,限制vmmem進程的內存占用。在%UserProfile%目錄創(chuàng)建.wslconfig文件,添加如下內容:

[wsl2]
memory=6GB
swap=0
localhostForwarding=true

這里限制了vmmem進程最大內存不超過6GB,不使用交換空間。
創(chuàng)建完配置文件后,執(zhí)行wsl --shutdown關閉WSL,再重新啟動即可生效。

參考資料:
https://github.com/microsoft/WSL/issues/4166
https://docs.microsoft.com/en-us/windows/wsl/release-notes#build-18945

(可選)使用Podman取代Docker

Podman已成為CentOS8官方御用容器管理器,并且Kubernetes1.12已經放棄對Docker的支持。相比Docker,Podman無需守護進程,不強制要求使用root用戶來管理容器,具有更好的靈活性和安全性。Podman使用方式和Docker完全相同,兼容Docker的鏡像格式。
經本人試驗Podman可以完美的在WSL2 Ubuntu中運行。

在WSL2中安裝Podman的方法可參考如下鏈接:https://www.redhat.com/sysadmin/podman-windows-wsl2

下面腳本為Podman的安裝腳本:

. /etc/os-release
sudo sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/x${NAME}_${VERSION_ID}/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list"
wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/x${NAME}_${VERSION_ID}/Release.key -O Release.key
sudo apt-key add - < Release.key
sudo apt-get update -qq
sudo apt-get -qq -y install podman
sudo mkdir -p /etc/containers
echo -e "[registries.search]\nregistries = ['docker.io', 'quay.io']" | sudo tee /etc/containers/registries.conf

如果沒有其他報錯信息,到這里Podman已安裝完畢。我們可以執(zhí)行podman info命令,驗證是否安裝成功。

WSL2 系統(tǒng)占用磁盤空間不釋放

WSL2本質是虛擬機,它使用的是vhdx虛擬磁盤格式。它支持自動擴容,但是并不會自動縮容。

我們可以使用diskpart命令,手工執(zhí)行縮容操作。

diskpart
# open window Diskpart
select vdisk file="D:\WSL\Ubuntu\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

其中D:\WSL\Ubuntu\ext4.vhdx為WSL2系統(tǒng)虛擬磁盤文件路徑。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容