docker
blog
此篇文章討論的 Docker 為 Linux Container,有些內容可能不適用於 Windows Container 技術。
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 介面中設定。
也因為 Docker 在 Windows 或 macOS 平台中是跑一個 Linux 的虛擬機,因此才會受限於虛擬機所配置的硬碟空間大小。
如果常用 docker for Mac build 一些比較大的 docker image 可能會遇到以下錯誤:
當遇到這個狀況時,就代表 Docker 虛擬機上的硬碟空間不夠了 (這時候怎麼檢查本身的機器硬碟是沒用的),根據 Docker 官方的文件,遇到這個問題的時候可以根據以下步驟排除
可以使用以下指令檢查 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。
可以透過以下指令刪除已經停止的 container 沒被 reference 的 image, 快取 image
docker system prune
執行完以上指令硬碟會在數分鐘後回收,如果硬碟沒有回收的話,可以在 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
指令看到檔案的實際大小。
參考資料: