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

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

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

適用於 Windows 的 Docker Desktop 在設計時考慮了安全性。僅在絕對必要時才需要管理員許可權。

許可權要求

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

  • /usr/local/bin安裝符號連結
  • 繫結小於 1024 的特權埠。儘管特權埠(小於 1024 的埠)通常不作為安全邊界使用,但作業系統仍然阻止非特權程序繫結到它們,這會破壞像 docker run -p 127.0.0.1:80:80 docker/getting-started 這樣的命令。
  • /etc/hosts確保定義了 localhostkubernetes.docker.internal。一些舊的 macOS 安裝未在 /etc/hosts 中包含 localhost,這會導致 Docker 失敗。定義 DNS 名稱 kubernetes.docker.internal 允許 Docker 與容器共享 Kubernetes 上下文。
  • 安全地快取對開發者而言只讀的登錄檔訪問管理策略。

在安裝期間授予特權訪問許可權。

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

如果您在安全要求較高的環境工作(例如禁止本地管理員訪問),則可以使用高階設定來避免授予特權訪問許可權。您可以配置:

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

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

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

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 socket 路徑的各種 Docker 客戶端無需額外更改即可工作。

由於 /var/run 被掛載為 tmpfs,其內容會在重啟時被刪除,包括指向 Docker socket 的符號連結。為了確保 Docker socket 在重啟後存在,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 依賴當前上下文來檢索 socket 路徑,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 域 socket /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 daemon 和容器在由 Docker 管理的輕量級 Linux 虛擬機器中執行。這意味著雖然容器預設以 root 身份執行,但這並不授予對 Mac 主機機器的 root 訪問許可權。Linux 虛擬機器充當安全邊界,並限制可以從主機訪問哪些資源。任何從主機繫結掛載到 Docker 容器中的目錄仍然保留其原始許可權。

增強容器隔離

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

ECI 會自動在 Linux 使用者名稱空間內執行所有容器,這樣容器中的 root 會對映到 Docker Desktop VM 內的非特權使用者。ECI 利用此技術及其他高階技術進一步保護 Docker Desktop Linux VM 內的容器,使其與 Docker daemon 和 VM 內執行的其他服務進一步隔離。

頁面選項