Docker 镜像列表中的 none:none 是什么
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
在构建过 Docker 镜像的电脑上查看本地镜像列表,有可能看到下图红框中的镜像,在列表中展示为<none>:<none> :
这种镜像在 Docker 官方文档中被称作 dangling images ,指的是没有标签并且没有被容器使用的镜像。
官方解释
来自官方的解释如下图红框所示,地址是:https://docs.docker.com/config/pruning/
怎么来的
结合第一幅图,梳理一下 dangling images 怎么产生的:
第一次构建镜像时生成的镜像 ID 为 079dbd67f9f4,此镜像会被构建工具加上标签 bolingcavalry/eureka-server:0.0.1-SNAPSHOT;
第二次构建镜像时生成的镜像 ID 为 e40a97f764ef,此镜像会被构建工具加上标签 bolingcavalry/eureka-server:0.0.1-SNAPSHOT,
Docker 会移除 079dbd67f9f4 的标签,此时 079dbd67f9f4 就变成了 dangling images,在镜像列表中展示为<none>:<none>
准备实战
接下来通过实际操作来复现此问题,并做一些有趣的测试;
操作的主要内容是将一个 maven 工程构建成 Docker 镜像,以下是环境信息:
操作系统:Ubuntu 18.04.2 LTS
Docker:18.06.1-ce
Java:1.8.0_191
Maven:3.6.0
实战源码下载
如果您不想写代码,也可以在 Github 下载整个 maven 工程,地址和链接信息如下表所示:
这个 git 项目中有多个文件夹,本章源码在 springcloudscaledemo 这个文件夹下,如下图红框所示:
springcloudscaledemo 文件夹内有三个工程,本次实战用到的是 eureka-server,如下图:
实战操作
接下来一起开发一个简单的 java 项目:
基于 Maven 创建一个 springboot 工程,pom.xml 内容如下,主要注意 plugins 节点中的插件,该插件是用来构建镜像的:
application.properties 内容如下,可见该应用其实就是 springcloud 中的 eureka 身份:
启动类是 EurekaServerApplication,内容如下:
现在工程已经创建好了,可以开始构建了;
构建镜像
在 pom.xml 所在目录执行以下命令即可构建镜像:
构建成功后,用 docker images 命令查看本地镜像列表如下,新增了 ID 为 90b736eb388e 的镜像:
再次执行命令 mvn clean package -U -DskipTests docker:build ,也就是再构建一次;
构建完成后查看镜像列表,ID 为 90b736eb388e 的镜像已经成为 dangling images,标签 bolingcavalry/eureka-server:0.0.1-SNAPSHOT 已经被新镜像 be262f101e2c 占有:
此时,如果您的镜像列表出现<none>:<none> ,您也能分析出此现象的来源了,接下来试试如何清理 dangling images。
清理 dangling images
如下所示,执行命令 docker image prune 即可删除 dangling images:
再次查看,发现 90b736eb388e 已经不在列表中:
一点疑问
再来看看官方对 dangling images 的解释,如下所示,有两个条件:没有标签、并且不再被容器使用:
我的疑问:如果没有标签,但是正在被容器使用的镜像,应该不算 dangling images 吧,此时如果执行命令 docker image prune 会怎么样呢?
我的猜测:docker image prune 是用来清理 dangling images 的,如果镜像正在被使用那就不算 dangling images,那就不会被清理掉;
还是动手来试试吧:
执行以下命令会用镜像 bolingcavalry/eureka-server:0.0.1-SNAPSHOT 创建一个容器:
再次执行命令 mvn clean package -U -DskipTests docker:build ,也就是再构建一次;
查看镜像信息如下,此时 be262f101e2c 在列表中已经显示成了<none>:<none> :
执行命令 docker ps 查看容器,发现 IMAGE 字段已经变成了 ID(之前是 bolingcavalry/eureka-server:0.0.1-SNAPSHOT):
执行命令 docker image prune ,再查看镜像列表,如下,可见 be262f101e2c 依旧在列表中,没有被清理掉 ,符合之前的猜测:被容器用到的镜像不是 dangling images,用命令 docker image prune 无法清除:
至此,对 Docker 镜像列表中的 none:none 已经了解,希望在您有类似疑惑时本文可以提供一些参考。
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/602448fe01cf23e1570807d22】。文章转载请联系作者。
评论