1. 程式人生 > >(轉)Docker磁盤垃圾清理

(轉)Docker磁盤垃圾清理

因此 gin 1.3 磁盤空間 ges tro 存儲空間 其他 24小時

文章轉自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能夠刪除這些被停止後的容器。

  1. $ docker container prune

  2. WARNING! This will remove all stopped containers.

  3. Are you sure you want to continue? [y/N] y

執行此命令時,默認會提示是否繼續。如果在執行命令是設置了-f或–force字段,則會直接刪除已所有已停止的容器。默認情況下,此命令執行時會刪除所有的已停止的容器,也可以通過設置–filter字段,來過濾所要刪除的容器。例如,下面的命令僅僅刪除停止超過24小時的容器。

  1. $ docker container prune --filter "until=24h"

2.1.2 鏡像

通過執行docker images prune命令可以清除所有不再使用的鏡像,默認情況下此命令僅僅清除狀態為dangling的鏡像。狀態為dangling的鏡像為未被打標簽和沒有被任何容器引用的鏡像。

  1. $ docker image prune

  2. WARNING! This will remove all dangling images.

  3. Are you sure you want to continue? [y/N] y

如果要移除所有未被使用的鏡像,則通過設置-a字段來實現:

  1. $ docker image prune -a

  2. WARNING! This will remove all images without at least one container associated to them.

  3. Are you sure you want to continue? [y/N] y

執行此命令時,默認會提示是否繼續。如果在執行命令是設置了-f或–force字段,則會直接進行刪除操作。可以通過設置–filter字段,來過濾所要刪除的鏡像。例如,下面的命令僅僅刪除停止創建超過24小時的鏡像。

  1. $ docker image prune -a --filter "until=24h"

2.1.3 存儲卷

存儲卷可以被一個或者多個容器使用,也會占據磁盤空間。為保持數據,存儲卷永遠都不會自動被刪除。

  1. $ docker volume prune

  2. WARNING! This will remove all volumes not used by at least one container.

  3. Are you sure you want to continue? [y/N] y

執行此命令時,默認會提示是否繼續。如果在執行命令是設置了-f或–force字段,則會直接進行刪除操作。默認情況下,此命令執行時會刪除所有的未被使用的存儲卷,也可以通過設置–filter字段,來過濾所要刪除的存儲卷。例如,下面的命令僅僅刪除label值為keep的存儲卷。

  1. $ docker volume prune --filter "label!=keep"

2.1.4 網絡

docker網絡並不會占據磁盤空間,但是會創建iptables規則,橋網絡設備和路由表。因此,但如何不再使用這些資源時,應該對其進行清理。

  1. $ docker network prune

  2. WARNING! This will remove all networks not used by at least one container.

  3. Are you sure you want to continue? [y/N] y

執行此命令時,默認會提示是否繼續。如果在執行命令是設置了-f或–force字段,則會直接進行刪除操作。默認情況下,此命令執行時會刪除所有的未被使用的網絡,也可以通過設置–filter字段,來過濾所要刪除的網絡。例如,下面的命令僅僅為被使用超過24小時的網絡。

  1. $ docker network prune --filter "until=24h"

2.1.5 刪除所有的對象

通過docker system prune命令能夠快速的刪除所有的未被使用的對象,包括鏡像、容器、網絡和存儲卷。在docker 17.06.0之前,存儲卷會同時被清理。在docker 17.06.1之後,需要通過設置–volumes字段,才會同時清理存儲卷。

  1. $ docker system prune

  2. WARNING! This will remove:

  3. - all stopped containers

  4. - all networks not used by at least one container

  5. - all dangling images

  6. - all build cache

  7. Are you sure you want to continue? [y/N] y

如果所使用的docker 17.06.1之後的版本,則需要在命令後添加–volumes字段來清理存儲卷的內容。

  1. $ docker system prune --volumes

  2. WARNING! This will remove:

  3. - all stopped containers

  4. - all networks not used by at least one container

  5. - all volumes not used by at least one container

  6. - all dangling images

  7. - all build cache

  8. Are you sure you want to continue? [y/N] y

2.2 docker v1.13之前版本的垃圾清理

2.2.1 容器

在停止容器時,系統並不會知道刪除這個容器,除非在運行此容器時設置了–rm字段。停止後的容器仍然會占據磁盤的存儲空間,通過docker rm能夠刪除這些被停止後的容器。通過下面的命令能夠清除所有已停止的容器。

  1. $ docker rm $(docker ps -a -q)

2.2.2 鏡像

通過執行docker rmi命令可以清除所有不再使用的鏡像,一般情況下僅僅清除狀態為dangling的鏡像。狀態為dangling的鏡像為未被打標簽和沒有被任何容器引用的鏡像。

  1. $ docker rmi $(docker images -q -f "dangling=true")

2.2.3 存儲卷

存儲卷可以被一個或者多個容器使用,也會占據磁盤空間。為了保持數據,存儲卷永遠都不會自動被刪除。

  1. $ 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磁盤垃圾清理