瞭解 Windows 的權限需求
此頁面包含關於在 Windows 上執行和安裝 Docker Desktop 的權限要求、具特殊權限的輔助程式 `com.docker.service` 的功能以及此方法背後的原因等資訊。
它也說明了以 `root` 身份執行容器與在主機上擁有 `Administrator` 存取權限的區別,以及 Windows Docker 引擎和 Windows 容器的權限。
權限要求
雖然可以在沒有 `Administrator` 權限的情況下執行 Windows 版 Docker Desktop,但在安裝過程中需要這些權限。安裝時,您會收到一個 UAC 提示,允許安裝具特殊權限的輔助服務。之後,只要您是 `docker-users` 群組的成員,就可以在沒有管理員權限的情況下執行 Docker Desktop。如果您執行安裝,您會自動被新增到此群組,但其他使用者必須手動新增。這允許管理員控制誰可以存取 Docker Desktop。
這種方法的原因是 Docker Desktop 需要執行一組有限的特殊權限操作,這些操作由具特殊權限的輔助程式 `com.docker.service` 執行。這種方法允許遵循最小權限原則,僅將 `Administrator` 存取權限用於絕對必要的 عمليات,同時仍然能夠以非特權使用者身份使用 Docker Desktop。
具特殊權限的輔助程式
具特殊權限的輔助程式 `com.docker.service` 是一個以 `SYSTEM` 權限在背景執行的 Windows 服務。它監聽命名管道 `//./pipe/dockerBackendV2`。開發人員執行 Docker Desktop 應用程式,該應用程式連線到命名管道並向服務傳送命令。此命名管道受到保護,只有屬於 `docker-users` 群組的使用者才能存取它。
該服務執行以下功能
- 確保在 Win32 hosts 檔案中定義了 `kubernetes.docker.internal`。定義 DNS 名稱 `kubernetes.docker.internal` 允許 Docker 與容器共享 Kubernetes 內容。
- 確保在 Win32 hosts 檔案中定義了 `host.docker.internal` 和 `gateway.docker.internal`。它們指向主機本機 IP 位址,並允許應用程式使用相同的名稱從主機本身或容器解析主機 IP。
- 安全地快取 Registry 存取管理策略,該策略對開發人員而言是唯讀的。
- 建立 Hyper-V 虛擬機器 `"DockerDesktopVM"` 並管理其生命週期 - 啟動、停止和銷毀它。虛擬機器名稱在服務程式碼中是硬編碼的,因此該服務不能用於建立或操作任何其他虛擬機器。
- 移動 VHDX 檔案或資料夾。
- 啟動和停止 Windows Docker 引擎,並查詢它是否正在執行。
- 刪除所有 Windows 容器資料檔案。
- 檢查 Hyper-V 是否已啟用。
- 檢查啟動載入程式是否啟用 Hyper-V。
- 檢查所需的 Windows 功能是否已安裝且已啟用。
- 執行健康檢查並擷取服務本身的版本。
服務啟動模式取決於選擇的容器引擎,以及對於 WSL,取決於是否需要在 Win32 hosts 檔案中維護 `host.docker.internal` 和 `gateway.docker.internal`。這由設定頁面中 `使用基於 WSL 2 的引擎` 下的設定控制。設定此選項後,WSL 引擎的行為與 Hyper-V 相同。因此
- 使用 Windows 容器或 Hyper-v Linux 容器時,服務會在系統啟動時啟動並一直執行,即使 Docker Desktop 未執行也是如此。這是必需的,以便您可以在沒有管理員權限的情況下啟動 Docker Desktop。
- 使用 WSL2 Linux 容器時,該服務不是必需的,因此在系統啟動時不會自動執行。當您切換到 Windows 容器或 Hyper-V Linux 容器,或選擇在 Win32 hosts 檔案中維護 `host.docker.internal` 和 `gateway.docker.internal` 時,會顯示一個 UAC 提示,要求您接受啟動服務的特殊權限操作。如果接受,服務將啟動並設定為在下一次 Windows 啟動時自動啟動。
在 Linux 虛擬機器中以 root 身份執行的容器
Linux Docker 守護程式和容器在由 Docker 管理的最小化、特殊用途的 Linux 虛擬機器中執行。它是不可變的,因此您無法擴展它或更改已安裝的軟體。這表示雖然容器預設以 `root` 身份執行,但这不允許更改虛擬機器,也不授予對 Windows 主機的 `Administrator` 存取權限。Linux 虛擬機器作為安全邊界,並限制可以存取主機的哪些資源。檔案共用使用使用者空間製作的檔案伺服器,並且從主機繫結安裝到 Docker 容器中的任何目錄仍然保留其原始權限。它不會授予您存取它尚未擁有的任何檔案的權限。
強化容器隔離
此外,Docker Desktop 支援強化容器隔離模式 (ECI),僅適用於企業客戶,它可以進一步保護容器,而不會影響開發人員的工作流程。
ECI 會自動在 Linux 使用者命名空間內執行所有容器,以便將容器中的 root 映射到 Docker Desktop 虛擬機器內部的非特權使用者。ECI 使用此技術和其他進階技術來進一步保護 Docker Desktop Linux 虛擬機器中的容器,使其與 Docker 守護程式和虛擬機器內執行的其他服務進一步隔離。
Windows 容器
不同於在虛擬機 (VM) 中執行的 Linux Docker 引擎和容器,Windows 容器是一項作業系統功能,它可以直接在 Windows 主機上以系統管理員
權限執行。對於不希望開發人員執行 Windows 容器的組織,版本 4.11 提供了 –no-windows-containers
安裝程式旗標來停用此功能。
網路
為了網路連線,Docker Desktop 使用使用者空間程序 (vpnkit
),它會繼承啟動它的使用者的限制,例如防火牆規則、VPN、HTTP 代理伺服器屬性等。