瞭解 Docker Desktop 在 Mac 上的許可權要求

本頁面包含在 Mac 上執行和安裝 Docker Desktop 的許可權要求資訊。

它還闡明瞭以 root 身份執行容器與在主機上擁有 root 訪問許可權之間的區別。

Mac 上的 Docker Desktop 在設計時考慮了安全性。僅在絕對必要時才需要管理許可權。

許可權要求

Mac 版 Docker Desktop 作為非特權使用者執行。但是,Docker Desktop 需要某些功能才能執行一組有限的特權配置,例如:

在安裝過程中授予特權訪問。

Mac 版 Docker Desktop 首次啟動時,會顯示一個安裝視窗,您可以在其中選擇使用預設設定(適用於大多數開發人員,需要您授予特權訪問許可權)或使用高階設定。

如果您在具有更高安全要求的環境中工作,例如禁止本地管理訪問的環境中,則可以使用高階設定來消除授予特權訪問的需要。您可以配置

  • Docker CLI 工具在系統或使用者目錄中的位置
  • 預設的 Docker 套接字
  • 特權埠對映

根據您配置的高階設定,您必須輸入密碼才能確認。

您可以在以後從 設定 中的 高階 頁面更改這些配置。

Docker 二進位制檔案預設安裝在 /Applications/Docker.app/Contents/Resources/bin 中。Docker Desktop 在 /usr/local/bin 中為二進位制檔案建立符號連結,這意味著它們在大多數系統上會自動包含在 PATH 中。

您可以在安裝 Docker Desktop 期間選擇是在 /usr/local/bin 還是 $HOME/.docker/bin 中安裝符號連結。

如果選擇 /usr/local/bin 且此位置對於非特權使用者不可寫入,則 Docker Desktop 需要授權才能確認此選擇,然後才能在 /usr/local/bin 中建立 Docker 二進位制檔案的符號連結。如果選擇 $HOME/.docker/bin,則不需要授權,但您必須手動將 $HOME/.docker/bin 新增到您的 PATH 中。

您還可以選擇啟用安裝 /var/run/docker.sock 符號連結。建立此符號連結可確保依賴預設 Docker 套接字路徑的各種 Docker 客戶端無需額外更改即可工作。

由於 /var/run 被掛載為 tmpfs,因此其內容在重啟時會被刪除,包括 Docker 套接字的符號連結。為了確保 Docker 套接字在重啟後仍然存在,Docker Desktop 設定了一個 launchd 啟動任務,透過執行 ln -s -f /Users/<user>/.docker/run/docker.sock /var/run/docker.sock 來建立符號連結。這確保了您在每次啟動時都不會被提示建立符號連結。如果您在安裝時未啟用此選項,則不會建立符號連結和啟動任務,並且您可能必須在客戶端中顯式設定 DOCKER_HOST 環境變數為 /Users/<user>/.docker/run/docker.sock。Docker CLI 依賴於當前上下文來檢索套接字路徑,在 Docker Desktop 啟動時,當前上下文被設定為 desktop-linux

繫結特權埠

您可以在安裝期間或從安裝後的 設定 中的 高階 頁面啟用特權埠對映。Docker Desktop 需要授權才能確認此選擇。

確保定義了 localhostkubernetes.docker.internal

您有責任確保 localhost 解析為 127.0.0.1,如果使用 Kubernetes,則確保 kubernetes.docker.internal 解析為 127.0.0.1

從命令列安裝

安裝命令上使用 --user 標誌在安裝期間應用特權配置。在這種情況下,您在 Docker Desktop 首次執行時不會被提示授予 root 許可權。具體來說,--user 標誌

  • 如果存在,則解除安裝以前的 com.docker.vmnetd
  • 設定符號連結
  • 確保 localhost 解析為 127.0.0.1

此方法的侷限性在於,Docker Desktop 每臺機器只能由一個使用者帳戶執行,即 --user 標誌中指定的使用者帳戶。

特權助手

在需要特權助手的有限情況下,例如繫結特權埠或快取登錄檔訪問管理策略,特權助手由 launchd 啟動並在後臺執行,除非如前所述在執行時停用它。Docker Desktop 後端透過 UNIX 域套接字 /var/run/com.docker.vmnetd.sock 與特權助手通訊。它執行的功能是

  • 繫結小於 1024 的特權埠。
  • 安全快取對開發人員只讀的登錄檔訪問管理策略。
  • 解除安裝特權助手。

特權助手程序的刪除方式與刪除 launchd 程序的方式相同。

$ ps aux | grep vmnetd
root             28739   0.0  0.0 34859128    228   ??  Ss    6:03PM   0:00.06 /Library/PrivilegedHelperTools/com.docker.vmnetd
user             32222   0.0  0.0 34122828    808 s000  R+   12:55PM   0:00.00 grep vmnetd

$ sudo launchctl unload -w /Library/LaunchDaemons/com.docker.vmnetd.plist
Password:

$ ps aux | grep vmnetd
user             32242   0.0  0.0 34122828    716 s000  R+   12:55PM   0:00.00 grep vmnetd

$ rm /Library/LaunchDaemons/com.docker.vmnetd.plist

$ rm /Library/PrivilegedHelperTools/com.docker.vmnetd

在 Linux 虛擬機器中以 root 身份執行容器

藉助 Docker Desktop,Docker 守護程式和容器在由 Docker 管理的輕量級 Linux 虛擬機器中執行。這意味著,儘管容器預設以 root 身份執行,但這並不授予 Mac 主機機器的 root 訪問許可權。Linux 虛擬機器充當安全邊界,限制了可以從主機訪問的資源。從主機繫結掛載到 Docker 容器的任何目錄仍然保留其原始許可權。

增強型容器隔離

此外,Docker Desktop 支援增強型容器隔離模式 (ECI),該模式僅適用於企業客戶,它可以在不影響開發人員工作流程的情況下進一步保護容器。

ECI 自動在 Linux 使用者名稱空間中執行所有容器,以便容器中的 root 被對映到 Docker Desktop VM 中的非特權使用者。ECI 使用此技術和其他高階技術進一步保護 Docker Desktop Linux VM 中的容器,使它們與 Docker 守護程式和 VM 中執行的其他服務進一步隔離。