Docker 在今年八月的時候,修改了自家產品的收費規範,其中也針對了在 Windows 上要使用 Docker 時最普遍的軟體、Docker Desktop 加入了免費使用的限制(官網);這個修改對於一般使用者來說可能影響不大,但是對於在較大型公司(超過 250 人)工作的人來說,可能就有點影響了…
Docker Desktop(官網)基本上是針對 Windows 和 Mac 推出的一套包含圖形介面的管理工具,可以進行 Docker 的設定、管理等操作;透過 Docker Desktop,使用者可以很簡單地在電腦上建立 Docker 的執行環境。
不過,對於 Heresy 這種根本沒在用 Docker Desktop 圖形介面、都是直接透 CLI 來操作的人來說,老實說 Docker Desktop 的圖形介面並沒有它的必要性。(最常用的功能搞不好就是更新通知了? :p)
而如果考慮到授權的問題,那要怎樣才能在不使用 Docker Desktop 的情況下,在 Windows 上執行 Docker 呢?
如果是要跑 Linux 的 Docker 容器的話,其實 WSL2 應該是個相當好的選擇。只要在 WSL2 的系統裡面安裝 Docker 後,就可以用和在 Linux 環境下相同的方式來使用 Docker CLI 了;不過由於 WSL2 不會去執行 systemd,所以得自己先去執行 Docker daemon、算是稍微麻煩一點就是了。
而如果是要執行 Windows 的容器的話呢?其實 Docker 有提供獨立的 Windows 版 Docker daemon + Docker CLI,可以讓使用者下載使用,他的連結式:
目前最新的版本是「docker-20.10.9.zip」,裡面包含了以 dockerd.exe 和 docker.exe 為主的執行檔,可以讓使用者自己來執行。
其中,dockerd.exe 就是 Docker daemon 的程式,基本上只要他有正確執行起來,就可以透過 docker.exe 這個 Docker CLI 來做一般的 Docker 操作了~
在《Running Windows and Linux containers without Docker Desktop》這篇文章,就有提供一段 PowerShell 的腳本,來示意怎麼在 Windows 環境下設定好 Docker Daemon。
curl.exe -o docker.zip -LO https://download.docker.com/win/static/stable/x86_64/docker-20.10.9.zip Expand-Archive docker.zip -DestinationPath C: [Environment]::SetEnvironmentVariable("Path", "$($env:path);C:docker", [System.EnvironmentVariableTarget]::Machine) $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") dockerd --register-service Start-Service docker docker run hello-world
他的指令步驟,基本上就是:
- 透過 curl 下載 docker 的檔案
- 透過「Expand-Archive」來解壓縮,這邊會解壓縮成「C:docker」
- 透過「[Environment]::SetEnvironmentVariable()」設定系統環境變數
- 更新目前階段的環境變數 $env:Path
- 將 dockerd 註冊成 Windows service,名字會是「Docker Engine」
- 啟動 docker service
- 測試
理論上,透過有系統管理者權限的 PowerShell 執行上面的指令,就可以完成 Docker 環境的建立了。
不過,實際上在第五步、註冊 Windows Service 的時候,還要再加一些參數,才會比較實用。
這邊個人的作法是:
New-LocalGroup -Name docker-users dockerd --register-service -G docker-users --config-file C:dockerdaemon.json
首先,第一行是透過「New-LocalGroup」建立出一個「docker-users」的使用者群組,方便管理那些使用者可以操作 Docker;這個群組如果有安裝 Docker Desktop 的話,應該就已經有被建立出來。
對應的,在註冊 dockerd 的時候,就要加上「-G docker-users」的參數,告訴系統要用這個群組權限來執行 Docker Daemon。之後,只要把需要使用 Docker 的使用者加到這個群組,就可以讓他執行 Docker CLI 的指令了。
而如果有自己的 Docker daemon 設定檔的話,則可以透過「–config-file C:dockerdaemon.json」來指定。像 Heresy 就是為了指定他儲存資料的位置,所以有特別設定 data-root 的路徑;這邊的設定檔內容就是:
{
"data-root" : "S:\docker"
}
不過,其實只有這項設定的話,其實也是可以透過參數來設定(參考)就是了。
總之,最後的腳本大概就是下面的樣子了(daemon.json 要自己處理)。
curl.exe -o docker.zip -LO https://download.docker.com/win/static/stable/x86_64/docker-20.10.9.zip Expand-Archive docker.zip -DestinationPath C:
[Environment]::SetEnvironmentVariable("Path", "$($env:path);C:docker", [System.EnvironmentVariableTarget]::Machine) $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
New-LocalGroup -Name docker-users
dockerd --register-service -G docker-users --config-file C:dockerdaemon.json
Start-Service docker
如此一來,在使用 Docker CLI 的情境下,就會和安裝 Docker Desktop 的狀況差不多了。
另外一提,Heresy 這邊常常碰到重開機後 dockerd 會因為「panic.log」這個檔案無法存取,而導致 Docker service 啟動失敗的狀況,這時候會需要手動刪除在 data-root 目錄下的該檔案、然後重新啟動 Docker service 才能解決問題。(把「panic.log」的唯讀屬型拿掉好像也可以)
實際上,這個問題在使用 Docker Desktop 的時候就有碰到了。根據官方的說法(參考),在 Docker Desktop 4.1.0 應該已經解決了,但是實際上好像還是會發生?
請問使用這種方式,windows也要開啟hyper-V嗎?
我目前遇到的狀況是無法docker run hello-world
會出現
error response from daemon: hcs::createcomputeSystem {be6f982318f9630d339e5725…….}: the request is not supported.
這邊因為固定都會開啟 Hyper-V 相關的功能,所以不確定是否為必要。
個人是建議先開啟試試看。
我開啟Hyper-V沒有用
我是安裝WSL後解決這個問題
wsl –install
安裝指南:https://learn.microsoft.com/zh-tw/windows/wsl/install-on-server
我遇到類似問題時,是打開了 containers 的 feature 解決的,他的位置和 hyper-v 的啟用選單相同,中文叫「容器」。或是可以參考
[Running Windows and Linux containers without Docker Desktop] (https://lippertmarkus.com/2021/09/04/containers-without-docker-desktop/) 裡面提到的指令來開啟
Enable-WindowsOptionalFeature -Online -FeatureName containers –All
(不過在我的電腦上要把 -All 拿掉才能正確執行)
我使用的是 WSL 2.0
OS: Win11 Pro (23H2)