Docker 中 latest 标签引发的困惑

Docker 中 latest 标签引发的困惑

【编者的话】本文介绍了Docker中的一个小知识:latest标签,由于它的字面意思是“最新的”,所以很多时候也容易被误解,其实latest就是个普通标签,不要期望它是最新或最稳定的版本。它只是个名字,没有其它附加作用,更不会自动更新。:)

在Docker中,最容易产生误解的部分应该是latest这个标签。困惑主要是由于这个名字造成的,因为字面意思并不能表达它的真正含义。在本文中,我们来学习下latest标签的真正作用和如何正确使用它。

通常有两种方式来对镜像打标签:使用docker tag命令或者是在执行docker build的时候用-t来传递参数。在这两种情况下,参数的形式通常是repository_name:tag_name,例如:docker tag myrepo:mytag。如果这个资源库被上传到了Docker Hub,资源库的名字会加上一个由Docker Hub用户名和斜线组成的前缀,例如:amouat/myrepo:mytag。如果没有添加tag部分的参数,例如:docker tag myrepo:1.0 myrepo,Docker会自动的给它latest标签。前面这些内容或许你已经熟知,其实它也就这点内容,并没有什么神奇的地方。

不能因为镜像的标签是latest就认为这是资源库中最新的镜像。只有这个资源库的拥有者约定这样,拥有latest标签的镜像才一定是最新的镜像。例如,我可以轻易地把一个过时的镜像变成带有latest标签的镜像,例如:

$ docker images myrepo
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
myrepo              1.0                 2e9f372f03a0        44 seconds ago      2.433 MB
myrepo              latest              2e9f372f03a0        44 seconds ago      2.433 MB
myrepo              0.9                 4986bf8c1536        2 weeks ago         2.433 MB
$ docker tag -f myrepo:0.9 myrepo:latest
$ docker images myrepo
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
myrepo              1.0                 2e9f372f03a0        About a minute ago   2.433 MB
myrepo              0.9                 4986bf8c1536        2 weeks ago          2.433 MB
myrepo              latest              4986bf8c1536        2 weeks ago          2.433 MB

这里带latest标签的镜像与0.9版本的镜像是一样的,都是两周前的版本,然而1.0的镜像是一分钟以前的。

为什么这个标签让很多人迷惑,其实比较容易理解。‘just pull the latest image’ 这句话的意思是获取带有latest标签的镜像还是获取最新的镜像?这两者是否是一样呢?它们是不是资源库中最新的镜像呢?是不是最新的稳定版镜像或者是最新的开发版镜像呢?

更糟糕的是,很多人似乎认为latest标签会自动更新,也就是说如果我获取一个带有latest标签的镜像,Docker会在每次运行之前去检查它是不是最新的版本。这是绝对不会出现的情况,就像其它的标签一样,你需要去手工决定Docker获取最新版本的镜像。

困惑并不仅仅是这些。如果我从资源库docker pull一个镜像却没指定标签,会发生什么呢?如果你认为会获取下所有的镜像,那么就错了,它只会获取下来带有latest标签的那个。如果你需要获取全部镜像,需要加上-a标志。 如果你在资源库执行了pull操作,却没带latest标签,会发生什么呢?如下所示:

$ docker pull amouat/myrepo
Pulling repository amouat/myrepo
2015/01/21 12:04:06 Tag latest not found in repository amouat/myrepo

意料之中的是Docker给出了错误信息。但是我认为你不知道这其中发生了什么。

一个更令人讨厌的是latest标签隐藏了其它的标签,假设你要下载带latest标签的debian镜像。哪个是它的版本呢?

$ docker images debian
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
debian              latest              4d6ce913b130        4 days ago          84.98 MB

额,不知道。事实上是7.8 wheezy版本。

$ docker pull debian:7.8
debian:7.8: The image you are pulling has been verified
511136ea3c5a: Already exists
d0a18d3b84de: Already exists
4d6ce913b130: Already exists
Status: Image is up to date for debian:7.8
$ docker pull debian:wheezy
debian:wheezy: The image you are pulling has been verified
511136ea3c5a: Already exists
d0a18d3b84de: Already exists
4d6ce913b130: Already exists
Status: Image is up to date for debian:wheezy
$ docker images debian
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
debian              7.8                 4d6ce913b130        4 days ago          84.98 MB
debian              latest              4d6ce913b130        4 days ago          84.98 MB
debian              wheezy              4d6ce913b130        4 days ago          84.98 MB

我认为Docker在下载镜像时应该把所有的标签都带上,但是我不知道为什么它没有这么做。现在的情况是用户可以拥有同一个镜像的不同版本因为服务器上用标签来标示。例如:如果wheezy和latest都在Hub上更新了,而我只获取了更新后的wheezy版本debian,那么尽管在Hub上他们可以被区分开,但是我的wheezy标签将会比本地的latest标签的版本新。

上述只是覆盖了latest的大部分语义以及它造成的常见误解。这种情况怎么能够改善呢?个人认为,可以取消latest标签并用一个更接近其字面意思的词来代替,例如default。我也希望可以看到一些改进标签原作方式的工作,例如同时更新一个镜像的全部标签。与此同时,我也强烈建议资源库管理员去警惕这个latest标签并彻底废弃它。

原文发布时间:2015-01-29

本文来自云栖合作伙伴“linux中国”

时间: 2024-10-29 07:24:57

Docker 中 latest 标签引发的困惑的相关文章

Docker中latest标签引发的困惑

本文讲的是Docker中latest标签引发的困惑,[编者的话]本文介绍了Docker中的一个小知识:latest标签,由于它的字面意思是"最新的",所以很多时候也容易被误解,其实latest就是个普通标签,不要期望它是最新或最稳定的版本.它只是个名字,没有其它附加作用,更不会自动更新.:) 在Docker中,最容易产生误解的部分应该是latest这个标签.困惑主要是由于这个名字造成的,因为字面意思并不能表达它的真正含义.在本文中,我们来学习下latest标签的真正作用和如何正确使用它

在Docker中自动化部署Ruby on Rails的教程

  这篇文章主要介绍了在Docker中部署Ruby on Rails的教程,Docker是当下最火的虚拟机,而本文所介绍的Ruby on Rails的部署则充分利用了Ruby中的rake这一炫酷的实现自动化的方法,需要的朋友可以参考下 基本的Rails应用程序 现在让我们启动一个基本的Rails应用.为了更好的展示,我使用Ruby 2.2.0和Rails 4.1.1 在终端运行: ? 1 2 $ rvm use 2.2.0 $ rails new && cd docker-test 创建一

在Docker中创建应用

本文讲的是在Docker中创建应用,[编者的话]下面内容是在基于Docker,用node.js开发和部署网络应用过程中获得的经验和教训. 本例中,将从头开始开发一个基于Docker的socket.io聊天例子,一直到可以实用,因此希望可以从这些教训中学到什么,例如: 使用Docker开始一个节点应用 不要做"root"敢死队成员 用binds使得test-edit-reload流程更短 在容器内管理node_modules使得重建更快(有一个窍门) 使用npm shrinkwrap确保

在Docker中运行SQLServer ASP.NET应用

的文章在阿里云上运行ASP.NET Docker应用一文和大家探讨了如何在Docker中运行ASP.NET应用.本文是上一篇文章的续篇,讨论如何让应用访问SQLServer数据库. 创建SQLServer数据库 我们首先在阿里云上开通一个SQLServer服务器实例,创建用户user1. 创建一个名为Blog的数据库,并授权user1能够访问数据库.为数据库开通外网访问,获得数据库外网访问地址. 所有这些操作都能够在控制台完成,如果你想进入SQLServer的控制台,可以点击上图的登录数据库进入

如何在 Docker 中设置 Go 并部署应用

嗨,在本教程中,我们将学习如何使用 docker 部署 golang web 应用程序. 你可能已经知道,由于 golang 的高性能和可靠性,docker 是完全是用 golang 写的.在我们详细介绍之前,请确保你已经安装了 docker 以及 golang 并对它们有基本了解. 关于 docker Docker 是一个开源程序,它可以将应用及其完整的依赖包捆绑到一起,并打包为容器,与宿主机共享相同的 Linux 内核.另一方面,像 VMware 这样的基于 hypervisor 的虚拟化操

7条命令在docker中部署Mesos集群

7条命令在docker中部署Mesos集群   所有使用的Docker容器构建文件是有也.您可以在本地构建每个容器或只使用位于Docker Hub预构建的容器.下面的命令会自动下载所需的预建的容器为您服务.ZooKeeper - https://registry.hub.docker.com/u/garland/zookeeper/Meso Master - https://registry.hub.docker.com/u/garland/mesosphere-docker-mesos-mas

网页设计中META标签写法的常见错误及后果

错误|设计|网页|网页设计 网页设计中META标签写法的常见错误及后果[摘要]:网页设计中META标签描述和关键词写法的常见错误包括:整个网站所有的网页使用同样的META标签内容,META标签中网页介绍信息与网站内容缺少相关性等.本文归纳了网页设计中META标签写法的常见错误,并分析了出现不合理的META标签设计的可能后果. 网页设计中META标签写法的常见错误及后果 搜索引擎优化通常会涉及到网页META标签的话题,META标签内容写作的是网络营销导向网站建设中网页设计的基本工作内容之一,在网络

在Word 2010文档中设置标签选项

在Word 2010文档中,每个标签包含了多个不同收件人的信函邮件地址.用户可以设置标签选项,以选择标签类型.具体操作 步骤如下所述: 第1步,打开Word 2010文档窗口,切换到"邮件"功能区.在"开始邮件合并"分组中单击"开 始邮件合并"按钮,并在打开的菜单中选择"标签"命令,如图2011073001所示. 图2011073001 选 择"标签"命令 第2步,在打开的"标签选项"对

OpenXML 替换word模板中的标签

最近的项目(MOSS项目)需要,用户需要根据word模板生成相关的word文档,具体需求是根据infopath 表单中的内容和相关的模板生成一份word文档 着手做之前想想要是用word api操作的话,后台进程,多用户并发操作等等问题 看来还是用openxml来操作比较好,于是找了找资料,实现了这小小的功能 现在把代码贴出来跟大家分享下 使用openxml技术时,首先需要引用windowsbase.dll 部分常量 const string documentRelationshipType =