docker的磁盘管理及清理

在宿主主机中使用docker,拉取镜像和建立容器,时间长了可能会造成磁盘紧张,这时候可能需要进行清理一些无用的docker数据。在数据清理方面,docker自身提供了很好的清理和管理方式,下面简单介绍一下。

首先,我们可以查看Docker磁盘空间的占用情况:

1
2
3
4
5
6
[root@server]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 5 5 1.046GB 69.22MB (6%)
Containers 5 5 290.6kB 0B (0%)
Local Volumes 3 1 413.1MB 219.5MB (53%)
Build Cache 0 0 0B 0B

更详细的查看使用参数-v:

1
[root@server]# docker system df -v

如果磁盘占用过多,就需要清理无用的数据,docker提供了system级的自动清理方式。对磁盘空间进行自动清理的命令:

1
[root@server]# docker system prune

注意:这个命令具体清理的数据有:
a、已停止的容器
b、未被任何容器使用的卷
c、未被任何容器所关联的网络
d、所有悬空的镜像

docker system prune这个命令后可以使用额外参数,如:

一并清除所有未被使用的镜像和悬空镜像:

1
[root@server]# docker system prune -a

用以强制删除,不提示信息:

1
[root@server]# docker system prune -f

需要说明的:

已使用的镜像:指所有已被容器(包括stop的)关联的镜像,也就是docker ps -a所看到的所有容器对应的image。

未引用镜像:没有被分配或使用在容器中的镜像。

悬空镜像(dangling image):未配置任何Tag(也就是无法被引用)的镜像,通常是由于镜像编译过程中未指定-t参数配置Tag导致的。

另外除了system级别的,还有针对容器或是镜像级别的删除命令:

删除悬空的镜像:

1
[root@server]# docker image prune

删除无用的容器:

1
[root@server]# docker container prune

注意:

默认情况下docker container prune命令会清理掉所有处于stopped状态的容器,如果不想那么残忍统统都删掉,也可以使用–filter标志来筛选出不希望被清理掉的容器。例子:清除掉所有停掉的容器,但24内创建的除外:

1
[root@server]# docker container prune --filter "until=24h"

删除无用的卷:

1
[root@server]# docker volume prune

删除无用的网络:

1
[root@server]# docker network prune

除了docker的自动清理,也可手动指定条件进行清理。

对于悬空镜像和未被使用的镜像可以使用手动进行个别删除:

1、删除所有悬空镜像,不删除未使用镜像:

1
[root@server]# docker rmi $(docker images -f "dangling=true" -q)

2、删除所有未被使用的镜像和悬空镜像:

1
[root@server]# docker rmi $(docker images -q)

3、清理卷:

如果卷占用空间过高,可以清除一些不使用的卷,包括一些未被任何容器调用的卷(-v 详细信息中若显示 LINKS = 0,则是未被调用)。删除所有未被容器引用的卷:

1
[root@server]# docker volume rm $(docker volume ls -qf dangling=true)

4、容器清理:

如果发现是容器占用过高的空间,可以手动删除一些。

删除所有已退出的容器:

1
[root@server]# docker rm -v $(docker ps -aq -f status=exited)

删除所有状态为dead的容器:

1
[root@server]# docker rm -v $(docker ps -aq -f status=dead)