不安裝 Docker Desktop 使用 Windows Docker 容器


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,可以讓使用者下載使用,他的連結式:

https://download.docker.com/win/static/stable/x86_64/

目前最新的版本是「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

他的指令步驟,基本上就是:

  1. 透過 curl 下載 docker 的檔案
  2. 透過「Expand-Archive」來解壓縮,這邊會解壓縮成「C:\docker」
  3. 透過「[Environment]::SetEnvironmentVariable()」設定系統環境變數
  4. 更新目前階段的環境變數 $env:Path
  5. 將 dockerd 註冊成 Windows service,名字會是「Docker Engine」
  6. 啟動 docker service
  7. 測試

理論上,透過有系統管理者權限的 PowerShell 執行上面的指令,就可以完成 Docker 環境的建立了。

不過,實際上在第五步、註冊 Windows Service 的時候,還要再加一些參數,才會比較實用。

這邊個人的作法是:

New-LocalGroup -Name docker-users
dockerd --register-service -G docker-users --config-file C:\docker\daemon.json

首先,第一行是透過「New-LocalGroup」建立出一個「docker-users」的使用者群組,方便管理那些使用者可以操作 Docker;這個群組如果有安裝 Docker Desktop 的話,應該就已經有被建立出來。

對應的,在註冊 dockerd 的時候,就要加上「-G docker-users」的參數,告訴系統要用這個群組權限來執行 Docker Daemon。之後,只要把需要使用 Docker 的使用者加到這個群組,就可以讓他執行 Docker CLI 的指令了。

而如果有自己的 Docker daemon 設定檔的話,則可以透過「–config-file C:\docker\daemon.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:\docker\daemon.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 應該已經解決了,但是實際上好像還是會發生?

對「不安裝 Docker Desktop 使用 Windows Docker 容器」的想法

  1. 您好,這邊在搜尋的時候發現您的文章,想問一下,目前我這邊實踐成功,但我現在想移除程式我該怎麼做,我這邊有嘗試過,如果說再次開啟Start-Service會出現問題,不曉得您之前是不是有遇過這情況!

    • 不確定是不是你在問的東西,不過如果你已經透過 –register-service 將 dockerd 註冊成 Windows 的服務的話,當你不想繼續使用、或是要改變位置的話,要先透過「dockerd –unregister-service」來移除之前註冊的 Windows 服務。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.