Windows 的「Windows Subsystem for Linux」(WSL)基本上是在 Windows 環境裡面建立出一個 Linux 子系統、方便使用者不需要太多的額外設定、就可以直接在 Windows 中使用接近 Linux 原生環境的工具。這東西對 Heresy 這種以 Windows 為主要環境、但是偶爾需要用到 Linux 環境的人來說,算是相當方便的!
以要跑 Linux 版的 Docker 容器來說,Heresy 現在其實也是不仰賴 Docker Desktop、而是直接在 WSL 的 Ubuntu 裡面安裝 docker.io 來跑(參考)。基本上還算方便,但是缺點就是這樣跑起來的 Linux Docker 其實是在 WSL2 的 VM 裡面,和 Windows 環境的網路其實是隔開的,在要跑 Server 的時候就不是很好用了。
而微軟現在發布了 WSL 2.9.3 的預覽版本(GitHub),提供了可以直接在 Windows Shell 下執行 Linux 容器的指令「wslc」!如此一來,就可以更簡單地在 Windows 環境下、不進到 WSL 系統就執行 Linux 版的 Docker 容器了!
官方的公告是《WSL container is now available for public preview》,由於現在還在預覽階段,所以必須在 Windows 下執行下面的指令來強制更新到預覽版:
wsl --update --pre-release
在更新完成後,把 PowerShell 重新啟動,就會有 wslc 這個可以用來取代 docker 的指令可以用了!理論上,大部分的指令應該都是把 docker 換成 wslc 就可以了、不需要學習新的指令;比較需要注意的,可能就是絕對路徑的部分了。
官方給的範例是:
wslc run -d --name=webtop -e PUID=1000 -e PGID=1000 -e TZ=Etc/UTC `
-p 3000:3000 -p 3001:3001 lscr.io/linuxserver/webtop:ubuntu-kde
這樣會執行一個 lscr.io/linuxserver/webtop:ubuntu-kde 的容器,然後可以透過 http://127.0.0.1:3000 來控制裡面的作業系統。
沒弄錯的話,由於微軟預設是把透過 --publish 發布的連接埠綁訂到 127.0.0.1 上,所以這邊會變成只能透過 127.0.0.1 來連線。
如果需要讓外部可以連線的話,就要在前面加上要綁定的 IP;或者寫成「-p 0.0.0.0:3000:3000」、讓所有 IP 的 3000 port 都可以連線。
如果是開發者要使用 NVIDIA CUDA 的話,他也是有支援的!要測試的話,只要執行:
wslc run --rm --gpus all ubuntu nvidia-smi
就可以看到容器內的 GPU 資訊了~(記得要使用 --gpus 指令要使用 GPU)
所以如果像是現在要跑 AI 的東西的話,基本上問題都不大~
wslc 的檔案目前應該會在 %LOCALAPPDATA%\wslc 下面,獨立於本來 WSL 的 VM 之外;所以透過 wslc 來執行容器的時候,和本來 WSL 的 VM 完全沒關係。
在 sessions 資料夾中會根據不同的工作階段有不同的資料夾,裡面有個別的 vhdx 來存放資料,目前還不確定能不能轉移到其他磁碟機、以避免佔用系統磁碟機的空間。
而底下還有一個 settings.yaml 的檔案(在 PowerShell 中執行「wslc settings」可以開啟),是用來做一些預設值的設定的;例如如果想要修改預設使用的 CPU 數量、記憶體大小、儲存空間上限,都可以在這邊調整。
前面提到預設使用 127.0.0.1 來作為發布網路連接埠的綁定 IP 的部分,也可以在這邊把「defaultBindingAddress」的預設值改掉;雖然可能會比較不安全,但是有需要的話,改成 0.0.0.0 會比較方便。
現在比較可惜的,是 wslc 還不支援 compose,所以對應到 docker compose 的功能應該是都還不能用,就看之後有沒有機會補上吧。
另外,比較麻煩的是現在其實已經很習慣直接輸入 docker 了,所以初期還滿容易打錯。 :p
Heresy 自己是因為還要執行 Windows Docker(參考),否則還會想幫 wslc 建立 docker 這個別名;建立後應該是有機會連使用習慣都幾乎不用變。 :p
另外,微軟也還有針對 WSL 容器的功能提供 API(C / C++ / C#),方便開發者在程式中呼叫;變成可以在 Windows 的應用程式中、透過 wslc 的功能來執行 Linux 的工作流程。在某些情境下,這應該也會是相當實用的!
而針對以往相對孱弱的檔案存取效能來說,官方是號稱 WSLC 使用的預設檔案系統 virtiofs 在存取 Windows 檔案時會快兩倍。
在網路的部分,針對 WSLC 微軟使用了一個新的「Consomme」模式來做網路流量的轉發,號稱可以提高網路的相容性。
額外參考:《Microsoft denies WSL 3 exists, reveals Windows 11’s WSL Containers ship next week》
