之前在《Windows Subsystem for Linux 2 + Docker》一文中,有簡單介紹過 Windows 10 2004 提供的新的 Windows Subsystem for Linux 架構、WSL2 了。
而由於 WSL 基本上預設不會執行 systemd,所以如果是使用 WSL 內部的 Docker 的話、Docker daemon 並不會在開機、或是登入時就自動執行;也因此,當開啟 Ubuntu 要執行 Docker 指令前,需要先手動去啟動 Docker daemon 才行。
如果怕麻煩、或是有其他需求的話,其實也是有辦法透過一些設定,讓電腦在一開機就自動執行 Docker daemon 的。
Heresy 這邊是透過 Windows 的「工作排程」(task scheduler)來做的;WSL2 的環境則是 Ubuntu 20。
允許不需要密碼的 sudo
首先,在 Ubuntu 20 的環境下,要啟用 Docker daemon 可以直接執行 dockerd &;但是由於這個指令要有 root 權限,所以必須要 sudo。
所以為了方便起見,這邊先把 WSL 預設的帳號,設定可以不需要密碼就 sudo(會降低一些安全性就是)。
這邊的操作是參考《Enable sudo without password in Ubuntu/Debian》這篇,基本上就是使用文字編輯器,去修改 /etc/sudoers 這個檔案。
不過這邊建議使用 visudo 這個指令來編輯這個檔案,這樣在編輯完後他會檢查語法是否有誤;否則如果改錯了,就會造成無法執行 sudo 的窘境。
而要修改的部分,則是加入:
USERNAME ALL=(ALL) NOPASSWD:/bin/dockerd
這樣就可以了。
如此一來,USERNAME 這個帳號就可以不用輸入密碼,就可以執行「sudo dockerd」這個命令了。
透過工作排程器自動執行
接下來,則是可以在 Windows 的工作排程器中,加入一個隨著電腦啟動而執行的工作、來自動執行 WSL 內的 docker daemon。
「工作排程器」可以在開始選單的「Windows 系統管理工具」內找到,也可以用搜尋的方式來執行。
這邊是直接在「工作排程器程式庫」中,點選右方的「建立工作」,然後給他一個名字。
Heresy 這邊是把它叫做「WSL-Docker」,然後記得要選取「不論使用者登入與否均執行」。
然後要修改的地方還有「觸發程序」和「動作」兩項。
在「觸發程序」中,是加入一個「啟動時」的觸發程序,個人是習慣會勾選「延遲工作的時間」,讓他在開機後一小段時間後再執行。
在「動作」的部分,則是設定成「啟動程式」。
然後在「程式或指令碼」這邊,輸入「c:windowssystem32wsl.exe」,在「新增引數(可省略)」這邊,則是輸入「sudo dockerd」。
新增完成後,可以選取他後,手動執行看看是否可以正確地維持在「執行中」的狀態;如果可以的話,則可以在打開 WSL 試試看 docker 是否可以正確執行。
如果都沒問題的話,那以後重開機後,就算使用者沒有登入,WSL2 內的 Docker daemon 都會自動跑起來了~
不過,這邊其實還有一個小問題,那就是由於 WSL2 基本上還是採用 VM 的架構,所以它的網路雖然可以連外,但是卻是在 Hyper-V 建立的 NAT 後方、沒有實體 IP 可以讓外部連線;所以如果是希望用 WSL2 來建立服務的話,基本上會沒辦法直接讓外部連接到。
有需要的話,應該是需要透過 port mapping 的方法來解了;這部分可以參考《[WSL 2] NIC Bridge mode 🖧 (Has TCP Workaround🔨)》。