返回 登录
20

你知道如何将镜像推送到Docker Hub吗?

阅读10401

什么是Docker镜像

让我们通过进一步学习Docker镜像来继续我们的Docker之旅。Docker镜像是由文件系统叠加而成。最底端是一个引导文件系统,即bootfs,这很像典型的Linux/Unix的引导文件系统。Docker用户几乎永远不会和引导文件系统有什么交互。实际上,当一个容器启动后,它将会被移到内存中,而引导文件系统则会被卸载(unmount),以留出更多的内存供initrd磁盘镜像使用。

到目前为止,Docker看起来还很像一个典型的Linux虚拟化栈。实际上,Docker镜像的第二层是root文件系统rootfs,它位于引导文件系统之上。rootfs可以是一种或多种操作系统(如Debian或者Ubuntu文件系统)。

在传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并完成了完整性检查之后,它才会被切换为读写模式。但是在Docker里,root文件系统永远只能是只读状态,并且Docker利用联合加载(union mount)技术又会在root文件系统层上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,但是在外面看起来只能看到一个文件系统。联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录。

Docker将这样的文件系统称为镜像。一个镜像可以放到另一个镜像的顶部。位于下面的镜像称为父镜像(parent image),可以依次类推,直到镜像栈的最底部,最底部的镜像称为基础镜像(base image)。最后,当从一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统。我们想在Docker中运行的程序就是在这个读写层中执行的。

这听上去有点儿令人迷惑,我们最好还是用一张图来表示一下,如图4-1所示。

image001{280}

图4-1 Docker文件系统层

当Docker第一次启动一个容器时,初始的读写层是空的。当文件系统发生变化时,这些变化都会应用到这一层上。比如,如果想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏。

通常这种机制被称为写时复制(copy on write),这也是使Docker如此强大的技术之一。每个只读镜像层都是只读的,并且以后永远不会变化。当创建一个新容器时,Docker会构建出一个镜像栈,并在栈的最顶端添加一个读写层。这个读写层再加上其下面的镜像层以及一些配置数据,就构成了一个容器。在上一章我们已经知道,容器是可以修改的,它们都有自己的状态,并且是可以启动和停止的。容器的这种特点加上镜像分层框架(image-layering framework),使我们可以快速构建镜像并运行包含我们自己的应用程序和服务的容器。

创建Docker Hub账号

构建镜像中很重要的一环就是如何共享和发布镜像。可以将镜像推送到Docker Hub或者用户自己的私有Registry中。为了完成这项工作,需要在Docker Hub上创建一个账号,可以从https://hub.docker.com/account/signup/加入Docker Hub,如图4-3所示。

图4-3 创建Docker Hub账号

首先需要注册一个账号,并在注册之后通过收到的确认邮件进行激活。

下面就可以测试刚才注册的账号是否能正常工作了。要登录到Docker Hub,可以使用docker login命令,如代码清单4-13所示。

代码清单4-13 登录到Docker Hub

$ sudo docker login  
Username: jamtur01  
Password:  
Email: james@lovedthanlost.net  
Login Succeeded

这条命令将会完成登录到Docker Hub的工作,并将认证信息保存起来以供后面使用。

注意
你的个人认证信息将会保存到$HOME/.dockercfg文件中。

将镜像推送到Docker Hub

镜像构建完毕之后,我们也可以将它上传到Docker Hub上面去,这样其他人就能使用这个镜像了。比如,我们可以在组织内共享这个镜像,或者完全公开这个镜像。

注意
Docker Hub也提供了对私有仓库的支持,这是一个需要付费的功能,你可以将镜像存储到私有仓库中,这样只有你或者任何与你共享这个私有仓库的人才能访问该镜像。这样你就可以将机密信息或者代码放到私有镜像中,不必担心被公开访问了。

我们可以通过docker push命令将镜像推送到Docker Hub。

现在就让我们来试一试如何推送,如代码清单4-77所示。

代码清单4-77 尝试推送root镜像

$ sudo docker push static_web  
2013/07/01 18:34:47 Impossible to push a "root" repository. 
Please rename your repository in <user>/<repo> (ex: jamtur01/
static_web)

出什么问题了?我们尝试将镜像推送到远程仓库static_web,但是Docker认为这是一个root仓库。root仓库是由Docker公司的团队管理的,因此会拒绝我们的推送请求。让我们再换一种方式试一下,如代码清单4-78所示。

代码清单4-78 推送Docker镜像

$ sudo docker push jamtur01/static_web  
The push refers to a repository [jamtur01/static_web] (len: 1)  
Processing checksums  
Sending image list  
Pushing repository jamtur01/static_web to registry-1.docker.io (1 tags)  
...

这次我们使用了一个名为jamtur01/static_web的用户仓库,成功地将镜像推送到了Docker Hub。我们将会使用自己的用户ID,这个ID也是我们前面创建的,并选择了一个合法的镜像名(如youruser/yourimage)。

我们可以在Docker Hub看到我们上传的镜像,如图4-4所示。

提示
可以在http://docs.docker.com/docker-hub/查看到关于Docker Hub的文档和更多关于功能方面的信息。

http://write.epubit.com.cn//api/storage/getbykey/original?key=14109eadf97e157e5df6{472}

图4-4 你在Docker Hub上的镜像

自动构建

除了从命令行构建和推送镜像,Docker Hub还允许我们定义自动构建(Automated Builds)。为了使用自动构建,我们只需要将GitHub 或 BitBucket 中含有Dockerfile文件的仓库连接到Docker Hub即可。向这个代码仓库推送代码时,将会触发一次镜像构建活动并创建一个新镜像。在之前该工作机制也被称为可信构建(Trusted Build)。

注意
自动构建同样支持私有GitHub和BitBucket仓库。

在Docker Hub中添加自动构建任务的第一步是将GitHub或者BitBucket账号连接到Docker Hub。具体操作是,打开Docker Hub,登录后单击个人信息连接,之后单击Add Repository -&gt; Automated Build按钮,如图4-5所示。

你将会在此页面看到关于链接到GitHub或者BitBucket账号的选项,如图4-6所示。

单击GitHub logo下面的Select按钮开始账号连接。你将会转到GitHub页面并看到Docker Hub的账号连接授权请求,如图4-7所示。

http://www.proedu.com.cn:8001/api/storage/getbykey/original?key=1410b9e0c91ae276b886{180}http://www.proedu.com.cn:8001/api/storage/getbykey/original?key=1410e92f494ed805fa98{348}

{:-:}图4-5 添加仓库按钮 图4-6 账号连接选项

http://www.proedu.com.cn:8001/api/storage/getbykey/original?key=1410b2b4f2622b4951bc{421}

图4-7 链接到GitHub账号

有两个选项可以选择:Public and Private (recommended)Limited。选择Public and Private (recommended)并单击Allow Access完成授权操作。有可能会被要求输入GitHub的密码来确认访问请求。

之后,系统将提示你选择用来进行自动构建的组织和仓库,如图4-8所示。

http://www.proedu.com.cn:8001/api/storage/getbykey/original?key=141079c271c7b01022a2

图4-8 选择仓库

单击想用来进行自动构建的仓库后面的Select按钮,之后开始对自动构建进行配置,如图4-9所示。

http://www.proedu.com.cn:8001/api/storage/getbykey/original?key=14104ee80d8b39c46a32{382}

图4-9 对自动构建进行配置

指定想使用的默认的分支名,并确认仓库名。

为每次自动构建过程创建的镜像指定一个标签,并指定Dockerfile的位置。默认的位置为代码仓库的根目录下,但是也可以随意设置该路径。

最后,单击Create Repository按钮来将你的自动构建添加到Docker Hub中,如图4-10所示。

http://www.proedu.com.cn:8001/api/storage/getbykey/original?key=141056d349a6c0f1d6e0{468}

图4-10 创建你的自动构建

你会看到你的自动构建已经被提交了。单击Build Status链接可以查看最近一次构建的状态,包括标准输出的日志,里面记录了构建过程以及任何的错误。如果该构建状态为Done,则表示该自动构建为最新状态。Error状态则表示构建过程出现错误。你可以单击查看详细的日志输出。

注意
不能通过docker push命令推送一个自动构建,只能通过更新你的GitHub或者BitBucket仓库来更新你的自动构建。

本文摘自《第一本Docker书》

图片描述

全球第一本Docker技术图书中文版,Docker中文社区鼎力支持!

  • Docker核心团队成员著作,在技术圈中很有影响力。
  • 既是第一本Docker书,也非常适合作为学习Docker的第一本入门书。
  • Docker是一个开源的应用容器引擎,让开发者可以将他们的应用和依赖包打包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙箱机制,相互之间不会有任何接口。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,它不依赖于任何语言、框架或包装系统。

    评论