# Docker for Mac 硬碟大小調整 ###### tags: `docker` `blog` :::warning 此篇文章討論的 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](https://github.com/machyve/xhyve) 執行虛擬機 ( xhyve 是透過 macOS 原生的虛擬化技術 Hypervisor.framework 執行虛擬機的軟體)。而虛擬機的作業系統是使用 Docker 推出的 [Linux Kit](https://github.com/linuxkit/linuxkit) 產生的作業系統。 Docker 在 Linux 平台以外的作業系統是使用虛擬機的方式執行,就會有虛擬機相關的設定,例如 CPU、Memory、Disk 等設定。這些設定可以在 Docker for Windows 或 Docker for Mac 的 Preferences 介面中設定。 ![](https://i.imgur.com/gRAS3Yq.png) 也因為 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 ls` 、 `docker container ls -a` 查詢分別所占用的空間,並透過 `docker image rm` 或 `docker 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](https://docs.docker.com/docker-for-mac/space/)