快乐学习
前程无忧、中华英才非你莫属!

Day2-Docker入门教程-使用镜像

第2章 核心概念
本章首先介绍Docker的三大核心概念。
·镜像(Image)
·容器(Container)
·仓库(Repository)
只有理解了这三个核心概念,才能顺利地理解Docker容器的整个生命周期。
随后,笔者将介绍如何在常见的操作系统平台上安装Docker,包括Ubuntu、CentOS、MacOS和Windows等主流操作系统平台。

2.1 核心概念
Docker的大部分操作都围绕着它的三大核心概念——镜像、容器和仓库而展开。因此,准确把握这三大核心概念对于掌握Docker技术尤为重要。
1.Docker镜像
Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。例如,一个镜像可以包含一个基本的操作系统环境,里面仅安装了Apache应用程序(或用户需要的其他软件)。
可以把它称为一个Apache镜像。
镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并直接使用。
2.Docker容器
Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。
可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。
注意
镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。
3.Docker仓库
Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。
有时候会看到有资料将Docker仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。例如存放Ubuntu操作系统镜像的仓库称为Ubuntu仓库,其中可能包括14.04、12.04等不同版本的镜像。仓库注册服务器的示例如图2-1所示。
根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库(Public)和私有仓库(Private)两种形式。目前,最大的公开仓库是官方提供的Docker Hub,其中存放了数量庞大的镜像供用户下载。国内不少云服务提供商(如时速云、阿里云等)也提供了仓库的本地源,可以提供稳定的国内访问。
当然,用户如果不希望公开分享自己的镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了。
提示
可以看出,Docker利用仓库管理镜像的设计理念与Git非常相似,实际上在理念设计上借鉴了Git的很多优秀思想。
如无特殊说明,默认数据网段地址范围为10.0.0.0/24,管理网段地址范围为192.168.0.0/24。
执行命令代码中以$开头的,表示为普通用户;以#开头的,表示为特权用户(root)。如果用户已经添加到了docker用户组(参考上一小节),大部分时候都无需管理员权限,否则需要在命令前使用sudo来临时提升权限。
部分命令执行结果输出内容较长的,只给出了输出的关键部分。读者可根据自己的实际情况,搭建类似的环境。

第3章 使用Docker镜像
镜像(image)是Docker三大核心概念中最为重要的,自Docker诞生之日起“镜像”就是相关社区最为热门的关键词。
Docker运行容器前需要本地存在对应的镜像,如果镜像没保存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),
用户也可以通过配置,使用自定义的镜像仓库。
本章将介绍围绕镜像这一核心概念的具体操作,包括如何使用pull命令从Docker Hub仓库中下载镜像到本地,如何查看本地已有的镜像信息和管理镜像标签,如何在远端仓库使用search命令进行搜索和过滤,如何删除镜像标签和镜像文件,如何创建用户定制的镜像并且保存为外部文件。最后,还介绍如何往Docker Hub仓库中推送自己的镜像。
提示
一份非官方研究报告表明,image一直是Docker官方社区(2014~2016年)和StackOverFlow Docker板块(2013~2016年)的年度热词。
3.1 获取镜像
镜像是运行容器的前提,官方的Docker Hub网站已经提供了数十万个镜像供大家开放下载。
可以使用docker pull命令直接从Docker Hub镜像源来下载镜像。该命令的格式为docker pull NAME[:TAG]。其中,NAME是镜像仓库的名称(用来区分镜像),TAG是镜像的标签(往往用来表示版本信息)。通常情况下,描述一个镜像需要包括“名称+标签”信息。
例如,获取一个Ubuntu 14.04系统的基础镜像可以使用如下的命令:
14.04: Pulling from library/ubuntu
           6c953ac5d795: Pull complete
           3eed5ff20a90: Pull complete
           f8419ea7c1b5: Pull complete
           51900bc9e720: Pull complete
          
对于Docker镜像来说,如果不显式指定TAG,则默认会选择latest标签,这会下载仓库中最新版本的镜像。
下面的例子将从Docker Hub的Ubuntu仓库下载一个最新的Ubuntu操作系统的镜像。
该命令实际上下载的就是ubuntu:latest镜像。
注意
一般来说,镜像的latest标签意味着该镜像的内容会跟踪最新的非稳定版本而发布,内容是不稳定的。当前Ubuntu最新的发行版本为16.04,latest镜像实际上就是16.04镜像,用户可以下载ubuntu:16.04镜像并查看,两者的数字摘要值是一致的。
从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使用默认的latest标记的镜像。
下载过程中可以看出,镜像文件一般由若干层(layer)组成,6c953ac5d795这样的串是层的唯一id(实际上完整的id包括256比特,由64个十六进制字符组成)。使用docker pull命令下载时会获取并输出镜像的各层信息。当不同的镜像包括相同的层时,本地仅存储层的一份内容,减小了需要的存储空间。
读者可能会想到,在使用不同的镜像仓库服务器的情况下,可能会出现镜像重名的情况。
严格地讲,镜像的仓库名称中还应该添加仓库地址(即registry,注册服务器)作为前缀,只是我们默认使用的是Docker Hub服务,该前缀可以忽略。
例如,docker pull ubuntu:14.04命令相当于docker pull registry.hub.docker.com/ubuntu:14.04命令,即从默认的注册服务器Docker Hub Registry中的ubuntu仓库来下载标记为14.04的镜像。
如果从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址。
例如从网易蜂巢的镜像源来下载ubuntu:14.04镜像,
可以使用如下命令,此时下载的镜像名称为hub.c.163.com/public/ubuntu:14.04:
$ docker pull hub.c.163.com/public/ubuntu:14.04
pull子命令支持的选项主要包括:
-a,--all-tags=true|false:是否获取仓库中的所有镜像,默认为否。
下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运行bash应用,执行ping localhost命令:

3.2 查看镜像信息
1.使用images命令列出镜像
使用docker images命令可以列出本地主机上已有镜像的基本信息。
例如,下面的命令列出了上一小节中下载的镜像信息:
 在列出的信息中,可以看到以下几个字段信息。
·来自于哪个仓库,比如ubuntu仓库用来保存ubuntu系列的基础镜像;
·镜像的标签信息,比如14.04、latest用来标注不同的版本信息。标签只是标记,并不能标识镜像内容;
·镜像的ID(唯一标识镜像),如ubuntu:latest和ubuntu:16.04镜像的ID都是2fa927b5cdd3,说明它们目前实际上指向同一个镜像;
·创建时间,说明镜像最后的更新时间;
·镜像大小,优秀的镜像往往体积都较小。
其中镜像的ID信息十分重要,它唯一标识了镜像。
在使用镜像ID的时候,一般可以使用该ID的前若干个字符组成的可区分串来替代完整的ID。
TAG信息用来标记来自同一个仓库的不同镜像
例如ubuntu仓库中有多个镜像,通过TAG信息来区分发行版本,包括10.04、12.04、12.10、13.04、14.04、16.04等标签。
镜像大小信息只是表示该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像的逻辑体积之和。
·images子命令主要支持如下选项,用户可以自行进行尝试。
·-a,--all=true|false列出所有的镜像文件(包括临时文件),默认为否;
·--digests=true|false:列出镜像的数字摘要值,默认为否;
·-f,--filter=[]:过滤列出的镜像,如dangling=true只显示没有被使用的镜像;也可指定带有特定标注的镜像等;
·--format="TEMPLATE"控制输出格式,如.ID代表ID信息,.Repository代表仓库信息等;
·--no-trunc=true|false对输出结果中太长的部分是否进行截断,如镜像的ID信息,默认为是;
·-q,--quiet=true|false仅输出ID信息,默认为否。
其中,对输出结果进行控制的选项如-f,--filter=[]、--no-trunc=true|false、-q,--quiet=true|false等,大部分子命令都支持。更多子命令选项还可以通过man docker-images来查看。
2.使用tag命令添加镜像标签
为了方便在后续工作中使用特定镜像,还可以使用docker tag命令来为本地镜像任意添加新的标签。
例如添加一个新的myubuntu:latest镜像标签:
$ docker tag ubuntu:latest myubuntu:latest
再次使用docker images列出本地主机上镜像信息,可以看到多了一个拥有myubuntu:latest标签的镜像:
之后,用户就可以直接使用myubuntu:latest来表示这个镜像了。
细心的读者可能注意到,这些myubuntu:latest镜像的ID跟ubuntu:latest完全一致。它们实际上指向同一个镜像文件,只是别名不同而已。docker tag命令添加的标签实际上起到了类似链接的作用。
3.使用inspect命令查看详细信息
使用docker inspect命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等:
返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用参数-f来指定,例如,获取镜像的Architecture:
4.使用history命令查看镜像历史
既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?
这时候可以使用history子命令,该命令将列出各层的创建信息。
例如,查看ubuntu:14.04镜像的创建过程,可以使用如下命令:
3.3 搜寻镜像
使用docker search命令可以搜索远端仓库中共享的镜像,默认搜索官方仓库中的镜像。用法为docker search TERM,支持的参数主要包括:
·--automated=true|false:仅显示自动创建的镜像,默认为否;
·--no-trunc=true|false:输出信息不截断显示,默认为否;
·-s,--stars=X:指定仅显示评价为指定星级以上的镜像,默认为0,即输出所有镜像。
例如,搜索所有自动创建的评价为1+的带nginx关键字的镜像,如下所示:
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。
默认的输出结果将按照星级评价进行排序。

3.4 删除镜像
1.使用标签删除镜像
使用docker rmi命令可以删除镜像,命令格式为docker rmi IMAGE[IMAGE...],其中IMAGE可以为标签或ID。
例如,要删除掉myubuntu:latest镜像,可以使用如下命令:
读者可能会担心,本地的ubuntu:latest镜像是否会受此命令的影响。
无需担心,当同一个镜像拥有多个标签的时候,docker rmi命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上述操作相当于只是删除了镜像2fa927b5cdd3的一个标签而已。
为保险起见,再次查看本地的镜像,发现ubuntu:latest镜像(准确地说是2fa927b5cdd3镜像)仍然存在:
但当镜像只剩下一个标签的时候就要小心了,此时再使用docker rmi命令会彻底删除镜像。
例如删除标签为ubuntu:14.04的镜像,由于该镜像没有额外的标签指向它,执行docker rmi命令,可以看出它会删除这个镜像文件的所有层:
2.使用镜像ID删除镜像
当使用docker rmi命令,并且后面跟上镜像的ID(也可以是能进行区分的部分ID串前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,例如,先利用ubuntu:14.04镜像创建一个简单的容器来输出一段话:
使用docker ps-a命令可以看到本机上存在的所有容器:
可以看到,后台存在一个退出状态的容器,是刚基于ubuntu:14.04镜像创建的。
试图删除该镜像,Docker会提示有容器正在运行,无法删除:

3.5 创建镜像
创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
本节将重点介绍前两种方法。最后一种基于Dockerfile创建的方法将在后续章节专门予以详细介绍。
1.基于已有镜像的容器创建
该方法主要是使用docker commit命令。
命令格式为docker commit[OPTIONS]CONTAINER[REPOSITORY[:TAG]],主要选项包括:
·-a,--author="":作者信息;
·-c,--change=[]:提交的时候执行Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;
·-m,--message="":提交消息;
·-p,--pause=true:提交时暂停容器运行。
下面将演示如何使用该命令创建一个新镜像。
首先,启动一个镜像,并在其中进行修改操作,例如创建一个test文件,之后退出:
记住容器的ID为a925cb40b3f0。
此时该容器跟原ubuntu:14.04镜像相比,已经发生了改变,可以使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或名称来指定容器:
$ docker commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0 test:0.1
9e9c814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f27
顺利的话,会返回新创建的镜像的ID信息,例如9e9c814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f27。
此时查看本地镜像列表,会发现新创建的镜像已经存在了:
2.基于本地模板导入
用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用docker import命令。
命令格式为docker import[OPTIONS]file|URL|-[REPOSITORY[:TAG]]。
要直接导入一个镜像,可以使用OpenVZ提供的模板来创建,或者用其他已导出的镜像模板来创建。
OPENVZ模板的下载地址为http://openvz.org/Download/templates/precreated
例如,下载了ubuntu-14.04的模板压缩包,之后使用以下命令导入:
$ cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
然后查看新导入的镜像,会发现它已经在本地存在了:
3.6 存出和载入镜像
用户可以使用docker save和docker load命令来存出和载入镜像。
1.存出镜像
如果要导出镜像到本地文件,可以使用docker save命令。
例如,导出本地的ubuntu:14.04镜像为文件ubuntu_14.04.tar,如下所示:
2.载入镜像
可以使用docker load将导出的tar文件再导入到本地镜像库,例如从文件ubuntu_14.04.tar导入镜像到本地镜像列表,如下所示:$ docker load --input ubuntu_14.04.tar或:$ docker load < ubuntu_14.04.tar
这将导入镜像及其相关的元数据信息(包括标签等)。
导入成功后,可以使用docker images命令进行查看。

3.7 上传镜像
可以使用docker push命令上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登录)。
命令格式为:
docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
用户在Docker Hub网站注册后可以上传自制的镜像。
例如用户user上传本地的test:latest镜像,可以先添加新的标签user/test:latest,然后用docker push命令上传镜像:
第一次上传时,会提示输入登录信息或进行注册。
3.8 本章小结
本章具体介绍了围绕Docker镜像的一系列重要命令操作,包括获取、查看、搜索、删除、创建、存出和载入、上传等。
镜像是使用Docker的前提,也是最基本的资源。所以,在平时的Docker使用中,要注意积累自己定制的镜像文件,并将自己创建的高质量镜像分享到社区中。
在后续章节,笔者将介绍更多对镜像进行操作的场景。
 
 
 
 
来源:Docker技术入门与实战 (第2版)   作者:杨保华 戴王剑 曹亚仑
 
 
 
 
 
打赏
赞(0) 打赏
未经允许不得转载:同乐学堂 » Day2-Docker入门教程-使用镜像

特别的技术,给特别的你!

联系QQ:1071235258QQ群:710045715

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

error: Sorry,暂时内容不可复制!