网站首页 > 教程文章 正文
技术背景
在长时间使用Docker的过程中,系统中会积累大量的镜像,这些镜像会占用大量的磁盘空间。为了释放磁盘空间,需要移除那些旧的和未使用的Docker镜像。未使用的镜像包括未被任何容器引用的镜像、悬空镜像(没有标签的镜像)以及长时间未使用的镜像等。
实现步骤
1. 移除悬空镜像
悬空镜像是指没有标签的镜像,通常是构建过程中产生的中间层镜像。可以使用以下命令移除悬空镜像:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
也可以设置一个别名来方便操作:
alias drmi='docker rmi $(docker images --filter "dangling=true" -q --no-trunc)'
2. 移除停止的容器
在清理镜像之前,建议先清理停止的容器,这样可以捕获更多的悬空镜像并减少错误。可以使用以下命令移除停止的容器:
docker rm $(docker ps -qa --no-trunc --filter "status=exited")
同样可以设置别名:
alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'
3. 使用Docker 1.13及以上版本的prune命令
Docker 1.13及以上版本引入了一些新的命令来帮助清理未使用的数据:
- docker system prune:删除所有悬空的数据(容器、网络和镜像)。可以使用--volumes选项删除所有未使用的卷,使用-a选项删除所有未使用的镜像(不仅仅是悬空镜像)。
docker system prune -a --volumes
- docker container prune:删除所有停止的容器。
- docker image prune:删除悬空镜像,使用-a选项可以删除所有未使用的镜像。
docker image prune -a
- docker network prune:删除所有未使用的网络。
- docker volume prune:删除所有未使用的卷。
4. 按时间过滤移除旧镜像
可以使用--filter选项按时间过滤移除旧镜像。例如,移除6个月前的镜像:
docker image prune --all --filter "until=4320h"
5. 移除特定模式的镜像
可以使用grep和awk命令结合来移除特定模式的镜像。例如,移除带有SNAPSHOT的镜像:
docker rmi $(docker images | grep SNAPSHOT | awk '{print $3}')
核心代码
以下是一个清理Docker镜像和容器的脚本示例:
#!/bin/bash -x
# 移除停止的容器
docker ps -a | grep Exited | awk '{print $1}' | xargs docker rm
# 移除悬空镜像
docker rmi $(docker images -f "dangling=true" -q)
# 移除特定模式的镜像
docker rmi $(docker images | grep SNAPSHOT | awk '{print $3}')
# 移除数周前的镜像
docker images | grep "weeks ago" | awk '{print $3}' | xargs docker rmi
最佳实践
- 在使用docker system prune -a命令之前要谨慎,因为它会删除所有未使用的镜像和卷,可能会删除你需要的数据。
- 定期清理镜像和容器,避免磁盘空间被大量占用。
- 使用--filter选项可以更精确地控制要删除的镜像。
常见问题
1. 没有“预览”或“--dry-run”选项
docker xxx prune命令没有“预览”或“--dry-run”选项,因为实现起来比较复杂,涉及到竞态条件、对象之间的依赖关系等问题。
2. “until”过滤器不按预期工作
--filter "until="过滤器查看的是镜像本身的创建时间,而不是本地镜像的拉取/创建时间。如果你希望清理在主机上闲置一段时间的镜像,这个过滤器可能无法满足需求。
3. 移除镜像时提示被容器引用
如果在移除镜像时提示该镜像被容器引用,可以先停止并移除相关的容器,然后再尝试移除镜像。
docker stop <container_id>
docker rm <container_id>
docker rmi <image_id>
- 上一篇: 删除所有本地Docker镜像的方法
- 下一篇: 如何移除Docker镜像
猜你喜欢
- 2025-05-21 10张图带你深入理解Docker容器和镜像
- 2025-05-21 Docker实战(二):快速学会镜像的基本使用
- 2025-05-21 那些被"删除"却仍占用空间的文件
- 2025-05-21 Docker镜像与容器的区别
- 2025-05-21 Docker基础知识之操作镜像
- 2025-05-21 带你找回那些被 Docker 吃掉的磁盘空间
- 2025-05-21 Docker工具的使用方法进阶-关于镜像
- 2025-05-21 无论是开发还是运维,都必须掌握的Docker常用命令
- 2025-05-21 Windows 上 Docker 镜像与容器更新全攻略
- 2025-05-21 docker常用命令大全,看这一篇就够了
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)