# 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 介面中設定。  也因為 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/)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.