技巧16 给Docker打标签
现在,用户已经通过提交容器保存了容器的状态,并且还得到了一个代表镜像ID的随机字符串。很显然,记住和管理这些包含大量数字的镜像ID是非常困难的。如果能够利用Docker的打标签功能给这些镜像赋予一些可读的名称(和标签)那就太好了,它还能提醒用户为什么创建这些镜像。
掌握这一技巧可以对镜像的用途一目了然,使机器上的镜像管理变得简单很多。
问题
想要方便地引用并且保存一次Docker提交。
解决方案
使用 docker tag
给这次提交命名。
打标签功能的基本用法是非常简单的,如代码清单3-19所示。
代码清单3-19 一条简单的dockertag命令
$ docker tag \ ⇽--- docker tag命令
071f6a36c23a19801285b82eafc99333c76f63ea0aa0b44902c6bae482a6e036 \ ⇽--- 想要命名的镜像ID
imagename ⇽--- 想给镜像起的名字
上述操作就是给镜像命名,可以用这个名字来引用该镜像,例如:
docker run imagename
这可比记住大量包含字母和数字的随机字符串轻松多了!
如果想和别人分享镜像,除了设置标签还有其他事情要做。遗憾的是,与标签相关的术语可以说相当混乱。像镜像(image)、名称(name)和仓库(repository)这些术语在使用时很容易混淆。表3-1给出了这些术语的一些定义。
术 语 | 含 义 |
---|---|
镜像 | 一个只读层 |
名称 | 镜像的名字,如“todoapp” |
标签 | 作为动词,它指的是给一个镜像起名字;作为名词,它是镜像名的一个修饰词 |
仓库 | 一组托管的打好标签的镜像,它们一起为容器创建相应的文件系统 |
在表3-1里面最容易混淆的术语恐怕还是“镜像”和“仓库”。一直以来我们使用的术语镜像其实可以简单地理解成是一组我们从一个容器划分出来的多个层,但是从技术上来说,一个镜像即是一个递归地指向它的父镜像层的层。而仓库则是受托管的,这意味着它会被存放在某个地方(可以是在Docker守护进程,也可以是在一个注册中心)。此外,仓库是一组打好标签的镜像,它们共同组成了容器的文件系统。
这里用Git来进行类比可能有助于理解。当克隆一个Git仓库时,可以签出(check out)所要求的那个点的文件的状态。这一点可以与镜像类比。该仓库保存了每一次提交时文件的整个历史,可以据此追溯到最初的那次提交。因此,在最上面一层签出仓库时,其他层(或提交)就都在克隆的那个仓库里了。
在实践中,“镜像”和“仓库”这两个术语或多或少有些混用,因此不必太担心这一点。但要注意的是,这些术语都是存在的,并且用起来也的确很相似。
到目前为止所看到的内容都是如何给一个镜像ID命名。令人不解的是,这个名字并不是该镜像的标签,虽说人们经常这样提到它。我们可以根据打标签(动词)和给镜像起名字的那个标签(名词)的行为来区分二者。这个标签(名词)允许用户给镜像的一个特定版本命名。用户可以通过添加标签来管理同一镜像不同版本的引用。例如,可以把一个版本名称或提交日期当作标签。
带有多个标签的仓库的一个很好的例子便是Ubuntu镜像。如果拉取Ubuntu镜像,然后执行 docker images
,就会得到与代码清单3-20所示类似的输出结果。
代码清单3-20 带有多个标签的镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu trusty 8eaa4ff06b53 4 weeks ago 192.7 MB
ubuntu 14.04 8eaa4ff06b53 4 weeks ago 192.7 MB
ubuntu 14.04.1 8eaa4ff06b53 4 weeks ago 192.7 MB
ubuntu latest 8eaa4ff06b53 4 weeks ago 192.7 MB
代码清单3-20中的REPOSITORY一列列出了一组托管的叫作“ubuntu”的层。通常这指的便是镜像。这里的TAG一列列出了4个不同的名称(trusty、14.04、14.04.1和latest)。IMAGE ID一列列出了几个完全一致的镜像ID。这是因为这些打上不同标签的镜像都是同一个。
这表明用户可以拥有一个带有多个标签的相同镜像ID的仓库。尽管从理论上讲这些标签以后也可以指向不同的镜像ID。例如,如果“trusty”有一个安全更新,维护人员一次新的提交可能就会改变镜像ID,然后打上新的“trusty”“14.04.2”“latest”标签。
如果没有指定标签,默认会给镜像打上一个“latest”标签。
注意
“latest”标签在Docker里并没有什么特殊的含义——它只是在打标签和拉取镜像时的一个默认值。这并不意味着它是这个镜像设定的最后一个标签。镜像的“latest”标签也可能指向的是该镜像的一个老版本,因为这之后构建的版本可能会被打上一个特定的标签,如“v1.2.3”。
讨论
在本节里,我们介绍了Docker镜像的标签功能。就其技术本身而言其实是相对简单的。我们发现这里真正的挑战,也是我们在这里重点关注的,在于如何引导Docker用户之间相关术语的松散使用。值得再次强调的是,当人们讨论镜像时,他们可能会引用一个打过标签的镜像,甚至是一个镜像仓库。另一个特别常见的错误是将镜像称作容器:“只需要下载容器然后运行它。”工作中已经使用Docker有一段时间的同事仍然经常问我们,“一个容器和镜像之间的差别是什么?”
在技巧17里,用户将学习如何使用Docker镜像 Hub和其他人分享刚打好标签的镜像。