Try   HackMD

Docker for Mac 硬碟大小調整

tags: docker blog

此篇文章討論的 Docker 為 Linux Container,有些內容可能不適用於 Windows Container 技術。

為什麼 Docker for Mac 會遇到硬碟空間不足的問題?

Docker 的技術是基於 Linux Namespaces 與 cgroup 等功能做邏輯隔離,並在隔離的環境中透過同一個 Linux Kernel 執行程式,因此要執行 Docker 的首要條件就是需要有執行 Linux distribution 的機器。

而 Docker 公司為了普及 Docker 技術,推出了在各個主流開發平台上 (Windows, macOS) 透過運行 Linux 虛擬機的方式來滿足跨平台執行 Docker 的需求。

Docker for Mac 的原理是在 macOS 上使用 xhyve 執行虛擬機 ( xhyve 是透過 macOS 原生的虛擬化技術 Hypervisor.framework 執行虛擬機的軟體)。而虛擬機的作業系統是使用 Docker 推出的 Linux Kit 產生的作業系統。

Docker 在 Linux 平台以外的作業系統是使用虛擬機的方式執行,就會有虛擬機相關的設定,例如 CPU、Memory、Disk 等設定。這些設定可以在 Docker for Windows 或 Docker for Mac 的 Preferences 介面中設定。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

也因為 Docker 在 Windows 或 macOS 平台中是跑一個 Linux 的虛擬機,因此才會受限於虛擬機所配置的硬碟空間大小。

當硬碟空間不足時,會有什麼錯誤?

如果常用 docker for Mac build 一些比較大的 docker image 可能會遇到以下錯誤:

Error processing tar file(exit status 1): write /home/xxx~shell.js: no space left on device

當遇到這個狀況時,就代表 Docker 虛擬機上的硬碟空間不夠了 (這時候怎麼檢查本身的機器硬碟是沒用的),根據 Docker 官方的文件,遇到這個問題的時候可以根據以下步驟排除

  1. 可以使用以下指令檢查 docker image 與 container 所使用的硬碟空間 docker system df -v
    如果發現 docker 的 image 或是 container 所占用的空間過多,可以分別用 docker image lsdocker container ls -a 查詢分別所占用的空間,並透過 docker image rmdocker container rm 指令刪除 image 或 container。

  2. 可以透過以下指令刪除已經停止的 container 沒被 reference 的 image, 快取 image
    docker system prune

  3. 執行完以上指令硬碟會在數分鐘後回收,如果硬碟沒有回收的話,可以在 host 使用以下指令強制執行硬碟回收指令
    docker run --privileged --pid=host docker/desktop-reclaim-space
    這個指令的原理是在 docker for mac 的 vm 中跑 fstrim /var/lib/docker 指令,也可以進入 docker vm 中自行執行這個指令。

透過以上方式,應該就可以減少 Docker 所占用的硬碟大小,如果想要了解 Docker 虛擬機的硬碟大小,可以透過 Docker for Mac 的 Preference 介面,找到硬碟檔案的位置,通常都位於 ~/Library/Container/com.docker.docker/data/vms/0/data 中,由於這個檔案的大小為虛擬機的硬碟上限,因此可以透過 ls -s 指令看到檔案的實際大小。

參考資料:

  1. Disk utilization in Docker for Mac