Windows Subsystem for Linux 2 + Docker

| | 0 Comments| 16:16
Categories:

在 2016 年,微軟發表了後來被稱為「WSL」(Windows Subsystem for Linux )的 Ubuntu on Windows 10,讓 Windows 10 的使用者,可以不需要透過虛擬機器或容器,就可以直接執行 Linux 的原生程式!

當然,在使用上其實也還是有不少的限制,不過對於 Heresy 這類以 Windows 為主力、卻需要開發部分 Linux 環境的程式的人來說,其實算是相當實用的了!

Heresy 之前也有寫過一些簡單的紀錄:

不過,由於 WSL 本身架構的限制,像是許多 system call、或是 Docker 這類的程式似乎也都是沒辦法運作的了,在使用上還是有一定程度的侷限性。

也因此,後來微軟也開始發展「WSL2」、來提供完整的 Linux 環境,讓使用者可以有完整的功能。

比較有趣的是,WSL 剛推出的時候,微軟還有特別強調不是使用 VM 或容器來運作的,但是 WSL2 還是回過頭來、使用 VM 來提供完整的 Linux Kernel 了(官方稱之為「lightweight utility virtual machine」)。

上圖就是官方《Comparing WSL 2 and WSL 1》文章中的比較表。


不過比較遺憾的是,WSL2 還是綁著 Windows 10 的大更新推出的,所以一般人的正式版 Windows 10(1909)都還不能使用。

而現階段如果要使用的話,需要加入「Windows 測試人員計畫」、將 Windows 的版本切換到「發行預覽」版、安裝 Windows 10 2004(build 19041 以上)才行。

如果已經安裝了 Windows 10 2004 的話,那就可以按照官方的《Windows Subsystem for Linux Installation Guide for Windows 10》的文件,來安裝 WSL2 了。

安裝的步驟,主要是要先安裝 WSL 這個選用功能;要方便的話可以透過指令來啟用(需要系統管理員權限):

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

玩成之後,就可以到 Windows Store 上去找自己需要的版本了~

目前版本還滿多的(參考),除了最初的 Ubuntu 外,現在也可以選擇 SUSE、Kali、Debian 等不同的版本來使用。


由於目前是 WSL1 和 WSL2 並存的階段,所以其實也可以自己決定個別的 Linux 系統要使用哪個版本。

這部分的控制目前需要透過「wsl」這個命令來做設定。

透過「wsl -l -v」這個指令,可以列出目前系統上的 WSL distribution、以及其使用的版本;像下面列表中,Ubuntu 18 就是用 WSL1、Ubuntu 20 則是使用 WSL2。

PS C:UsersHeresy> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-18.04           Stopped         1
  docker-desktop-data    Running         2
  docker-desktop         Running         2
  Ubuntu-20.04           Running         2

如果想要在 WSL1 和 WSL2 之間轉換的話,則可以透過「–set-version」這個參數來進行;例如如果要把上面的 Ubuntu 18 也改成 WSL2 的話,指令就是:

wsl --set-version Ubuntu-18.04 2

不過轉換需要一定的時間,所以應該也不太適合高頻率的轉換就是了。

而透過「wsl –set-default-version 2」,則可以設定之後新的 WSL distribution 都一律使用 WSL2。

另外,或許是 Heresy 因為是從已經有在使用 WSL1 的 Windows 1909 升級上去的關係吧?在要使用 WSL2 的時候,系統還有提示需要安裝 WSL2 的 Linux Kernel 更新(下載頁面),需要自行手動下載安裝。


而在 Docker 的部分,目前新版的 Docker Desktop 版也已經有支援 WSL2 的整合了!(官方文件

在更新之後,在「Settings」的「Resources」下,就可以看到「WSL Integration」的區塊,裡面可以設定是否要使用 WSL2 來執行 Docker。

而這樣設定好了之後,透過 Windows PowerShell 來執行 Docker 的指令的時候,看到的結果就會和 WSL 裡面看到的一樣了~

而實際上,這是由於 WIndows Docker 這邊是透過直接去操作 WSL2 內的 Docker 來提供 Windows 環境使用;所以其實這時候的 Docker 就只支援 Linux 容器、而不支援 Windows 容器了。

也因此,如果還是有需要使用 Windows Docker 的話,還是不能這樣玩的。


由於 Heresy 這邊是希望可以同時跑 Windows Docker 容器和 Linux 容器,所以看來是沒辦法簡單地透過這種方法來完成。

要讓 Windows 環境還是可以跑 Windows 容器的話,基本上來是需要把 Docker Desktop 切換成 Windows 版本的容器。

而此時呢,WSL 下的 Docker 就會出現 Docker daemon 預設沒有執行起來、所以無法執行對應的指令的狀況。

如果是 Ubuntu 18 的話,基本上在安裝過 Docker 後(apt install docker.io),只要透過 service docker start 來啟動 Docker daemon 就可以了;不過缺點就是如果 WSL2 的機器因為沒有工作停了,在重新執行 WSL 的時就需要重新手動啟動一次。

不過,搭配一些額外的設定,似乎也是也有辦法讓他可以每次都自動執行的。
(參考:《最近開始改用 WSL2 跑 docker 當開發環境》)

至於 Ubuntu 20…比較奇怪的是,沒辦法透過「service」或「systemctl」的指令來啟動 Docker daemon,目前 Heresy 是得直接執行「dockerd &」來讓 Docker daemon 在背景執行。


其他:

  • WSL2 的檔案在 Windows 下可以透過「\wsl$」來存取

  • 可以透過建立一個「%UserProfile%.wslconfig」設定檔,來針對 WSL2 的設定 WSL2 使用的資源(官方文件)。

  • WSL2 內沒有網路連線:似乎可以透過重新啟動 Windows 下的「LxssManager」這個服務來解決(參考)。

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *