Docker存储清理
外观
Docker存储清理[编辑 | 编辑源代码]
介绍[编辑 | 编辑源代码]
Docker存储清理是管理Docker磁盘空间的重要操作。随着容器和镜像的频繁创建、删除,Docker会积累未使用的数据(如悬空镜像、停止的容器、未使用的卷和网络),占用大量磁盘空间。本指南将详细介绍如何识别和清理这些资源,适用于初学者和需要优化存储的高级用户。
为什么需要清理Docker存储[编辑 | 编辑源代码]
Docker的默认存储驱动(如`overlay2`)会保留以下冗余数据:
- 悬空镜像(Dangling images):未被任何容器引用的中间镜像层。
- 未使用的容器:已停止但未删除的容器。
- 孤儿卷(Orphaned volumes):未被任何容器使用的数据卷。
- 缓存构建层:构建镜像时生成的临时层。
长期不清理可能导致磁盘空间耗尽,影响系统性能。
清理方法[编辑 | 编辑源代码]
1. 查看当前磁盘使用情况[编辑 | 编辑源代码]
使用以下命令查看Docker存储分布:
docker system df
输出示例:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 10 6 2.1GB 800MB (38%) Containers 4 1 120MB 60MB (50%) Local Volumes 3 1 500MB 400MB (80%) Build Cache 5 0 300MB 300MB (100%)
2. 删除悬空镜像[编辑 | 编辑源代码]
悬空镜像是未被标记或引用的镜像层,通常由重复构建或删除操作产生:
docker image prune
若需强制删除所有未被使用的镜像(包括未被容器引用的):
docker image prune -a
3. 清理停止的容器[编辑 | 编辑源代码]
删除所有已停止的容器:
docker container prune
4. 清理未使用的数据卷[编辑 | 编辑源代码]
孤儿卷可能包含旧数据,手动清理需谨慎:
docker volume prune
5. 清理构建缓存[编辑 | 编辑源代码]
构建镜像时生成的缓存层可通过以下命令清理:
docker builder prune
6. 一键清理所有未使用对象[编辑 | 编辑源代码]
综合清理镜像、容器、卷和网络:
docker system prune -a --volumes
页面模块:Message box/ambox.css没有内容。
使用 -a 会删除所有未使用的镜像(不仅仅是悬空镜像),--volumes 会删除未使用的卷。 |
实际案例[编辑 | 编辑源代码]
案例1:开发环境定期清理[编辑 | 编辑源代码]
开发者每天构建多次镜像,导致磁盘快速占满。可通过定时任务(Cron)每周运行:
0 3 * * 0 docker system prune -f
案例2:CI/CD流水线优化[编辑 | 编辑源代码]
在CI/CD中,每次构建后清理缓存和悬空镜像:
#!/bin/bash
docker build -t my-app .
docker run --rm my-app test
docker image rm my-app
docker builder prune -f
高级技巧[编辑 | 编辑源代码]
限制Docker日志大小[编辑 | 编辑源代码]
容器日志可能占用大量空间。全局限制日志大小(在/etc/docker/daemon.json
中配置):
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
手动删除特定卷或镜像[编辑 | 编辑源代码]
若需精确删除某个对象,先查询ID再操作:
# 列出所有卷
docker volume ls
# 删除指定卷
docker volume rm my_volume
存储驱动的影响[编辑 | 编辑源代码]
不同存储驱动(如overlay2
、devicemapper
)的清理机制略有差异。可通过以下命令查看当前驱动:
docker info | grep "Storage Driver"
总结[编辑 | 编辑源代码]
定期清理Docker存储可节省磁盘空间并提升性能。关键命令总结:
操作 | 命令 |
---|---|
删除悬空镜像 | docker image prune
|
删除所有未使用镜像 | docker image prune -a
|
清理停止的容器 | docker container prune
|
清理未使用的卷 | docker volume prune
|
一键清理所有资源 | docker system prune -a --volumes
|