背景
在使用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)