【Docker基础】Docker镜像管理:docker rmi、prune详解

目录

引言

1 Docker镜像管理概述

1.1 为什么需要镜像清理?

1.2 镜像生命周期管理

2 docker rmi命令详解

2.1 基本语法

2.2 常用选项

2.3 删除单个镜像

2.4 删除多个镜像

2.5 强制删除镜像

2.6 删除所有镜像

3 docker rmi工作原理

3.1 镜像删除流程

3.2 镜像分层删除机制

4 docker prune命令详解

4.1 docker image prune

4.2 删除悬空镜像

4.3 删除所有未被使用的镜像

4.4 使用过滤条件

4.5 系统级清理

5 docker prune工作原理

5.1 资源清理流程

5.2 资源识别机制

6 实践应用场景

6.1 日常维护脚本

6.2 开发环境空间回收

7 安全操作示例

7.1 删除镜像前的检查

7.2 重要镜像保护

7.3 定期清理策略

7.4 空间监控

8 常见问题与解决方案

8.1 删除镜像时报错"image is referenced in multiple repositories"

8.2 删除镜像后磁盘空间未释放

8.3 误删了重要镜像

8.4 prune命令删除了需要保留的资源

9 总结


引言

在Docker的日常使用中,镜像管理是至关重要的环节,随着开发和部署的进行,系统中会积累大量镜像,这些镜像占用磁盘空间并可能造成管理混乱。本文将探讨两个关键的镜像管理命令:docker rmi和docker prune。

1 Docker镜像管理概述

1.1 为什么需要镜像清理?

Docker镜像采用分层存储结构,这种设计虽然提高了存储效率,但也带来了以下问题:
  • 磁盘空间占用:镜像会随时间积累,占用大量磁盘空间
  • 版本混乱:同一镜像的多个版本可能同时存在
  • 安全隐患:过时的镜像可能包含已知漏洞

1.2 镜像生命周期管理

理解镜像的生命周期有助于我们更好地管理Docker环境,从上图可以看出,docker rmi和docker prune处于生命周期的末端,负责清理不再需要的镜像

2 docker rmi命令详解

docker rmi(Remove Image)命令用于删除一个或多个Docker镜像。

2.1 基本语法

docker rmi [OPTIONS] IMAGE [IMAGE...]

2.2 常用选项

选项

说明

-f, --force

强制删除镜像,即使有容器正在使用它

--no-prune

不删除未被标记的父镜像

2.3 删除单个镜像

docker rmi ubuntu:20.04

2.4 删除多个镜像

docker rmi ubuntu:20.04 nginx:latest

2.5 强制删除镜像

  • 当镜像被容器使用时,需要添加-f参数:
docker rmi -f ubuntu:20.04

2.6 删除所有镜像

  • 结合docker images -q可以删除所有镜像:
docker rmi $(docker images -q) 
#危险操作警告:这会删除所有本地镜像,请谨慎使用!

3 docker rmi工作原理

3.1 镜像删除流程

  • 用户通过Docker客户端发出docker rmi命令
  • Docker客户端将请求发送给Docker守护进程
  • 守护进程检查镜像是否被容器使用
  • 如果没有容器使用,则解除镜像引用并删除未引用的层
  • 如果有容器使用且没有-f参数,则返回错误
  • 最终将操作结果返回给用户

3.2 镜像分层删除机制

Docker镜像由多个只读层组成,删除镜像时:
  • 首先移除该镜像的标签引用
  • 然后检查各层是否还被其他镜像引用
  • 只有不被任何镜像引用的层才会被实际删除
如果删除镜像A:
  • 层1会被删除(仅被A引用)
  • 层2会被保留(还被镜像B引用)
  • 镜像A的标签被移除

4 docker prune命令详解

docker prune是一组用于清理Docker资源的命令,我们主要关注镜像相关的清理。

4.1 docker image prune

  • 删除未被使用的镜像(悬空镜像):
docker image prune [OPTIONS]
  • 常用选项:

选项

说明

-a, --all

删除所有未被容器使用的镜像(不只是悬空镜像)

--filter

提供过滤条件

-f, --force

不提示确认

4.2 删除悬空镜像

docker image prune

4.3 删除所有未被使用的镜像

docker image prune -a

4.4 使用过滤条件

docker image prune --filter "until=24h"

4.5 系统级清理

  • docker system prune可以一次性清理多种Docker资源:
docker system prune [OPTIONS]
  • 常用选项:

选项

说明

-a, --all

删除所有未使用的镜像(不只是悬空镜像)

--volumes

同时删除未使用的卷

-f, --force

不提示确认

5 docker prune工作原理

5.1 资源清理流程

  • 根据命令参数确定清理范围(镜像、容器、网络、卷等)
  • 扫描系统中所有相关资源
  • 识别符合删除条件的资源(未被使用、悬空等)
  • 如果没有-f参数,则提示用户确认
  • 执行实际删除操作
  • 释放磁盘空间
  • 操作完成

5.2 资源识别机制

  • docker prune识别未使用资源的标准:

资源类型

判断标准

悬空镜像

没有标签且不被任何镜像引用的镜像层

未使用镜像

没有被任何容器(包括停止的)使用的镜像

停止的容器

状态为Exited的容器

未使用的网络

没有被任何容器使用的自定义网络

未使用的卷

没有被任何容器引用的卷

6 实践应用场景

6.1 日常维护脚本

  • 可以创建定期执行的清理脚本:
#!/bin/bash# 删除所有停止的容器
docker container prune -f# 删除所有未被使用的网络
docker network prune -f# 删除所有悬空镜像
docker image prune -f# 删除超过一周前的未使用镜像
docker image prune -a --force --filter "until=168h"

6.2 开发环境空间回收

  • 当开发环境磁盘空间不足时:
# 全面清理所有未使用资源(包括未使用的卷) 
docker system prune -af --volumes

7 安全操作示例

7.1 删除镜像前的检查

在删除镜像前,建议先检查:
  • 哪些容器在使用该镜像:
docker ps -a --filter ancestor=IMAGE_NAME
  • 镜像的详细信息:
docker ps -a --filter ancestor=IMAGE_NAME

7.2 重要镜像保护

对于重要镜像,可以:
  • 推送到镜像仓库备份
  • 使用docker save导出为文件:
docker save -o backup.tar IMAGE_NAME

7.3 定期清理策略

建议建立定期清理策略:
  • 每天清理悬空镜像
  • 每周清理未使用的镜像
  • 每月全面清理整个系统

7.4 空间监控

  • 设置磁盘空间监控,当Docker占用超过阈值时触发清理:
# 检查Docker磁盘使用情况 
docker system df

8 常见问题与解决方案

8.1 删除镜像时报错"image is referenced in multiple repositories"

问题原因:同一个镜像ID有多个标签引用
解决方案
  • 先删除所有引用该镜像的标签:
docker rmi repo1:tag repo2:tag
  • 或者使用镜像ID删除:
docker rmi IMAGE_ID

8.2 删除镜像后磁盘空间未释放

问题原因:Docker使用存储驱动可能缓存了数据
解决方案
  • 重启Docker服务:
systemctl restart docker
  • 清理构建缓存:
docker builder prune

8.3 误删了重要镜像

恢复方案
  • 如果镜像来自仓库,重新拉取
  • 如果有容器基于该镜像运行,可以提交容器为新镜像:
docker commit CONTAINER_ID new_image_name

8.4 prune命令删除了需要保留的资源

预防措施
  • 执行前先使用--dry-run查看将删除的内容:
docker system prune --dry-run
  • 使用--filter精确控制删除范围

9 总结

通过合理使用docker rmi和docker prune命令,可以有效管理Docker镜像,保持系统清洁和高效运行。记住定期清理未使用的资源,但也要谨慎操作,避免误删重要镜像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87919.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

57-Oracle SQL Profile(23ai)实操

在上一期中说到了SQL Tuning Advisor其中一个影响对象就是SQL Profile,同样在管理和应用开发中,SQL性能优化是个任重道远的工作,低效的SQL语句让应用响应缓慢,用户整体体验下降,拖垮搞蹦整个系统都有可能。Oracle数据库提供了多种组合工具,有…

man的使用

man的使用 文章目录 man的使用基本用法:常见 man 命令操作:man 命令的章节:示例: man 是 Linux 和 macOS 系统中的命令,用于查看命令和程序的手册页(manual pages)。手册页包含了关于命令、函…

【蓝牙】手机连接Linux系统蓝牙配对,Linux Qt5分享PDF到手机

要实现手机连接 A40i Linux 系统并通过蓝牙接收 PDF 文件,可以按照以下步骤操作: 1. 配置 Linux 蓝牙功能 确保开发板上的蓝牙模块已正确驱动并支持蓝牙协议栈。 安装蓝牙工具: bash sudo apt install bluetooth bluez bluez-tools 启动蓝…

1432. 改变一个整数能得到的最大差值

1432. 改变一个整数能得到的最大差值 题目链接&#xff1a;1432. 改变一个整数能得到的最大差值 代码如下&#xff1a; class Solution { public:int maxDiff(int num) {string s to_string(num);function<int(char, char)> replace_stoi [&](char old_char, cha…

解密 Spring MVC:从 Tomcat 到 Controller 的一次完整请求之旅

今天&#xff0c;想和你聊一个我们每天都在打交道&#xff0c;但可能不曾深入思考的话题&#xff1a;当一个 HTTP 请求从浏览器发出&#xff0c;到最终被我们的 Spring Controller 处理&#xff0c;它到底经历了一场怎样的旅程&#xff1f; 理解这个流程&#xff0c;不仅仅是为…

在 Java 中操作 Map时,高效遍历和安全删除数据

在 Java 中操作 Map 时&#xff0c;高效遍历和安全删除数据可以通过以下方式实现&#xff1a; 一、遍历 Map 的 4 种高效方式 1. 传统迭代器&#xff08;Iterator&#xff09; Map<String, Integer> map new HashMap<>(); map.put("key1", 5); map.pu…

力扣-136.只出现一次的数字

题目描述 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 class Solution {public i…

Go 网络编程:HTTP服务与客户端开发

Go 在标准库中内置了功能强大的 net/http 包&#xff0c;可快速构建高并发、高性能的 HTTP 服务&#xff0c;广泛应用于微服务、Web后端、API中间层等场景。 一、快速创建一个HTTP服务 示例&#xff1a;最简Hello服务 package mainimport ("fmt""net/http&quo…

【Prism】 实现注入的几个标准化步骤(相机举例)

📸 Prism 架构中如何优雅地注册和注入相机服务 在开发基于 Prism + WPF 的应用时,合理使用依赖注入(DI)可以大大提高系统的可维护性和扩展性。本文以一个多相机平台管理系统为例,展示如何通过接口、枚举、容器注册等方式,实现相机服务的灵活配置与使用。 🧩 一、定义…

vue3组件式开发示例

1&#xff0c;定义组件&#xff08;根据实际调整提交分析结果方法&#xff09; <template><!-- 分析结果上传对话框组件 --><el-dialogv-model"uploadResultDialog":title"title":width"width":before-close"handleBeforeC…

基于arm linux的bluealsa开启蓝牙A2DP和SCO录音功能

bluealsa的软件架构 #mermaid-svg-ohITacCRHItwRR1t {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ohITacCRHItwRR1t .error-icon{fill:#552222;}#mermaid-svg-ohITacCRHItwRR1t .error-text{fill:#552222;stroke:…

网页后端开发(基础3--Springboot框架)

web的服务器资源&#xff1a; 静态资源&#xff1a;服务器上存储的不会改变的数据&#xff0c;通常不会根据用户的请求而变化。比如&#xff1a;HTML、CSS、JS、图片、视频等&#xff08;负责页面展示&#xff09; 动态资源&#xff1a;服务器端根据用户请求和其他数据…

ROS通过urdf_to_graphiz对urdf和xacro文件进行结构可视化

对机器人的urdf文件进行结构可视化&#xff1a; 举例命令如下&#xff1a; urdf_to_graphiz go2_description.urdf 输出 .gv 和 .pdf文件&#xff0c;打开 pdf文件如图&#xff1a;

基于Uniapp+PHP的教育培训系统开发指南:网校源码实战剖析

在线教育日益普及的今天&#xff0c;如何快速搭建一个功能完善、体验良好的教育培训系统&#xff0c;成为众多教育机构、培训企业、个体讲师关注的焦点。与其从零开发&#xff0c;不如基于成熟框架快速部署。而UniappPHP正是当前“低成本高效率”开发网校系统的黄金组合。 本文…

键盘 AK35I Pro V2 分析

文章目录 AK35I Pro V21. MCU SN32F299SN32F299 内存映射 2. Bootloader3. TFT 135x240 1.14inch4. 键盘5. Flash PY25Q128HA6. 蓝牙 CH582F7. 扩展板8. 电池 606090 3.7V 4000mAh AK35I Pro V2 AK35I Pro V2 测评视频 键盘外壳使用卡扣固定, 外壳没有螺丝, 将外框向外翘起, 用…

11. TypeScript 工具类型

TypeScript 提供了一系列内置的“工具类型”&#xff08;Utility Types&#xff09;&#xff0c;它们是对已有类型进行变换的便捷方式。通过这些工具类型&#xff0c;开发者可以更灵活、可维护地进行类型设计&#xff0c;避免重复定义类型逻辑。 工具类型的作用主要有&#xf…

Kafka性能调优全攻略:从JVM参数到系统优化

前言 在大数据处理领域&#xff0c;Kafka以其高吞吐、高并发的特性成为消息队列的首选。然而&#xff0c;随着业务规模的扩大和数据量的激增&#xff0c;若配置不当&#xff0c;Kafka的性能和稳定性会受到严重影响。其中&#xff0c;JVM参数的调整是优化Kafka性能的关键一环&a…

HarmonyOS 5 NPU支持哪些AI框架?

以下是HarmonyOS 5 NPU支持的AI框架及适配方案&#xff0c;结合关键技术和实测数据&#xff1a; 一、原生支持框架 MindSpore Lite‌ ‌核心特性‌&#xff1a; 原生适配昇腾达芬奇架构&#xff0c;支持INT8/FP16混合量化自动算子融合优化&#xff08;实测推理速度提升3.2倍…

鸿蒙uvc预览

简单查看流程&#xff0c;如有错误请指出。 CameraNativePreview.ets--> 这里开始进入uvc_camera库 (CameraDevice.ets/CameraManager.ets) --> CameraUtils.ets--> -->CameraNativeMethods(index.d.ts文件&#xff0c;路径: uvc_camera\src\main\cpp\types\…

PHP的打印语句

文章目录 环境总结打印语句换行符括号数组&#xff08;对象&#xff09;和字符串之间的相互转换 打印语句echoprint括号print_rvar_dump 数组&#xff08;对象&#xff09;和字符串之间的转换json_encodejson_decodeimplodeexplode 环境 PHP 8.4.5 总结 如果不想看详细介绍&…