如何清理Docker佔用的磁盤空間?

摘要:用了Docker,好處挺多的,可是有一個不大不小的問題,它會一不當心佔用太多磁盤,這就意味着咱們必須及時清理。nginx

使用Docker好處仍是很多的:git

  • 全部服務器的配置都很是簡單,只安裝了Docker,這樣新增服務器的時候要簡單不少。
  • 能夠很是方便地在服務器之間移動各類服務,下載Docker鏡像就能夠運行,不須要手動配置運行環境。
  • 開發/測試環境與生產環境嚴格一致,不用擔憂因爲環境問題致使部署失敗。

至少,上線這一年多來,Docker一直很是穩定,沒有出什麼問題。可是,它有一個不大不小的問題,會比較消耗磁盤空間。github

若是Docker一不當心把磁盤空間全佔滿了,你的服務也就算玩完了,所以全部Docker用戶都須要對此保持警戒。固然,你們也沒關係張,這個問題仍是挺好解決的。docker

1. docker system命令

誰用光了磁盤?Docker System命令詳解中,咱們詳細介紹了docker system命令,它能夠用於管理磁盤空間。json

docker system df 命令,相似於Linux上的df命令,用於查看Docker的磁盤使用狀況:服務器

docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              147                 36                  7.204GB             3.887GB (53%)
Containers          37                  10                  104.8MB             102.6MB (97%)
Local Volumes       3                   3                   1.421GB             0B (0%)
Build Cache                                                 0B                  0B

可知,Docker鏡像佔用了7.2GB磁盤,Docker容器佔用了104.8MB磁盤,Docker數據卷佔用了1.4GB磁盤。網絡

docker system prune命令能夠用於清理磁盤,刪除關閉的容器、無用的數據卷和網絡,以及dangling鏡像(即無tag的鏡像)。docker system prune -a命令清理得更加完全,能夠將沒有容器使用Docker鏡像都刪掉。注意,這兩個命令會把你暫時關閉的容器,以及暫時沒有用到的Docker鏡像都刪掉了…因此使用以前必定要想清楚吶。app

執行docker system prune -a命令以後,Docker佔用的磁盤空間減小了不少:測試

docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              10                  10                  2.271GB             630.7MB (27%)
Containers          10                  10                  2.211MB             0B (0%)
Local Volumes       3                   3                   1.421GB             0B (0%)
Build Cache                                                 0B                  0B

2. 手動清理Docker鏡像/容器/數據卷

對於舊版的Docker(版本1.13以前),是沒有docker system命令的,所以須要進行手動清理。這裏給出幾個經常使用的命
刪除全部關閉的容器ui

docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm

刪除全部dangling鏡像(即無tag的鏡像):

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

刪除全部dangling數據卷(即無用的volume):

docker volume rm $(docker volume ls -qf dangling=true)

3. 限制容器的日誌大小

有一次,當我使用1與2提到的方法清理磁盤以後,發現並無什麼做用,因而,我進行了一系列分析。

在Ubuntu上,Docker的全部相關文件,包括鏡像、容器等都保存在/var/lib/docker/目錄中:

du -hs /var/lib/docker/
97G	/var/lib/docker/

Docker居然使用了將近100GB磁盤,這也是夠了。cd 到/var/lib/docker 下,使用  du -h -t 1G -d 2 (-t 篩選超過指定大小的文件夾 -d 檢查深度)命令繼續查看,能夠定位到真正佔用這麼多磁盤的目錄:

92G	/var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53

docker ps可知,nginx容器的ID剛好爲a376aa694b22,與上面的目錄/var/lib/docker/containers/a376aa694b22的前綴一致:

docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS               NAMES
a376aa694b22        192.168.59.224:5000/nginx:1.12.1            "nginx -g 'daemon off"   9 weeks ago         Up 10 minutes                           nginx

所以,nginx容器居然佔用了92GB的磁盤。進一步分析可知,真正佔用磁盤空間的是nginx的日誌文件。那麼這就不難理解了。若是天天的數據請求爲百萬級別,那麼日誌數據天然很是大。

使用truncate命令,能夠將nginx容器的日誌文件「清零」:

truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log

固然,這個命令只是臨時有做用,日誌文件早晚又會漲回來。要從根本上解決問題,須要限制nginx容器的日誌文件大小。這個能夠經過配置日誌的max-size來實現,下面是nginx容器的docker-compose配置文件:

nginx:
  image: nginx:1.12.1
  restart: always
  logging:
    driver: "json-file"
    options:
      max-size: "5g"

重啓nginx容器以後,其日誌文件的大小就被限制在5GB,不再用擔憂了~

4. 重啓Docker

有一次,當我清理了鏡像、容器以及數據卷以後,發現磁盤空間並無減小。根據Docker disk usage提到過的建議,我重啓了Docker,發現磁盤使用率從83%降到了19%。根據高手指點,這應該是與內核3.13相關的BUG,致使Docker沒法清理一些無用目錄:

it’s quite likely that for some reason when those container shutdown, docker couldn’t remove the directory because the shm device was busy. This tends to happen often on 3.13 kernel. You may want to update it to the 4.4 version supported on trusty 14.04.5 LTS.

The reason it disappeared after a restart, is that daemon probably tried and succeeded to clean up left over data from stopped containers.

我查看了一下內核版本,發現真的是3.13:

uname -r
3.13.0-86-generic

若是你的內核版本也是3.13,並且清理磁盤沒能成功,不妨重啓一下Docker。固然,這個晚上操做比較靠譜。

相關文章
相關標籤/搜索