摘要:用了 Docker,好處挺多的,可是有一個不大不小的問題,它會一不當心佔用太多磁盤,這就意味着咱們必須及時清理。nginx
做爲一個有信仰的技術公司,咱們Fundebug的後臺採用了酷炫的全 Docker 化架構,全部服務,包括數據庫都運行在 Docker 裏面。這樣作固然不是爲了炫技,看得清楚的好處仍是很多的:git
至少,上線這一年多來,Docker 一直很是穩定,沒有出什麼問題。可是,它有一個不大不小的問題,會比較消耗磁盤空間。github
若是 Docker 一不當心把磁盤空間全佔滿了,你的服務也就算玩完了,所以全部 Docker 用戶都須要對此保持警戒。固然,你們也沒關係張,這個問題仍是挺好解決的。docker
在誰用光了磁盤?Docker System 命令詳解中,咱們詳細介紹了docker system命令,它能夠用於管理磁盤空間。數據庫
docker system df命令,相似於 Linux 上的df命令,用於查看 Docker 的磁盤使用狀況:json
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 鏡像都刪掉了...因此使用以前必定要想清楚吶。微信小程序
執行docker system prune -a命令以後,Docker 佔用的磁盤空間減小了不少:bash
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
對於舊版的 Docker(版本 1.13 以前),是沒有 docker system 命令的,所以須要進行手動清理。這裏給出幾個經常使用的命
刪除全部關閉的容器服務器
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)
Fundebug提供實時、專業的錯誤監控服務,爲您的線上代碼保駕護航,歡迎你們無償使用!
有一次,當我使用 1 與 2 提到的方法清理磁盤以後,發現並無什麼做用,因而,我進行了一系列分析。
在 Ubuntu 上,Docker 的全部相關文件,包括鏡像、容器等都保存在/var/lib/docker/目錄中:
du -hs /var/lib/docker/ 97G /var/lib/docker/
Docker 居然使用了將近100GB磁盤,這也是夠了。使用du命令繼續查看,能夠定位到真正佔用這麼多磁盤的目錄:
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 的日誌文件。那麼這就不難理解了。咱們Fundebug天天的數據請求爲百萬級別,那麼日誌數據天然很是大。
使用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,不再用擔憂了~
還有一次,當我清理了鏡像、容器以及數據卷以後,發現磁盤空間並無減小。根據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。固然,這個晚上操做比較靠譜。
Fundebug專一於JavaScript、微信小程序、微信小遊戲、支付寶小程序、React Native、Node.js和Java線上應用實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了10億+錯誤事件,付費客戶有Google、360、金山軟件、百姓網等衆多品牌企業。歡迎你們免費試用!
轉載時請註明做者Fundebug以及本文地址:
https://blog.fundebug.com/2018/01/10/how-to-clean-docker-disk/