(轉)Docker磁盤垃圾清理
文章轉自https://mp.weixin.qq.com/s/S8ZjGZF8oLC8c1JRnkE5yw?tdsourcetag=s_pctim_aiomsg
1、整體分析
對於Docker來說,存在鏡像、容器、存儲卷和網絡這些對象。因此,也就會生產相對應的這些對象,這些對象會占據磁盤空間。當這些對象不在被使用時,為了不占據額外的磁盤空間,就需要對這些對象進行清理,即進行垃圾清理。在docker 1.13版本之後,提供了對各種對象的prune命令,也提供了清理所有對象類型的docker system prune命令。但在docker 1.13之前的版本,則需要提供其他方式進行垃圾清理。
2、垃圾清理
2.1 docker v1.13之後版本的垃圾清理
2.1.1 容器
在停止容器時,系統並不會知道刪除這個容器,除非在運行此容器時設置了–rm字段。停止後的容器仍然會占據磁盤的存儲空間,通過docker container prune能夠刪除這些被停止後的容器。
-
$ docker container prune
-
WARNING! This will remove all stopped containers.
-
Are you sure you want to continue? [y/N] y
執行此命令時,默認會提示是否繼續。如果在執行命令是設置了-f或–force字段,則會直接刪除已所有已停止的容器。默認情況下,此命令執行時會刪除所有的已停止的容器,也可以通過設置–filter字段,來過濾所要刪除的容器。例如,下面的命令僅僅刪除停止超過24小時的容器。
-
$ docker container prune --filter "until=24h"
2.1.2 鏡像
通過執行docker images prune命令可以清除所有不再使用的鏡像,默認情況下此命令僅僅清除狀態為dangling的鏡像。狀態為dangling的鏡像為未被打標簽和沒有被任何容器引用的鏡像。
-
$ docker image prune
-
-
WARNING! This will remove all dangling images.
-
Are you sure you want to continue? [y/N] y
如果要移除所有未被使用的鏡像,則通過設置-a字段來實現:
-
$ docker image prune -a
-
-
WARNING! This will remove all images without at least one container associated to them.
-
Are you sure you want to continue? [y/N] y
執行此命令時,默認會提示是否繼續。如果在執行命令是設置了-f或–force字段,則會直接進行刪除操作。可以通過設置–filter字段,來過濾所要刪除的鏡像。例如,下面的命令僅僅刪除停止創建超過24小時的鏡像。
-
$ docker image prune -a --filter "until=24h"
2.1.3 存儲卷
存儲卷可以被一個或者多個容器使用,也會占據磁盤空間。為保持數據,存儲卷永遠都不會自動被刪除。
-
$ docker volume prune
-
-
WARNING! This will remove all volumes not used by at least one container.
-
Are you sure you want to continue? [y/N] y
執行此命令時,默認會提示是否繼續。如果在執行命令是設置了-f或–force字段,則會直接進行刪除操作。默認情況下,此命令執行時會刪除所有的未被使用的存儲卷,也可以通過設置–filter字段,來過濾所要刪除的存儲卷。例如,下面的命令僅僅刪除label值為keep的存儲卷。
-
$ docker volume prune --filter "label!=keep"
2.1.4 網絡
docker網絡並不會占據磁盤空間,但是會創建iptables規則,橋網絡設備和路由表。因此,但如何不再使用這些資源時,應該對其進行清理。
-
$ docker network prune
-
-
WARNING! This will remove all networks not used by at least one container.
-
Are you sure you want to continue? [y/N] y
執行此命令時,默認會提示是否繼續。如果在執行命令是設置了-f或–force字段,則會直接進行刪除操作。默認情況下,此命令執行時會刪除所有的未被使用的網絡,也可以通過設置–filter字段,來過濾所要刪除的網絡。例如,下面的命令僅僅為被使用超過24小時的網絡。
-
$ docker network prune --filter "until=24h"
2.1.5 刪除所有的對象
通過docker system prune命令能夠快速的刪除所有的未被使用的對象,包括鏡像、容器、網絡和存儲卷。在docker 17.06.0之前,存儲卷會同時被清理。在docker 17.06.1之後,需要通過設置–volumes字段,才會同時清理存儲卷。
-
$ docker system prune
-
-
WARNING! This will remove:
-
- all stopped containers
-
- all networks not used by at least one container
-
- all dangling images
-
- all build cache
-
Are you sure you want to continue? [y/N] y
如果所使用的docker 17.06.1之後的版本,則需要在命令後添加–volumes字段來清理存儲卷的內容。
-
$ docker system prune --volumes
-
-
WARNING! This will remove:
-
- all stopped containers
-
- all networks not used by at least one container
-
- all volumes not used by at least one container
-
- all dangling images
-
- all build cache
-
Are you sure you want to continue? [y/N] y
2.2 docker v1.13之前版本的垃圾清理
2.2.1 容器
在停止容器時,系統並不會知道刪除這個容器,除非在運行此容器時設置了–rm字段。停止後的容器仍然會占據磁盤的存儲空間,通過docker rm能夠刪除這些被停止後的容器。通過下面的命令能夠清除所有已停止的容器。
-
$ docker rm $(docker ps -a -q)
2.2.2 鏡像
通過執行docker rmi命令可以清除所有不再使用的鏡像,一般情況下僅僅清除狀態為dangling的鏡像。狀態為dangling的鏡像為未被打標簽和沒有被任何容器引用的鏡像。
-
$ docker rmi $(docker images -q -f "dangling=true")
2.2.3 存儲卷
存儲卷可以被一個或者多個容器使用,也會占據磁盤空間。為了保持數據,存儲卷永遠都不會自動被刪除。
-
$ docker volume rm $(docker volume ls -q -f dangling=true)
參考資料
1.《docker container prune》地址:https://docs.docker.com/engine/reference/commandline/container_prune/
2.《Prune unused Docker objects》地址:https://docs.docker.com/config/pruning/
3.《docker image prune》地址:https://docs.docker.com/engine/reference/commandline/image_prune/
4.《docker volume prune》地址:https://docs.docker.com/engine/reference/commandline/volume_prune/
5.《docker network prune》地址:https://docs.docker.com/engine/reference/commandline/network_prune/
作者簡介:
季向遠,北京神舟航天軟件技術有限公司。本文版權歸原作者所有。
(轉)Docker磁盤垃圾清理