设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

国内首个Docker Hub镜像服务DaoCloud上线

2014-12-15 11:27| 发布者: joejoe0332| 查看: 9831| 评论: 0|原作者: 孙宏亮|来自: oschina

摘要: 镜像是Docker最核心的技术之一,也是应用发布的标准格式。无论你是用docker pull image,或者是在Dockerfile里面写FROM image,从Docker官方Registry下载镜像应该是Docker操作里面最频繁的动作之一了。那么在我们执 ...

前言

  Docker是Docker.Inc公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发,并遵从Apache 2.0协议。通过分层镜像标准化和内核虚拟化技术,Docker使得应用开发者和运维工程师可以以统一的方式跨平台发布应用,并且以几乎没有额外开销的情 况下提供资源隔离的应用运行环境。由于众多新颖的特性以及项目本身的开放性,Docker在不到两年的时间里迅速获得诸多IT厂商的参与,其中更是包括 Google、Microsoft、VMware等业界行业领导者。同时,Docker在开发者社区也是一石激起千层浪,许多如我之码农纷纷开始关注、学 习和使用Docker,许多企业,尤其是互联网企业,也在不断加大对Docker的投入,大有掀起一场容器革命之势。


Docker镜像命名解析

  镜像是Docker最核心的技术之一,也是应用发布的标准格式。无论你是用docker pull image,或者是在Dockerfile里面写FROM image,从Docker官方Registry下载镜像应该是Docker操作里面最频繁的动作之一了。那么在我们执行docker pull image时背后到底发生了什么呢?在回答这个问题前,我们需要先了解下docker镜像是如何命名的,这也是Docker里面比较容易令人混淆的一块概念:Registry,Repository, Tag and Image。


  下面是在本地机器运行docker images的输出结果:

1


  我们可以发现我们常说的“ubuntu”镜像其实不是一个镜像名称,而是代表了一个名为ubuntu的Repository,同时在这个 Repository下面有一系列打了tag的Image,Image的标记是一个GUID,为了方便也可以通过Repository:tag来引用。


  那么Registry又是什么呢?Registry存储镜像数据,并且提供拉取和上传镜像的功能。Registry中镜像是通过Repository来组织的,而每个Repository又包含了若干个Image。

  • Registry包含一个或多个Repository

  • Repository包含一个或多个Image

  • Image用GUID表示,有一个或多个Tag与之关联


  那么在哪里指定Registry呢?让我们再拉取一个更完整命名的镜像吧:


2


  上面我试图去拉取一个ubuntu镜像,并且指定了Registry为我本机搭建的私有Registry。下面是Docker CLI中pull命令的代码片段 (docker/api/client/command.go中的CmdPull函数)

截图 (4)


  在运行时,上面的taglessRemote变量会被传入localhost:5000/ubuntu。上面代码试图从taglessRemote变量中解析出Registry的地址,在我们的例子中,它是localhost:5000。


  那我们回过头再来看看下面这个耳熟能详的pull命令背后的故事吧:


3


  我们跟着上面的示例代码,进一步进入解析函数ResolveRepositoryName的定义代码片段(docker/registry/registry.go)


截图 (3)


  我们发现,Docker CLI会判断传入的taglessRemote参数的第一部分中是否包含’.’或者':’,如果存在则认为第一部分是Registry地址,否则会使用Docker官方默认的Registryindex.docker.io其实这里是一个Index Server,和Registry的区别留在后面再去深究吧),即上面代码中高亮的部分。背后的故事还没有结束,如果你向DockerHub上传过镜像,应该记得你上传的镜像名称格式为user-name/repository:tag,这样用户Bob和用户Alice可以有相同名称的Repository,通过用户名前缀作为命名空间隔离,比如Bob/ubuntu和Alice/ubuntu。官方镜像是通过用户名library来区分的,具体代码片段如下(docker/api/client/command.go中的CmdPull函数)


截图 (5)


  我们回过头再去看Docker命令行中解析Tag的逻辑吧(docker/api/client/command.go中的CmdPull函数):

截图 (6)


  代码会试着在用户输入的Image名称中找’ : ‘后面的tag,如果不存在,会使用默认的‘DEFAULTTAG,即‘latest’。


  也就是说在我们的例子里面,命令会被解析为下面这样(注意,下面的命令不能直接运行,因为Docker CLI不允许明确指定官方Registry地址)

4 (1)



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部