Win10 WSL2 安裝Docker

背景

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

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

步驟

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

更新 Win10 到2004版本

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

啟用Linux子系統

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

切換系統WSL默認版本到2

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

wsl --set-default-version 2

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

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

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

WSL2內核下載鏈接

安裝Ubuntu發行版

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


Ubuntu搜索頁面

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

wsl -l -v

如果看到如下信息:

  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2

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

wsl --shutdown

然后執行:

wsl --set-version <Linux發行版名稱> 2

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

安裝Docker

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

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源:
依次執行如下命令:

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的命令行,虛擬機會自動啟動運行。如果我們查看任務管理器,會發現一個Vmmem進程。如下所示:


Vmmem進程

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

wsl --shutdown

卸載發行版

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

wslconfig /l

命令查看系統內安裝的Linux發行版。
然后使用:

wslconfig /u <發行版名稱>

卸載掉指定的發行版Linux。

和宿主機Win10文件系統相互訪問

在Win10下訪問Linux子系統文件

進入CMD或者PowerShell,輸入:

cd \\wsl$\Ubuntu-20.04\

可以進入到Linux子系統根目錄。如下圖所示:


CMD進入Linux子系統根目錄

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

文件資源管理器進入Linux子系統根目錄

Linux子系統訪問Win10文件

進入Linux子系統運行df -h,看到如下輸出:

df -h輸出

注意觀察后兩行。本人電腦有兩個分區。/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 正式版本已經發布,無需再使用測試版。已經安裝測試版的用戶建議升級為正式版。

Docker Desktop for Windows

后來發現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已經卸載,如果沒有卸載,可以執行:

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

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

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


Settings界面

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

遷移WSL 到非系統盤

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

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

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

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

遷移過程分為3步:

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

獲取系統當前已安裝的發行版。例子中返回的發行版名稱為Ubuntu-20.04

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

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

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

等待命令執行完畢返回。

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

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

FAQ

systemctl命令無法使用

現象為在命令行執行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. 執行source /etc/profile或者是重新打開terminal,執行systemctl驗證是否能夠正常操作。

Vmmem 進程占用過多內存

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

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

這里限制了vmmem進程最大內存不超過6GB,不使用交換空間。
創建完配置文件后,執行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已安裝完畢。我們可以執行podman info命令,驗證是否安裝成功。

WSL2 系統占用磁盤空間不釋放

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

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

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系統虛擬磁盤文件路徑。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370