如何移除旧的和未使用的Docker镜像
如何移除旧的和未使用的Docker镜像
技术背景
在长时间使用Docker的过程中,系统中会积累大量的镜像,这些镜像会占用大量的磁盘空间。为了释放磁盘空间,需要移除那些旧的和未使用的Docker镜像。未使用的镜像包括未被任何容器引用的镜像、悬空镜像(没有标签的镜像)以及长时间未使用的镜像等。
实现步骤
1. 移除悬空镜像
悬空镜像是指没有标签的镜像,通常是构建过程中产生的中间层镜像。可以使用以下命令移除悬空镜像:
1 |
|
也可以设置一个别名来方便操作:
1 |
|
2. 移除停止的容器
在清理镜像之前,建议先清理停止的容器,这样可以捕获更多的悬空镜像并减少错误。可以使用以下命令移除停止的容器:
1 |
|
同样可以设置别名:
1 |
|
3. 使用Docker 1.13及以上版本的prune命令
Docker 1.13及以上版本引入了一些新的命令来帮助清理未使用的数据:
docker system prune
:删除所有悬空的数据(容器、网络和镜像)。可以使用--volumes
选项删除所有未使用的卷,使用-a
选项删除所有未使用的镜像(不仅仅是悬空镜像)。
1 |
|
docker container prune
:删除所有停止的容器。docker image prune
:删除悬空镜像,使用-a
选项可以删除所有未使用的镜像。
1 |
|
docker network prune
:删除所有未使用的网络。docker volume prune
:删除所有未使用的卷。
4. 按时间过滤移除旧镜像
可以使用--filter
选项按时间过滤移除旧镜像。例如,移除6个月前的镜像:
1 |
|
5. 移除特定模式的镜像
可以使用grep
和awk
命令结合来移除特定模式的镜像。例如,移除带有SNAPSHOT
的镜像:
1 |
|
核心代码
以下是一个清理Docker镜像和容器的脚本示例:
1 |
|
最佳实践
- 在使用
docker system prune -a
命令之前要谨慎,因为它会删除所有未使用的镜像和卷,可能会删除你需要的数据。 - 定期清理镜像和容器,避免磁盘空间被大量占用。
- 使用
--filter
选项可以更精确地控制要删除的镜像。
常见问题
1. 没有“预览”或“–dry-run”选项
docker xxx prune
命令没有“预览”或“–dry-run”选项,因为实现起来比较复杂,涉及到竞态条件、对象之间的依赖关系等问题。
2. “until”过滤器不按预期工作
--filter "until="
过滤器查看的是镜像本身的创建时间,而不是本地镜像的拉取/创建时间。如果你希望清理在主机上闲置一段时间的镜像,这个过滤器可能无法满足需求。
3. 移除镜像时提示被容器引用
如果在移除镜像时提示该镜像被容器引用,可以先停止并移除相关的容器,然后再尝试移除镜像。
1 |
|
如何移除旧的和未使用的Docker镜像
https://119291.xyz/posts/how-to-remove-old-and-unused-docker-images/