背景
在使用docker進行容器化管理后會發現本次硬盤文件占用量在不斷上升,並且即使是刪除掉容器或者鏡像也並不能釋放掉對應的硬盤空間。本文將提供對應的docker命令用於真正釋放掉該部分應被刪除釋放的空間卻仍然存留占用硬盤空間的相關垃圾文件。
查詢命令
docker system df
docker空間占用查看,該命令可以列出docker應用中鏡像,容器,數據卷所占用的容量,在此說明下即使是容器被刪除了數據卷也不會隨着容器的刪除而刪除。
[root@root ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 5 1 1.512 GB 1.386 GB (91%)
Containers 1 0 5 kB 5 kB (100%)
Local Volumes 0 0 0 B 0 B
增加-v命令可以輸出更加詳細的占用信息,針對每個鏡像,每個容器,每個數據卷信息都將被輸出。用戶可以根據該命令來判斷是哪個鏡像、容器、數據卷導致的占用過高
docker system df -v
Images space usage:
REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS
docker.io/nginx latest 5ad3bd0e67a9 7 days ago 126.7 MB 0 B 126.7 MB 1
docker.io/jenkins/jenkins latest 5810ec636c04 5 weeks ago 581.9 MB 0 B 581.9 MB 0
docker.io/ubuntu 14.04 6e4f1fe62ff1 5 weeks ago 196.5 MB 0 B 196.5 MB 0
docker.io/mysql 5.6 e143ed325782 2 months ago 302.4 MB 0 B 302.4 MB 0
docker.io/adoptopenjdk/openjdk8 latest 48f5ba11c251 4 months ago 304.8 MB 0 B 304.8 MB 0
Containers space usage:
CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS NAMES
39cc6235b753 docker.io/nginx "nginx -g 'daemon ..." 0 5 kB 28 hours ago Exited (0) 26 hours ago xxxx
Local Volumes space usage:
VOLUME NAME LINKS SIZE
清除命令
自動清理命令
docker system prune可對空間進行自動清理。
該命令所清理的對象如下:
- 已停止的容器(未啟動的容器)
- 未被任何容器使用的卷
- 未被任何容器所關聯的網絡
- 所有懸空的鏡像(未配置任何Tag(也就是無法被引用)的鏡像,通常是由於鏡像編譯過程中未指定-t參數配置Tag導致的,又或者是在鏡像編譯過程中因為某種原因導致構建失敗的鏡像)
docker system prune后可以加額外的參數,如:
- docker system prune -a : 一並清除所有未被使用的鏡像(未被構建成容器容器的鏡像)和懸空鏡像。
- docker system prune -f : 用以強制刪除,不提示信息。
另外除了system級別的,還有針對容器或是鏡像級別的刪除命令:
- docker image prune:刪除懸空的鏡像。
- docker container prune:刪除無用的容器。
--默認情況下docker container prune命令會清理掉所有處於stopped狀態的容器
--如果不想那么殘忍統統都刪掉,也可以使用--filter標志來篩選出不希望被清理掉的容器。例子:清除掉所有停掉的容器,但24內創建的除外:
--$ docker container prune --filter "until=24h" - docker volume prune:刪除無用的卷。
- docker network prune:刪除無用的網絡
手動刪除
也可以通過查詢出相關的鏡像、容器、數據卷后調用相應的刪除語句進行刪除。
例如:
- 刪除所有懸空鏡像,不刪除未使用鏡像:
docker rmi $(docker images -f "dangling=true" -q) - 刪除所有未使用鏡像和懸空鏡像
docker rmi $(docker images -q) - 清理卷
如果卷占用空間過高,可以清除一些不使用的卷,包括一些未被任何容器調用的卷(-v 詳細信息中若顯示 LINKS = 0,則是未被調用):
刪除所有未被容器引用的卷:
docker volume rm $(docker volume ls -qf dangling=true) - 容器清理
如果發現是容器占用過高的空間,可以手動刪除一些:
刪除所有已退出的容器:
docker rm -v $(docker ps -aq -f status=exited) - 刪除所有狀態為dead的容器
docker rm -v $(docker ps -aq -f status=dead)