docker磁碟空間清理辦法

freephp發表於2021-06-08

docker磁碟空間清理辦法

前段時間遇到docker磁碟空間太少,無法寫入資料的問題。起因是因為我在本地(Mac Pro)執行了多個mysql容器,並且匯入了一部分線上資料,最後還沒匯入完畢就已經沒有可用空間了。

我最開始給docker分配的磁碟空間是80GB,然後當出現無法寫入的時候已經是隻剩餘0.6GB了。

可以使用下面的命令來檢視docker容器和映象磁碟佔用情況:

docker system df

可以看到類似如下的輸出,包括映象(Images)、容器(Containers)、資料卷(Local Volumes)、構建快取(Build Cache):

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          5         5         5.158GB   0B (0%)
Containers      6         6         7.601MB   0B (0%)
Local Volumes   4         3         46.64GB   207MB (0%)
Build Cache     34        0         1.609MB   1.609MB

可以看到以上4種型別裡面Local Volumes佔用的磁碟空間最大。如果還想檢視更詳細的報告,則使用如下命令。

docker system df -v

可以看到很多輸出,其中關於Local Volumes的是:

VOLUME NAME                                                        LINKS     SIZE
641d4976908910dca270a2bf5edf33408daf7474a0f27c850b6580b5936b6dd0   1         40.1GB
ovpn-data                                                          1         33.51kB
267b52c5eab8c6b8e0f0d1b02f8c68bdaffba5ea80a334a6d20e67d22759ef48   1         6.325GB
f4a3866ef41e3972e087883f8fa460ad947b787f2eafb6545c759a822fb6e30d   0         207MB

為了騰出空間,第一個想到的簡單粗暴的辦法是將所有停止的容器刪除,命令如下。

docker system prune -a 

但是使用這個命令還是要謹慎,記得把需要使用的docker容器都先啟動起來,不然那些沒有啟動的容器就會被這條命令刪除了。基於安全的考慮,這個命令預設不會刪除那些未被任何容器引用的資料卷,如果需要同時刪除這些資料卷,你需要顯式的指定 --volumns。
所以如果想強制刪除包括容器、網路、映象、資料卷,可以使用如下命令。

docker system prune --all --force --volumns

第二個方法是把docker儲存資料的路徑改到磁碟空間更大的其他地方。如果是Mac使用者,可以在圖形化的Docker Desktop的設定裡面修改Disk image location設定。

我嘗試過第二種辦法,把Disk image location改到外接的SSD上,並且嘗試把之前的資料先同步過去。後面發現一個很大的問題,就是在mysql容器中匯入資料會非常緩慢,這大概就是外接SSD在docker容器中的寫入瓶頸。
假如你只是想執行幾個容器,而不是本地儲存資料庫資料,那麼將docker資料儲存到SSD是一個不錯的辦法。

相關文章