2021年9月19日 星期日

在 Windows 建立 Ubuntu 與 Docker 環境:透過 WSL 2

之前有安裝過 WSL(Windows Subsystem for Linux),不過沒怎麼認真地玩過細節。主要還是會想在 Windows 上建立 Docker 的環境,但之前的痛點是在於 Docker Desktop for Windows 原本的作法是要建立在 Hyper-V 之上,也就是會透過在 Hyper-V 上開 VM 的形式來達成建立 container,這效能實在是有點略差。最近看到 Docker Desktop 似乎可以改用 WSL 2 來建立 container,另外又看到有 Windows Terminal 這個東西,看起來可以在 Windows 上弄出很接近 Linux 的環境,所以就想說來試一下這個!

安裝 WSL2

首先可以先看看 WSL 1 和 WSL 2 的差異 [1],最主要對我來說重要的就是 WSL 2 效能提昇了,從結果來說,我目前也感覺 WSL 2 沒有明顯地感覺到慢,所以覺得還不錯。

要安裝 WSL,可以參考微軟的官方文件 [2]。比較簡單的作法是先加入 Windows 測試計畫 [3],加入完成後可能會需要重開機,然後再以系統管理員打開 PowerShell,輸入以下的指令安裝。

wsl --install

我自己因為之前曾經安裝過,所以最主要這裡需要做的事情是以下兩個動作

  1. 下載 Linux 核心更新套件,也就是 [2] 裡面的步驟 4
  2. 在 PowerShell 裡,把 WSL 預設的版本從 WSL 1 改為 WSL 2,也就是 [2] 裡面的步驟 5

    wsl --set-default-version 2

安裝 Ubuntu

接著是要選擇自己喜歡的 Linux Distribution 裝進 Windows 10 裡,這裡我選的是 Ubuntu,所以就是打開 Microsoft Store 搜尋 Ubuntu 然後安裝就好了。如果想要找別的 Linux Distribution,也可以自己搜尋,或者是從 [2] 的步驟 6 這邊的列表進去。

這裡需要注意的地方是,如果是在電腦裡有 WSL 1 但還沒設定 WSL 2 的情況下先安裝過 Linux Distribution 的話,有可能會需要自己把 distribution 的版本切到 WSL 2。檢查方法是在 PowerShell 上輸入以下的指令:

PS C:\WINDOWS\system32> wsl -l -v
  NAME                   STATE           VERSION
* Legacy                 Stopped         1
  docker-desktop-data    Running         2
  docker-desktop         Running         2
  Ubuntu                 Running         1

這裡就可以看到,我的 Ubuntu 目前是跑在 WSL 1 上的。要改為用 WSL 2 執行的話,需要針對這個 distribution 去設定預設版本。

PS C:\WINDOWS\system32> wsl.exe --set-version Ubuntu 2
正在進行轉換,這可能需要幾分鐘的時間...
有關 WSL 2 的主要差異詳細資訊,請瀏覽 https://aka.ms/wsl2
轉換完成。
PS C:\WINDOWS\system32> wsl -l -v
  NAME                   STATE           VERSION
* Legacy                 Stopped         1
  docker-desktop-data    Running         2
  docker-desktop         Running         2
  Ubuntu                 Stopped         2

設定完以後,再檢查一次就可以看到它的 version 變成 2 了。

安裝 Windows Terminal

安裝 Windows Terminal 的部份,建議直接看微軟的官方文件 [4] 比較快,因為官方文件上有截圖 😜。

Windows Terminal 可以開啟不同 profile 的 terminal,用起來其實也還不錯。在有裝好 Ubuntu 以後,Windows Terminal 就會出現 Ubuntu 的選項了。

讓 Docker Desktop 使用 WSL 2

最後一步其實才是我本來的目標,想要讓 Docker 能夠在 WSL 2 上執行。另一個是因為我裝了 Ubuntu 嘛,所以也想要透過 Windows Terminal 在 Ubuntu 裡能夠正常使用 Docker 指令。具體的文件可以參考 [5-6]。

主要會需要做的,就是先把 Docker Desktop 安裝或者升級到最新版,接著做以下兩個設定:

  • 在 Settings > General 裡,勾選 Use the WSL 2 based engine。
  • 在 Settings > Resources > WSL Integration 裡,將 Enable integration with additional distros 裡你想使用的 Linux Distribution 啟用。例如以我來說就是要啟用 Ubuntu。

如果之前的步驟都有好好做的話,到這裡應該不會遇到什麼問題,這邊做完以後,回去 Windows Terminal 的 Ubuntu 那邊打 docker 指令,應該就能正常使用了。

不過如果遇到了下述的錯誤訊息,那問題就會是 integration 沒有正確打開,有可能要往前推到你的 Linux distribution 沒有正確地以 WSL 2 作為預設的執行環境。

user@DESKTOP:/mnt/c/Users/user$ docker

The command 'docker' could not be found in this WSL 2 distro.
We recommend to activate the WSL integration in Docker Desktop settings.

See https://docs.docker.com/desktop/windows/wsl/ for details.
參考資料
  1. 比較 WSL 1 和 WSL 2
  2. Windows 10 上適用於 Linux 的 Windows 子系統安裝指南
  3. Windows 測試計畫
  4. 安裝和設定 Windows 終端機
  5. 在 WSL 2 上開始使用 Docker 遠端容器
  6. Ubuntu on WSL 2 Is Generally Available

沒有留言: