如果想要在同一台電腦中既可以執行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)。
先輸入docker info
確認系統中沒有安裝docker。
接著,根據官方的安裝指引將Docker Engine安裝到Linux子系統中:
- Ubuntu:https://docs.docker.com/engine/install/ubuntu/
- Debian:https://docs.docker.com/engine/install/debian/
- CentOS:https://docs.docker.com/engine/install/centos/
- Fedora:https://docs.docker.com/engine/install/fedora/
更新系統中的套件
先輸入sudo apt-get update
更新系統中的套件。
安裝需要的套件
再輸入下列指令安裝docker需要的其它套件:
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
註:「\」符號是Linux指令的換行連接符號,用來將較長的指令換行輸入,實際上在系統中仍然是組合成一整行的指令,因此也可以將上面的指令直接輸入成一行。(記得拿掉「\」符號)
安裝上述幾個套件的過程中會碰到詢問y/n的問題,通常是告知會使用多少磁碟空間,輸入y繼續安裝就行了。
取得GPG Key
接下來取得docker的GPG key:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
註:「|」符號是Linux中的命令管線符號,用來將前一個命令執行的結果送到下一個命令的輸入。
接下來這一步可以跳過,只是用來驗證剛才取得的GPG key是否正確。
sudo apt-key fingerprint 0EBFCD88
輸入完之後會看到下面9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
的內容。
加入套件存放庫(Repository)
接下來將docker官方的套件存放庫(repository)加入到Linux子系統中,這樣才能夠安裝docker engine:
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
小提示:如果你發現你的網址輸入錯誤.也就是在輸入指令之後下面的訊息有顯示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應該是一個啟動管理的套件,不太確定是上面哪個套件相依的需求,以上圖來看,Linux子系統抓到三個(實際上只有sda、sdb兩個)容量大小相同的項目。
透過空白鍵可以選擇/取消,想知道sda、sdb分別是什麼的話,可以再另外開一個cmd或powershell視窗,輸入wsl透過另外一個terminal進入查看:
從上面可以發現sda、sdb其實是一樣的,只是檔案系統實際上掛載在sdb項目,所以選擇sda、sdb也許都可以,不過實際上選擇第一個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之後再重新執行就可以正常了。
OK,這下子終於將docker順利安裝在WSL2裡面啦~
從下面的截圖也可以發現,在wsl裡面查看docker info和windows底下查看docker info的差異,證明兩個docker環境是彼此分開獨立的喔!
PS.Windows環境安裝Docker Desktop並且切換到Windows Container模式了,這樣一來就可以在一台電腦中同時執行Linux Container與Windows Container了。