在 Windows 上使用 WSL 2 安裝 Linux
前言
Docker Desktop 的 Linux Containers 大致有以下架構:
- Moby VM:Linux Containers 建立在 Moby VM 所建立的 Linux Container Host裡,完整內容請參考Windows 10 上的 Linux 容器。
- LCOW:Docker Desktop 所提出一個實驗性架構,可讓 Windows / Linux 兩種 Containers 同時運行,可以參考此篇文章了解兩者的架構差異。
- WSL 2:Windows Subsystem for Linux 2 的縮寫,為 Microsoft 所提供存在於 Windows 底下擁有完整 Linux 內核的子系統,可直接在 Windows 利用檔案總管或 Command Line 方式操作 Linux檔案。
Windows 安裝 WSL 2 的版本要求
- Windows 10 必需為 2004 版(組建 19041) 或更新版本。
- Windows 11。
安裝 WSL 2
- 以下指令使用 Windows PowerShell(系統管理員身分) 輸入。
- 看到 <DistributionName>,則替換成要安裝的 Linux 套件。
安裝 WSL 2。
bashwsl --install # or wsl --install -d <DistributionName>
TIP
- 未指定 Linux 發行版時,預設為 Ubuntu。
- 只有尚未安裝任何 Linux 發行版時,才可不指定 Linux 發行版。
- 可用
wsl --list --online或wsl -l -o查詢可安裝的 Linux 發行版名稱。
將 WSL 2 設定為預設版本。
bashwsl --set-default-version 2設定剛安裝的 Linux 發行版的 WSL 版本設定為 2。
bashwsl --set-version <DistributionName> 2設定預設 Linux 發行版。
bashwsl --set-default <DistributionName> # or wsl -s <DistributionName>
TIP
- 可用
wsl --list --verbose或wsl -l -v查詢目前已安裝和正在使用的套件為何。安裝 Docker Desktop 時,如果有勾選「Install required components for WSL 2」,會安裝以下兩個 Linux 發行版:
- docker-desktop:用於運行 Docker Engine(dockerd)。
- docker-desktop-data:用於存儲 Containers 和 Images。
移除 Linux 發行版。
bashwsl --unregister <DistributionName>
WARNING
請注意,移除 Linux 發行版將會刪除相應的資料夾及所有資料,無法復原。
官方相關文件
Linux Containers 整合 WLS 2
Docker 官方提到 Linux Containers 改為整合 WLS 2 有以下優點:
- Docker Desktop 使用 WSL 2 中的動態記憶體分配功能,極大地改善了資源消耗。
- 使用 WSL 2,冷啟動後啟動 Docker 守護程式所需的時間明顯加快。
Linux Containers 模式下要整合 WSL 2 需進行以下設定:
- [x] Settings > General > Use the WSL 2 based engine。
- [x] Settings > Resources > WSL Integration:
- [x] Enable integration with my default WSL distro。
- [x] 在「Enable integration with additional distros:」底下專案啟用要使用 Linux 套件。
官方相關文件
Docker Desktop WSL 2 backen在 WSL 2 上開始使用 Docker 遠端容器
同時運行 Windows Containers 和 Linux Containers
Docker Desktop 有 Windows Containers 和 Linux Containers 兩個模式,但同時間只能運行一個。過往曾在v17.09登出實驗性質的 Linux Container On Windows(LCOW),可讓 Docker 在 Windows Containers 模式下利用 Hyper-V Container 來同時運行 Linux Containers 的能力,不過這項實驗性功能已經廢止了。
但目前有了 WSL 2 以後,電腦上是可以同時運行 Windows 和 Linux 兩個系統,所以可以將 Docker Desktop 切換成 Windows Containers,Linux 安裝 Docker Engine 來運行 Linux Containers。
目前 Docker 版本第一次切換 Windows Containers 需使用執行以下指令,相關討論請參考此篇 Qestion:
Enable-WindowsOptionalFeature -Online -FeatureName $("Microsoft-Hyper-V", "Containers") -All如果執行 docker-compose up,出現以下錯誤訊息,請參考此篇文章解決。
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/create: dial unix /var/run/docker.sock: connect: permission denied. See 'docker run --help'.目前的 Ubuntu 已有預設安裝 Docker Engine,如果剛安裝完 WSL 2 Ubuntu覺得預設版本太舊,可參考官網文章更新 Docker Engine 版本。
Windows 與 Linux 發行版互相存取資料的方法
- Windows 可在檔案總管上方路經輸入
\\wsl$\<DistributionName>連至 Linux 發行版根目錄,<DistributionName> 為要連結的發行版名稱;透過\\wsl$存取 Linux 檔案將會使用 WSL 發行版本的預設使用者。 - 而 Linux 則是透過路徑
/mnt/<WindowsDriveLetter>連至各硬碟根目錄,<WindowsDriveLetter> 為要連結的硬碟代號;而 Linux 發行版存取 Windows 檔案時,檔案權限會從 Windows 權限中計算,或從已由 Linux 新增至檔案的中繼資料中讀取。
詳細的內容請參閱
未解決問題
- 當切換至 Windows Container 時,重開機 WSL 2 裡的 Docker 不會自動啟動。
- 網路上有些提到安裝 WSL 2的方式是此篇「舊版 WSL 的手動安裝步驟」提到的舊安裝方法,根據此篇文章提到有可能會造成 Windows 的「檔案總管」無法透過「網路芳鄰」異動 Linux 上面的檔案,但我用新版方式安裝後發現,除了用戶資料夾(/home/{使用者帳號}/)以外的檔案,重開機仍有此問題,所以對於不習慣 Linux 介面的人來說,可能要評估是否要將資料集中存放在用戶資料夾底下。
以上問題可能可以在 WSL 中的進階設定組態 找到解決方案,但我尚未親自測試。
有關 Docker 重啟的問題,或許可以透過 boot 設定來執行 Docker 自動重啟指令。
至於檔案權限問題,可以通過設定 umask、fmask 和 dmask 來解決,但我不熟悉 Linux 權限設定,具體怎設定並不清楚。不過,如果不在乎安全性風險,也可以考慮直接在 user 設定 default = root(但這不建議)。
異動歷程
- 2022-10-24 初版文件建立。
- 2024-10-30
- 將簡寫指令改為完整指令。
- 補充解除安裝 WSL 的指令。
- 嘗試提供之前問題的解決方案。
- 2026-01-22
- 修正設定預設 Linux 發行版的指令。
