不安裝 Docker Desktop 使用 Windows Docker 容器

| | 0 Comments| 11:13
Categories:

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: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 應該已經解決了,但是實際上好像還是會發生?

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *