瞭解 Docker Desktop 在 Mac 上的許可權要求
本頁面包含在 Mac 上執行和安裝 Docker Desktop 的許可權要求資訊。
它還闡明瞭以 root
身份執行容器與在主機上擁有 root
訪問許可權之間的區別。
Mac 上的 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
中定義了localhost
和kubernetes.docker.internal
。一些舊的 macOS 安裝在/etc/hosts
中沒有localhost
,這會導致 Docker 失敗。定義 DNS 名稱kubernetes.docker.internal
允許 Docker 與容器共享 Kubernetes 上下文。 - 安全快取對開發人員只讀的登錄檔訪問管理策略。
在安裝過程中授予特權訪問。
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 需要授權才能確認此選擇。
確保定義了 localhost
和 kubernetes.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 中執行的其他服務進一步隔離。