《Docker技术入门与实战》——3.4 删除镜像

简介:

本节书摘来自华章计算机《Docker技术入门与实战》一书中的第3章,第3.4节,作者:杨保华,戴王剑,曹亚仑著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.4 删除镜像

使用镜像的标签删除镜像
使用docker rmi命令可以删除镜像,命令格式为docker rmi IMAGE [IMAGE...],其中IMAGE可以为标签或ID。
例如,要删除掉dl.dockerpool.com:5000/ubuntu:latest镜像,可以使用如下命令:

$ sudo docker rmi dl.dockerpool.com:5000/ubuntu
Untagged: dl.dockerpool.com:5000/ubuntu:latest

读者可能会担心,本地的ubuntu:latest镜像是否会受到此命令的影响。无需担心,当同一个镜像拥有多个标签的时候,docker rmi命令只是删除了该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上述操作相当于只是删除了镜像5506de2b643b的一个标签而已。
为保险起见,再次查看本地的镜像,发现ubuntu:latest镜像(准确地说,是5506de2b643b镜像)仍然存在:

$ sudo docker images
REPOSITORY         TAG          IMAGE ID          CREATED          VIRTUAL SIZE
ubuntu             14.04        5506de2b643b      1 weeks ago      197.8 MB
ubuntu             latest       5506de2b643b      1 weeks ago      192.8 MB

但当镜像只剩下一个标签的时候就要小心了,此时再使用docker rmi命令会彻底删除该镜像。
假设本地存在一个标签为mysql:latest的镜像,且没有额外的标签指向它,执行docker rmi命令,可以看出它会删除这个镜像文件的所有AUFS层:

$ sudo docker rmi mysql:latest
Untagged: mysql:latest
Deleted: 9a09222edf600a03ea48bd23cfa363841e45a8715237e3a58cb0167f0e8bad54
Deleted: 4daeda4ad839a152a3b649672bd5135977d7f81866d3bc0e16d0af3f65cc8af6
Deleted: cf07a411bf0883bd632940e8108dac49c64456a47f7390507de5685bbd6daf85
Deleted: 4f513746df18b222a07bb8d76d4b6d29752ce5dcb69bfad0ce92e6c1449a3821
Deleted: 228ecd435c8a29d25b77999036701a27f2d67874c915bb8eb9fb175b1f98aa60
Deleted: 37e4b3932afa186924a09eab332bc8ebec3aac8bac074314ed9a2d1e94547f50
Deleted: 898883ccfcee705e440547e30e240cb025c12410d7c9e4d2bcb11973ba075975
Deleted: 0a09ddcf99b7fd8fcb3525c41b54696038ecf13677f4459f1c98c742ffa60ab2
Deleted: 35bc8591e39be5089265a093e234d13a4b155a01d2ab9e8904eafa81664fb597
Deleted: 857e856e4481d59ee88a4cdedd9aaf855666bd494fa38506e6788361c0af4cda

使用镜像ID删除镜像
当使用docker rmi命令后面跟上镜像的ID(也可以是ID能进行区分的部分前缀串)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,例如:
先利用ubuntu镜像创建一个简单的容器,输出一句话“hello! I am here!”:

$ sudo docker run ubuntu echo 'hello! I am here!'
hello! I am here!

使用docker ps -a命令可以看到本机上存在的所有容器:

$ sudo docker ps -a
CONTAINER ID     IMAGE     COMMAND     CREATED     STATUS      PORTS      NAMES
e812617b41f6     ubuntu:latest     "echo 'hello! I am h     13 seconds ago      Exited (0) 12 seconds ago     silly_leakey

可以看到,后台存在一个退出状态的容器,是刚基于ubuntu:latest镜像创建的。
试图删除该镜像,Docker会提示有容器正在运行,无法删除:

$ sudo docker rmi ubuntu
Error response from daemon: Conflict, cannot delete 5506de2b643b because the container e812617b41f6 is using it, use -f to force
2014/10/16 18:10:31 Error: failed to remove one or more images

如果要想强行删除镜像,可以使用-f参数:

$ sudo docker rmi -f ubuntu

笔者不推荐使用-f参数来强制删除一个存在容器依赖的镜像,因为这样往往会造成一些遗留问题。
再次使用docker images查看本地的镜像列表,读者会发现一个标签为的临时镜像,原来被强制删除的镜像换了新的ID继续存在系统中。

$ sudo docker images
REPOSITORY       TAG          IMAGE ID          CREATED           VIRTUAL SIZE
<none>           <none>       2318d26665ef      3 months ago      198.7 MB

因此,正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。首先删除容器e812617b41f6:

$ sudo docker rm e81
e81

此时再使用临时的ID来删除镜像,此时会正常打印出删除的各层信息:

core@localhost ~ $   docker rmi -f 2318d26665ef
Deleted: 2318d26665eff33e9f91c4c99036751afb40eb58f944a585372bec1407828ad3
Deleted: ebc34468f71dca9cb9937bf4c33062540bcacae148df8a70053bfd1acbecaa20
Deleted: 25f11f5fb0cb9e41531d1da8dc56351286427e070c536f7015fe76e4dae0a4bc
Deleted: 9bad880da3d219b10423804147d6982da1a7bb1e285777a4d746afca6215bebb
Deleted: 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158

此时查看本地镜像,读者会发现临时镜像已经被删除:

$ sudo docker images
REPOSITORY       TAG       IMAGE ID       CREATED       VIRTUAL SIZE
相关文章
|
1月前
|
关系型数据库 MySQL Java
Docker Compose详细教程(从入门到放弃)
Docker Compose详细教程(从入门到放弃)
179 0
|
1月前
|
前端开发 关系型数据库 MySQL
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
|
1月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
1天前
|
监控 Docker 容器
Docker从入门到精通:Docker log 命令学习
了解 Docker 日志管理对容器监控至关重要。`docker logs` 命令用于查看和管理容器日志,例如,`docker logs &lt;container_name&gt;` 显示容器日志,`-f` 或 `--follow` 实时跟踪日志,`--tail` 显示指定行数,`--timestamps` 添加时间戳,`--since` 按日期筛选。Docker 支持多种日志驱动,如 `syslog`,可通过 `--log-driver` 配置。有效管理日志能提升应用程序的稳定性和可维护性。
3 0
|
3天前
|
运维 前端开发 Devops
云效产品使用报错问题之流水线打包docker镜像时报网络代理有问题如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
5天前
|
机器学习/深度学习 数据挖掘 Docker
《Docker 简易速速上手小册》第1章 Docker 基础入门(2024 最新版)
《Docker 简易速速上手小册》第1章 Docker 基础入门(2024 最新版)
19 1
|
13天前
|
存储 Ubuntu 关系型数据库
Docker从入门到精通:ubuntu系统安装docker
本文介绍了Docker的安装过程。首先,文章简述了Docker的组成部分:镜像(如模板用于创建容器服务)、容器(运行应用的独立实体)和仓库(存储镜像的库)。接着,针对Ubuntu系统,详细阐述了卸载旧版本Docker、更新软件包、安装依赖、添加Docker官方GPG密钥和软件源、安装Docker以及配置用户组的步骤。最后,通过启动Docker、验证安装是否成功(运行`hello-world`镜像)和查看Docker版本来确认安装完成。
52 12
|
14天前
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。
|
15天前
|
应用服务中间件 Docker 容器
docker 镜像常用命令
docker 镜像常用命令
35 0
|
15天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
26 0