同一台電腦可執行Windows與Linux Container?在WSL2安裝原生Docker環境

如果想要在同一台電腦中既可以執行Windows Container,又可以執行Linux Container,以便測試程式在不同環境之下執行的結果或是設定值的差異,該如何達到這樣的需求呢?

答案就是:利用Windows中的Linux子系統(Windows Subsystem for Linux, WSL)。

透過WSL安裝Linux子系統之後,可以在Linux子系統中安裝原生的Docker執行環境,在Windows環境中則是安裝Docker Desktop並且切換到使用Windows Container,這樣一來就可以在Windows環境執行Windows Container,Linux子系統中執行Linux Container了。

註:WSL是Windows 10的功能,版本又分為Version 1(WSL)與Version 2(WSL2),WSL2只能在Windows 10 2004版(組建19041以上)執行。(參考官方wsl文件說明)

在開始之前,先輸入wsl -l -v查看一下系統內安裝的Linux子系統是執行在哪一個版本(1或2)。
在Linux子系統中要執行原生的Docker,只能在Version 2的版本(WSL2)。

使用wsl -l -v查看系統中 Linux子系統執行的版本

先輸入docker info確認系統中沒有安裝docker。

輸入docker info確認系統中確實沒有安裝docker

接著,根據官方的安裝指引將Docker Engine安裝到Linux子系統中:

更新系統中的套件

先輸入sudo apt-get update更新系統中的套件。

先輸入sudo apt-get更新系統中的套件

安裝需要的套件

再輸入下列指令安裝docker需要的其它套件:

sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common

註:「\」符號是Linux指令的換行連接符號,用來將較長的指令換行輸入,實際上在系統中仍然是組合成一整行的指令,因此也可以將上面的指令直接輸入成一行。(記得拿掉「\」符號)

安裝docker前需要安裝的套件

安裝上述幾個套件的過程中會碰到詢問y/n的問題,通常是告知會使用多少磁碟空間,輸入y繼續安裝就行了。

安裝apt-transport-https、ca-certificates、curl、gnupg-agent、software-properties-common套件與其相依的套件

取得GPG Key

接下來取得docker的GPG key:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

註:「|」符號是Linux中的命令管線符號,用來將前一個命令執行的結果送到下一個命令的輸入。

透過curl取得docker的GPG key

接下來這一步可以跳過,只是用來驗證剛才取得的GPG key是否正確。

sudo apt-key fingerprint 0EBFCD88

輸入完之後會看到下面9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88的內容。

驗證取得的GPG key

加入套件存放庫(Repository)

接下來將docker官方的套件存放庫(repository)加入到Linux子系統中,這樣才能夠安裝docker engine:

sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
將docker的套件庫加入到系統中

小提示:如果你發現你的網址輸入錯誤.也就是在輸入指令之後下面的訊息有顯示Err的字樣,那麼可以編輯套件庫清單的設定檔,將錯誤的網址修正或移除重新加入。(參考來源)

sudo nano /etc/apt/sources.list

安裝Docker Engine

輸入下面兩行指令安裝Docker Engine,第一行是更新套件指令,第二行則是安裝Docker的指令

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

安裝過程中會有個磁碟空間耗用的問題,輸入y就能繼續。
接著會碰到下面的問題,是詢問grub-pc套件要裝在哪一個磁碟分割:

選擇grub-pc套件要安裝的目標

grub-pc應該是一個啟動管理的套件,不太確定是上面哪個套件相依的需求,以上圖來看,Linux子系統抓到三個(實際上只有sda、sdb兩個)容量大小相同的項目。
透過空白鍵可以選擇/取消,想知道sda、sdb分別是什麼的話,可以再另外開一個cmd或powershell視窗,輸入wsl透過另外一個terminal進入查看:

透過df -hlsblksudo blkid指令查看磁碟資訊

從上面可以發現sda、sdb其實是一樣的,只是檔案系統實際上掛載在sdb項目,所以選擇sda、sdb也許都可以,不過實際上選擇第一個sda項目的時候,安裝到一半會出現下面的錯誤訊息:

無法安裝在sda

既然無法安裝在sda,那麼就不要霸王硬上弓硬是要安裝在sda,所以選擇No之後,回到上面的選單項目,將sda取消,選擇第二個sdb試試。
沒有再出現上面無法安裝詢問是否要霸王硬上弓的問題,順利安裝完成。

輸入docker info查看安裝的結果,只顯示client資訊,server資訊則是無法連線,其實這只是docker service沒有啟動的關係。

輸入sudo service docker start啟動docker服務,再次輸入docker info查看docker的資訊卻發現…

看起來和上面那張截圖滿像的,不過最後有個關鍵字是「permission denied」。
既然如此,那使用sudo執行看看呢?(sudo docker info)

Bingo,能夠正常查看到docker的資訊了!

不過這樣每次要執行docker相關的指令都要輸入sudo有點麻煩,所以接著可以利用下面的指令,將docker加入特定的用戶群:

sudo usermod -aG docker 帳號

輸入完上面的指令之後,如果直接再次輸入docker info想要試試是否有效,會得到令人失望的結果。主要是因為當下使用的terminal沒有登出再重新登入取得最新的資訊,只要退出terminal之後再重新執行就可以正常了。

輸入完sudo usermod -aG docker <em>帳號</em>,需要離開wsl再重新進入才會生效

OK,這下子終於將docker順利安裝在WSL2裡面啦~

從下面的截圖也可以發現,在wsl裡面查看docker info和windows底下查看docker info的差異,證明兩個docker環境是彼此分開獨立的喔!

PS.Windows環境安裝Docker Desktop並且切換到Windows Container模式了,這樣一來就可以在一台電腦中同時執行Linux Container與Windows Container了。

同一台電腦中同時執行Windows Docker與Linux Docker環境

發佈留言

%d 位部落客按了讚: