博客 / 詳情

返回

Docker中overlay2磁盤佔用爆滿清理方案

檢查磁盤空間和各容器佔用空間

檢查磁盤空間情況

首先檢查磁盤空間確認overlay2佔用空間

df -h

可以看到以下結果

Filesystem      Size  Used Avail Use% Mounted on
udev            7.9G     0  7.9G   0% /dev
tmpfs           1.6G  2.1M  1.6G   1% /run
/dev/sda1       197G   59G  131G  32% /
tmpfs           7.9G     0  7.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sda15      124M   12M  113M  10% /boot/efi
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/3ea43957615f592f2a7b28512fd7f344ac762bfc80a4a964ac467b17f562203e/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/bd8702eb9dcc24aff1a54387374f6609b431aabb1c7131359296867986dc84a0/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/b6b66bb24dc1186c12f18ddb3487a3b81ef40767993a722b08359808635461bd/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/0bf724bd62f24f7411c573b03fef2816c0b14a696ce04e8b78c4616b704b1b86/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/d7caeb11110a19f032d90855ae491c9cb35c5cbbd57daf266e5b12c3494ba21e/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/e4ec25032cb6814980100348c68e937bb4b9e48c098dbf99c5a543428f73e8b7/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/53277c320141d4efa122ad91fe38fe9e7362d29d2cdabb5c3d8c2a1bdea12120/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/b5b65a3ebe16e33091590dbdbea7c51b6ffc8ab894358d9cb7d95934a14a8579/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/864d8e14ba8c74bc627a35847aff844e45acc43686abc7d81c471969fe2b8386/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/5d0d903a3ccd4b5b2cd6741d4eb9654b10667fd5707c13d3d51f2678b5c4d7a2/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/4c2bf66ffcd7f2a8bb03dcee3f5d445c4be9c56b899aaea319689a92193fbaf4/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/3a9e03fd9038307f133da2800527610a6334e458d42d8a406ea30e108dd8ec58/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/4c509ec79872340afca9c9a763782005fa043f5e4c988acc9f24f371d7c79b5c/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/d9bad19c0ce3f9ff18364ee882e52bb9fef3db1c5a99bdbfb97fe4dbbea6f985/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/492549dc47bc8b55a73c945ad3eb699fe34c5e563d22cf4b16383048420fbffe/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/31a7a2393fa100d485b852cda049e4efe7e2d57240a638bde911901a9878e6bd/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/c56e33e03da1a8e849eb8d02a660cfdbf1b21774a99adb8bb1435e072ead0eaf/merged
tmpfs           1.6G     0  1.6G   0% /run/user/0

如果看到overlay Use%這一欄佔用百分比過高説明確實是overlay目錄佔用過高導致服務器磁盤空間過小的問題

檢查容器的佔用情況

首先檢查docker模塊中的佔用情況

docker system df

結果顯示

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          20        18        8.739GB   684.5MB (7%)
Containers      18        17        11.12MB   6.23kB (0%)
Local Volumes   7         6         348.8MB   72.39MB (20%)
Build Cache     754       0         40.38GB   40.38GB
  • Images: 鏡像的數量及佔用大小
  • Containers: 容器的數量及佔用大小
  • Local Volumes: 本地卷數量及佔用大小
  • Build Cache: 打包構建時的緩存大小

我們主要是清理Images、Containers和Build Cache中的文件

執行清理操作

清理無用的Images

首先先查看一下目前存在的鏡像

docker images

結果

REPOSITORY                                     TAG       IMAGE ID       CREATED        SIZE
<none>                                         <none>    defd79220cd6   2 months ago   239MB

可以看到有很多到<none>字樣的鏡像。這裏我只截取一個作為參考。發現數量和佔用大小都挺多的。

none鏡像被官方稱為dangling鏡像。代表沒有標籤且沒有被使用過的鏡像,可以安全放心的清理。

清理方法也很簡單,執行下面命令

docker image prune

這條命令會自動幫我們清除帶有<none>的無效鏡像。命令執行完畢會提示釋放了多少個空間。然後我們再來執行docker images命令會發現帶有<none>的鏡像全部被清理乾淨了磁盤空間也得到了釋放!

清理Containers容器中的日誌

Containers容器佔用最多的基本上就是日誌文件

Docker 日誌(也就是 docker logs 輸出的東西) 默認存放在:

/var/lib/docker/containers/<container-id>/<container-id>-json.log

這個日誌文件可能會越積越大,需要定期清理。

方法1:

先找到日誌文件路徑:

docker inspect <容器名或ID> --format='{{.LogPath}}'

然後清空它

truncate -s 0 "$(docker inspect <容器名或ID> --format='{{.LogPath}}')"

方法2: 還有另一種方式可以一次性清理所有容器

find /var/lib/docker/containers/ -name "*-json.log" -exec truncate -s 0 {} \;

不刪除文件、不重啓服務,不影響任何容器運行。

從根源限制Docker日誌大小(一勞永逸的方法 推薦)

我們可以設置限制日誌大小從而不用每次都來手動刪除日誌

輸入

vim /etc/docker/daemon.json

然後再文件中寫入

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

這樣每個容器最多隻會佔用30MB的日誌空間。

寫入完成後並不會立刻生效,需要重啓運行中的容器。

如果有條件的情況下重啓docker會對所有容器都生效

systemctl restart docker

清理Build Cache構建緩存

Build Cache主要是構建時的緩存,清理它們下次打包構建時速度可能會慢點,對於系統沒有任何影響。如果磁盤佔用過高需要及時清理。清理方法也特別簡單就一行命令

docker builder prune

執行完成後可以發現服務器的內存又釋放了一大截。

總結

通過先查看磁盤佔用、再清理無用鏡像與日誌、最後刪除構建緩存,可以快速釋放overlay2佔用的磁盤空間。如果希望長期穩定,建議同時配置日誌大小限制,並定期用docker system dfdf -h複查空間,避免再次爆滿。

好了,本期教程到此結束。如果有任何疑問可以在下方留言 更多精彩內容可以關注我的博客 haydenbi.com

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.