隨着容器概念的普及,愈來愈多的系統以容器的形式部署升級,但隨着時間的推移,咱們會發現主機中的鏡像文件愈來愈多,其中有不少舊版本的鏡像,佔用了大量的存儲空間,此時就須要按期清理那些沒有價值的鏡像。java
本文會根據筆者所負責的節點進行介紹。docker
1、介紹
節點特色:測試
- 節點中部署着多個指定版本的應用系統。
- 節點中存在應用系統歷史版本的docker鏡像文件。
清理目標:spa
- 清理非當前使用版本的鏡像文件。
- 後續更新時沒必要花大量的時間從新拉取中間鏡像層。
2、 分析現狀
a. 主機鏡像文件現狀3d
b. 主機容器運行現狀code
c. 製做鏡像的Dockerfileblog
d. 存儲空間大小部署
分析:從上面的圖中可知,主機中有以下幾種鏡像:class
- 使用中的鏡像:32.1.0.84/test/athena:develop_1749
- 歷史版本鏡像:32.1.0.84/test/athena:develop_1747
- 基礎鏡像:java:8
- dangling鏡像:ID爲1a9f88c0c230的鏡像。(是因爲使用同一個tag屢次構建內容不一樣的鏡像,致使較早的鏡像變爲dangling鏡像)
dangling鏡像和歷史版本鏡像是再也不須要的鏡像文件,白白佔用了必定的存儲空間,須要清理。使用中的鏡像很明顯不該該被清理。爲了不後續更新時花大量的時間從新拉取,因此基礎鏡像不該該被清理。test
3、 分別處理各類鏡像
3.1 dangling鏡像
dangling是一種特殊的,不會再被使用到的鏡像,docker有專門清理dangling鏡像的命令。
docker image prune -f
從圖中能夠看出部分docker鏡像已經被清理,而且提示釋放了39.45MB的空間。
檢查一下剩餘的鏡像,能夠看見dangling鏡像已經不存在了,符合預期。
檢查當前的存儲空間大小,能夠發現釋放了40MB的空間,也是符合預期的。
3.2 歷史版本鏡像
直接使用docker刪除鏡像的命令便可。
docker rmi [image]
從圖中能夠看出歷史版本的鏡像已經被清理。
檢查一下剩餘的鏡像,能夠看見歷史版本鏡像已經不存在了。
檢查當前的存儲空間大小,能夠發現又釋放了40MB的空間,也是符合預期的。
3.3 使用中的鏡像
筆者須要在批量刪除無用鏡像的時候,保留使用中的鏡像。幸運的是,docker的刪除命令沒法直接刪除正在被容器使用的鏡像。測試一下讓本身放心。
3.4 基礎鏡像
爲了後續更新的效率,筆者須要在批量刪除無用鏡像的時候,保留基礎鏡像。
因爲基礎鏡像沒有被容器直接使用,因此刪除命令能夠執行。測試以下:
剛開始看見命令被成功執行時,筆者心中是崩潰的,可是仔細看了一下顯示的刪除過程,發現只有「Untagged」而沒有「Deleted」,心中竊喜,猜想是否是隻刪除了tag,鏡像層並無被刪除。趕忙檢查一下,果真發現和筆者猜測的同樣,因爲基礎鏡像中的鏡像層目前正被容器使用着,因此並未被刪除。
爲了證明更新應用鏡像時不會消耗大量時間去拉取基礎鏡像,筆者再次構建應用的鏡像進行檢查從而得以驗證。
4、結論
- dangling鏡像經過命令 docker image prune -f 清理。
- 經過命令 docker images | awk 'NR!=1{print $1":"$2}' | xargs docker rmi 能夠批量清除無用的鏡像,且不會影響使用中的鏡像和基礎鏡像,知足筆者的需求。