设为首页 收藏本站
查看: 1043|回复: 0

[经验分享] 使用Docker镜像

[复制链接]

尚未签到

发表于 2017-12-6 12:13:11 | 显示全部楼层 |阅读模式
镜像(image)是Docker三大核心概念中最为重要的,自Docker诞生之日起“镜像”就是相关社区最为热门的关键词。
Docker运行容器前需要本地存在对应的镜像,如果镜像没保存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

获取镜像

使用docker pull命令直接从Docker Hub镜像源来下载镜像。
该命令的格式为docker pull NAME[:TAG]。其中,NAME是镜像仓库的名称(用来区分镜像),TAG是镜像的标签(往往用来表示版本信息)。通常情况下,描述一个镜像需要包括“名称+标签”信息。
例如,获取一个Ubuntu 14.04系统的基础镜像可以使用如下的命令:docker pull ubuntu:14.04
对于Docker镜像来说,如果不显式指定TAG,则默认会选择latest标签,这会下载仓库中最新版本的镜像。
$ docker pull ubuntu



Using default tag: latest
5ba4f30e5bea: Pull complete
9d7d19c9dc56: Pull complete
ac6ad7efd0f9: Pull complete
e7491a747824: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:46fb5d001b88ad904c5c732b086b596b92cfb4a4840a3abd0e35dbb6870585e4
Status: Downloaded newer image for ubuntu:latest
该命令实际上下载的就是docker pull ubuntu:latest镜像。一般来说,镜像的latest标签意味着该镜像的内容会跟踪最新的非稳定版本而发布,内容是不稳定的。从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使用默认的latest标记的镜像。
下载过程中可以看出,镜像文件一般由若干层(layer)组成,5ba4f30e5bea这样的串是层的唯一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命令:docker run -it ubuntu:14.04 bash



root@9c74026df12a:/# ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.058 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.023 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.018 ms
^C
--- localhost ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.018/0.033/0.058/0.017 ms
root@9c74026df12a:/# exit
exit
查看镜像信息

1.使用images命令列出镜像
使用docker images命令可以列出本地主机上已有镜像的基本信息。
$ docker images
REPOSITORY               TAG            IMAGE ID        CREATED         SIZE
ubuntu                   16.04          2fa927b5cdd3    2 weeks ago     122 MB
ubuntu                   latest         2fa927b5cdd3    2 weeks ago     122 MB
ubuntu                   14.04          8f1bd21bd25c    2 weeks ago     188 MB
在列出的信息中,可以看到以下几个字段信息。
·来自于哪个仓库,比如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标签的镜像:
$ docker images
REPOSITORY       TAG       IMAGE ID          CREATED         SIZE
ubuntu           16.04     2fa927b5cdd3      2 weeks ago     122 MB
ubuntu           latest    2fa927b5cdd3      2 weeks ago     122 MB
myubuntu         latest    2fa927b5cdd3      2 weeks ago     122 MB
ubuntu           14.04     8f1bd21bd25c      2 weeks ago     188 MB
用户就可以直接使用myubuntu:latest来表示这个镜像了。这些myubuntu:latest镜像的ID跟ubuntu:latest完全一致。它们实际上指向同一个镜像文件,只是别名不同而已。docker tag命令添加的标签实际上起到了类似链接的作用。
3.使用inspect命令查看详细信息
使用docker inspect命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等:
$ docker inspect ubuntu:14.04



[
{
"Id": "sha256:8f1bd21bd25c3fb1d4b00b7936a73a0664f932e11406c48a0ef19d82fd0b7342",
"RepoTags": [
"ubuntu:14.04"
],
"RepoDigests": [],
"Parent": "",
"Comment": "",
"Created": "2016-05-27T14:13:04.103044105Z",
"Container": "eb8c67a3bff6e93658d18ac14b3a2134488c140a1ae1205c0cfdfd49f087113f",
"ContainerConfig": {
"Hostname": "fff5562e8198",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) CMD [\"/bin/bash\"]"
],
"Image": "f9cdf71c33f14c7af4b75b651624e9ac69711630e21ceb289f69e0300e90c57d",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "1.9.1",
"Author": "",
"Config": {
"Hostname": "fff5562e8198",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [],
"Cmd": [
"/bin/bash"
],
"Image": "f9cdf71c33f14c7af4b75b651624e9ac69711630e21ceb289f69e0300e90c57d",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 187957543,
"VirtualSize": 187957543,
"GraphDriver": {
"Name": "aufs",
"Data": null
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:a7e1c363defb1f80633f3688e945754fc4c8f1543f07114befb5e0175d569f4c",
"sha256:dc109d4b4ccf69361d29292fb15e52707507b520aba8cd43a564182f26725d74",
"sha256:9f7ab087e6e6574225f863b6013579a76bd0c80c92fefe7aea92c4207b6486cb",
"sha256:6f8be37bd578bbabe570b0181602971b0ea3509b79a1a3dd5528a4e3fc33dd6f",
"sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"
]
}
}
]
返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用参数-f来指定.
例如,获取镜像的Architecture:$ docker inspect -f {{".Architecture"}}  

4.使用history命令查看镜像历史
既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?这时候可以使用history子命令,该命令将列出各层的创建信息。
例如,查看ubuntu:14.04镜像的创建过程,可以使用如下命令:$ docker history ubuntu:14.04
DSC0000.png
过长的命令被自动截断了,可以使用前面提到的--no-trunc选项来输出完整命令。

搜寻镜像

使用docker search命令可以搜索远端仓库中共享的镜像,默认搜索官方仓库中的镜像。用法为docker search term,支持的参数主要包括:
·--automated=true|false:仅显示自动创建的镜像,默认为否;
·--no-trunc=true|false:输出信息不截断显示,默认为否;
·-s,--stars=X:指定仅显示评价为指定星级以上的镜像,默认为0,即输出所有镜像。
例如,搜索所有自动创建的评价为1+的带nginx关键字的镜像,如下所示:$ docker search --automated -s 3 nginx
返回包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。默认的输出结果将按照星级评价进行排序。

删除镜像

1.使用标签删除镜像
使用docker rmi命令可以删除镜像,命令格式为docker rmi IMAGE[IMAGE...],其中IMAGE可以为标签或ID。
例如,要删除掉myubuntu:latest镜像,可以使用如下命令:$ docker rmi myubuntu:latest
读者可能会担心,本地的ubuntu:latest镜像是否会受此命令的影响。无需担心,当同一个镜像拥有多个标签的时候,docker rmi命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上述操作相当于只是删除了镜像2fa927b5cdd3的一个标签而已。但当镜像只剩下一个标签的时候就要小心了,此时再使用docker rmi命令会彻底删除镜像。由于该镜像没有额外的标签指向它,执行docker rmi命令,它会删除这个镜像文件的所有层。
2.使用镜像ID删除镜像
当使用docker rmi命令,并且后面跟上镜像的ID(也可以是能进行区分的部分ID串前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。
例如,先利用ubuntu:14.04镜像创建一个简单的容器来输出一段话:$ docker run ubuntu:14.04 echo 'hello! I am here!'
使用docker ps-a命令可以看到本机上存在的所有容器:可以看到,后台存在一个退出状态的容器,是刚基于ubuntu:14.04镜像创建的。
$ docker ps -a
CONTAINER ID   IMAGE                COMMAND                   CREATED                 STATUS      PORTS   NAMES
a21c0840213e   ubuntu:14.04      "echo 'hello! I am he"   About a minute ago   Exited (0)                romantic_euler
试图删除该镜像,Docker会提示有容器正在运行,无法删除:$ docker rmi ubuntu:14.04
Error response from daemon: conflict: unable to remove repository reference "ubuntu:
14.04" (must force) - container a21c0840213e is using its referenced image 8f1bd21bd25c
如果要想强行删除镜像,可以使用-f参数。$ docker rmi -f ubuntu:14.04
注意,通常并不推荐使用-f参数来强制删除一个存在容器依赖的镜像。正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。
首先删除容器a21c0840213e:$ docker rm a21c0840213e,再使用ID来删除镜像,此时会正常打印出删除的各层信息:

创建镜像

创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于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文件,之后退出:
$ docker run -it ubuntu:14.04 /bin/bash
root@a925cb40b3f0:/# touch test
root@a925cb40b3f0:/# exit
记住容器的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。
此时查看本地镜像列表,会发现新创建的镜像已经存在了:
$ docker images
REPOSITORY        TAG     IMAGE ID        CREATED           VIRTUAL SIZE
test                     0.1     9e9c814023bc    4 seconds ago     188 MB
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
然后查看新导入的镜像,会发现它已经在本地存在了:
$ docker images
REPOSITORY        TAG         IMAGE ID         CREATED             VIRTUAL SIZE
ubuntu            14.04       05ac7c0b9383     17 seconds ago      215.5 MB

存出和载入镜像

1.存出镜像
如果要导出镜像到本地文件,可以使用docker save命令。例如,导出本地的ubuntu:14.04镜像为文件ubuntu_14.04.tar,如下所示:
$ docker images
REPOSITORY          TAG         IMAGE ID        CREATED         VIRTUAL SIZE
ubuntu              14.04       8f1bd21bd25c    2 weeks ago     188 MB
$ docker save -o ubuntu_14.04.tar 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命令进行查看。

上传镜像

可以使用docker push命令上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登录)。命令格式为:
docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
用户在Docker Hub网站注册后可以上传自制的镜像。例如用户user上传本地的test:latest镜像,可以先添加新的标签user/test:latest,然后用docker push命令上传镜像:
$ docker tag test:latest user/test:latest
$ docker push user/test:latest
第一次上传时,会提示输入登录信息或进行注册。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421272-1-1.html 上篇帖子: Docker 1.13 管理命令 下篇帖子: Docker命令行安装Shipyard
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表