適用於 Docker Desktop for Linux 的常見問題解答

為什麼 Docker Desktop for Linux 會執行虛擬機器?

Docker Desktop for Linux 執行虛擬機器 (VM) 的原因如下

  1. 確保 Docker Desktop 在不同平臺上提供一致的體驗。

    在研究過程中,使用者想要使用 Docker Desktop for Linux 的最常見原因是確保在所有主要作業系統上實現功能一致的 Docker Desktop 體驗。利用虛擬機器可以確保 Linux 使用者的 Docker Desktop 體驗與 Windows 和 macOS 使用者的體驗相一致。

  2. 利用新的核心功能。

    有時我們希望利用新的作業系統功能。由於我們控制著虛擬機器內部的核心和作業系統,因此可以立即將這些功能推廣到所有使用者,即使是那些有意堅持使用機器作業系統 LTS 版本的使用者。

  3. 增強安全性。

    容器映象漏洞對主機環境構成了安全風險。存在大量的非官方映象,這些映象無法保證經過驗證以識別已知漏洞。惡意使用者可以將映象推送到公共登錄檔,並使用不同的方法誘騙使用者拉取和執行這些映象。虛擬機器方法可以緩解這種威脅,因為任何獲得 root 許可權的惡意軟體都將被限制在虛擬機器環境中,無法訪問主機。

    為什麼不執行無根 Docker?雖然這樣做可以暫時限制對 root 使用者的訪問,因此在“top”中一切看起來都更安全,但它允許非特權使用者在自己的使用者名稱空間中獲得 `CAP_SYS_ADMIN` 並訪問未預期由非特權使用者使用的核心 API,從而導致 漏洞.

  4. 為了在儘可能減少效能影響的情況下獲得功能一致性和增強的安全性。

    Docker Desktop for Linux 使用的虛擬機器使用 `VirtioFS`,這是一個共享檔案系統,允許虛擬機器訪問主機上的目錄樹。我們的內部基準測試表明,透過正確地向虛擬機器分配資源,可以使用 VirtioFS 達到接近本機的檔案系統性能。

    因此,我們調整了 Docker Desktop for Linux 中分配給虛擬機器的預設記憶體。您可以使用 Docker Desktop 的“設定”>“資源”選項卡中的“記憶體”滑塊根據您的具體需求調整此設定。

如何啟用檔案共享?

Docker Desktop for Linux 使用 VirtioFS 作為預設機制(目前也是唯一機制)來啟用主機和 Docker Desktop 虛擬機器之間的檔案共享。為了不需要提升許可權,也不必不必要地限制對共享檔案的操作,Docker Desktop 在使用者名稱空間(請參見 `user_namespaces(7)`)內執行檔案共享服務 ( `virtiofsd` ),並配置了 UID 和 GID 對映。因此,Docker Desktop 依賴於主機配置為啟用當前使用者使用從屬 ID 委派。要滿足此條件,` /etc/subuid ` (請參見 ` subuid(5) ` )和 ` /etc/subgid ` (請參見 ` subgid(5) ` )必須存在。Docker Desktop 僅支援透過檔案配置的從屬 ID 委派。Docker Desktop 將當前使用者 ID 和 GID 對映到容器中的 0。它使用 ` /etc/subuid ` 和 ` /etc/subgid ` 中與當前使用者相對應的第一個條目來設定容器中超過 0 的 ID 的對映。

容器中的 ID主機上的 ID
0 (root)執行 DD 的使用者 ID(例如 1000)
10 + ` /etc/subuid ` / ` /etc/subgid ` 中指定的 ID 範圍的開始位置(例如 100000)
21 + ` /etc/subuid ` / ` /etc/subgid ` 中指定的 ID 範圍的開始位置(例如 100001)
32 + ` /etc/subuid ` / ` /etc/subgid ` 中指定的 ID 範圍的開始位置(例如 100002)
......

如果 ` /etc/subuid ` 和 ` /etc/subgid ` 不存在,則需要建立它們。兩者都應包含以下形式的條目 - ` <username>:<start of id range>:<id range size> `。例如,要允許當前使用者使用從 100 000 到 165 535 的 ID

$ grep "$USER" /etc/subuid >> /dev/null 2&>1 || (echo "$USER:100000:65536" | sudo tee -a /etc/subuid)
$ grep "$USER" /etc/subgid >> /dev/null 2&>1 || (echo "$USER:100000:65536" | sudo tee -a /etc/subgid)

要驗證配置是否已正確建立,請檢查其內容

$ echo $USER
exampleuser
$ cat /etc/subuid
exampleuser:100000:65536
$ cat /etc/subgid
exampleuser:100000:65536

在這種情況下,如果在 Docker Desktop 容器中將共享檔案 ` chown ` 為由 UID 為 1000 的使用者擁有,則它在主機上顯示為由 UID 為 100999 的使用者擁有。這會導致一個不幸的副作用,即阻止在主機上輕鬆訪問此類檔案。可以透過建立一個使用新 GID 的組並將我們的使用者新增到該組來解決此問題,或者透過為與 Docker Desktop 虛擬機器共享的資料夾設定遞迴 ACL(請參見 ` setfacl(1) ` )。

Docker Desktop 在哪裡儲存 Linux 容器?

Docker Desktop 在 Linux 檔案系統中的一個大型“磁碟映像”檔案中儲存 Linux 容器和映象。這與 Linux 上的 Docker 不同,後者通常將容器和映象儲存在主機檔案系統上的 ` /var/lib/docker ` 目錄中。

磁碟映像檔案在哪裡?

要找到磁碟映像檔案,請從 Docker 儀表板中選擇“設定”,然後從“資源”選項卡中選擇“高階”。

“高階”選項卡會顯示磁碟映像的位置。它還會顯示磁碟映像的最大大小和磁碟映像實際佔用的空間。請注意,其他工具可能會根據最大檔案大小而不是實際檔案大小來顯示檔案的空間使用情況。

如果檔案太大怎麼辦?

如果磁碟映像檔案太大,您可以

  • 將其移動到更大的驅動器
  • 刪除不必要的容器和映象
  • 減小檔案的最大允許大小
如何將檔案移動到更大的驅動器?

要將磁碟映像檔案移動到其他位置

  1. 選擇“設定”,然後從“資源”選項卡中選擇“高階”。

  2. 在“磁碟映像位置”部分中,選擇“瀏覽”並選擇磁碟映像的新位置。

  3. 選擇“應用並重啟”以使更改生效。

不要直接在 Finder 中移動檔案,因為這會導致 Docker Desktop 無法跟蹤檔案。

如何刪除不必要的容器和映象?

檢查您是否有任何不必要的容器和映象。如果您的客戶端和守護程式 API 執行的是 1.25 或更高版本(使用客戶端上的 ` docker version ` 命令檢查您的客戶端和守護程式 API 版本),您可以透過執行以下命令檢視詳細的空間使用情況資訊

$ docker system df -v

或者,要列出映象,請執行

$ docker image ls

要列出容器,請執行

$ docker container ls -a

如果有大量冗餘物件,請執行以下命令

$ docker system prune

此命令會刪除所有已停止的容器、未使用的網路、懸掛的映象和構建快取。

根據磁碟映像檔案的格式,回收主機空間可能需要幾分鐘時間

  • 如果檔名為 `Docker.raw`:主機上的空間將在幾秒鐘內回收。
  • 如果檔名為 `Docker.qcow2`:空間將在幾分鐘後由後臺程序釋放。

只有在刪除映象時才會釋放空間。在執行的容器中刪除檔案不會自動釋放空間。要隨時觸發空間回收,請執行命令

$ docker run --privileged --pid=host docker/desktop-reclaim-space

請注意,許多工具報告的是最大檔案大小,而不是實際檔案大小。要從終端查詢主機上檔案的實際大小,請執行

$ cd ~/.docker/desktop/vms/0/data
$ ls -klsh Docker.raw
2333548 -rw-r--r--@ 1 username  staff    64G Dec 13 17:42 Docker.raw

在這個例子中,磁碟的實際大小是 `2333548` KB,而磁碟的最大大小是 `64` GB。

如何減小檔案的最大大小?

要減小磁碟映象檔案的最大大小,

  1. 從 Docker 儀表盤中選擇 **設定**,然後從 **資源** 選項卡中選擇 **高階**。

  2. **磁碟映象大小** 部分包含一個滑塊,允許您更改磁碟映象的最大大小。調整滑塊以設定較低的限制。

  3. 選擇 **應用並重啟**。

當您減小最大大小時,當前的磁碟映象檔案將被刪除,因此所有容器和映象都將丟失。