前言Docker是Docker.Inc公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发,并遵从Apache 2.0协议。通过分层镜像标准化和内核虚拟化技术,Docker使得应用开发者和运维工程师可以以统一的方式跨平台发布应用,并且以几乎没有额外开销的情 况下提供资源隔离的应用运行环境。由于众多新颖的特性以及项目本身的开放性,Docker在不到两年的时间里迅速获得诸多IT厂商的参与,其中更是包括 Google、Microsoft、VMware等业界行业领导者。同时,Docker在开发者社区也是一石激起千层浪,许多如我之码农纷纷开始关注、学 习和使用Docker,许多企业,尤其是互联网企业,也在不断加大对Docker的投入,大有掀起一场容器革命之势。 Docker镜像命名解析 镜像是Docker最核心的技术之一,也是应用发布的标准格式。无论你是用 下面是在本地机器运行 我们可以发现我们常说的“ubuntu”镜像其实不是一个镜像名称,而是代表了一个名为ubuntu的Repository,同时在这个 Repository下面有一系列打了tag的Image,Image的标记是一个GUID,为了方便也可以通过Repository:tag来引用。 那么Registry又是什么呢?Registry存储镜像数据,并且提供拉取和上传镜像的功能。Registry中镜像是通过Repository来组织的,而每个Repository又包含了若干个Image。
那么在哪里指定Registry呢?让我们再拉取一个更完整命名的镜像吧: 上面我试图去拉取一个ubuntu镜像,并且指定了Registry为我本机搭建的私有Registry。下面是Docker CLI中pull命令的代码片段 ( 在运行时,上面的taglessRemote变量会被传入localhost:5000/ubuntu。上面代码试图从taglessRemote变量中解析出Registry的地址,在我们的例子中,它是localhost:5000。 那我们回过头再来看看下面这个耳熟能详的pull命令背后的故事吧: 我们跟着上面的示例代码,进一步进入解析函数 我们发现,Docker CLI会判断传入的 我们回过头再去看Docker命令行中解析Tag的逻辑吧( 代码会试着在用户输入的Image名称中找’ : ‘后面的tag,如果不存在,会使用默认的‘ 也就是说在我们的例子里面,命令会被解析为下面这样(注意,下面的命令不能直接运行,因为Docker CLI不允许明确指定官方Registry地址) |