提示:本篇文章一共8368字,大概需要20分钟读完
系列文章目录
第一章 Docker与容器
第二章 Docker核心概念
第三章 CentOS环境下安装Docker
第四章 使用Docker镜像
文章目录
前言
镜像是Docker三大核心概念中最重要的,自Docker诞生之日起镜像就是相关社区热门的关键词。
Docker运行容器前需要本地存在对应的镜像,如果镜像不存在,Docker会尝试使用默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库,用户也可以通过配置,使用自定义的镜像仓库。)
本章将围绕镜像这一核心概念介绍具体操作,包括如何使用pull命令从Docker中下载镜像到本地;如何查看本地已有的镜像信息和管理镜像的标签;如何在远端仓库中使用search命令进行搜索和过滤;如何删除镜像标签和镜像文件;如何创建用户定制的镜像且保存为外部文件。最后,还将介绍如何往Docker Hub仓库中推送自己的镜像。
一、获取镜像
镜像是运行容器的前提,官方的Docker Hub网站已经提供了数十万个镜像供大家开放下载。本节主要介绍Docker镜像的pull子命令。
docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
【注意】
1、[Docker Registry地址]如果没有指定地址,那么默认通过Docker Hub进行下载。
2、 <仓库名>主要用户区分不同的镜像
3、 <标签>主要用来区分版本
通常情况下,描述一个镜像需要包括“名称+标签”信息。例如,获取一个 Ubuntu 18.04系统的基础镜像可以使用如下的命令:
docker pull ubuntu:18.04

对于Docker来说,如果没有显式地指定TAG标签,那么就会默认下载最新版本的镜像。
docker pull ubuntu

【注意】
一般来说,镜像的latest标签意味着该镜像的内容会跟踪最新版本的变而变化,内容是不稳定的。因此在生产过程中,一般不要忽略镜像的标签信息或者用默认的 latest 标记的镜像。
严格意义上讲,镜像的仓库还应该添加仓库地址(即 registry,注册服务器)作为前缀,只是默认使用的是官方Docker Hub服务,该前缀可以忽略。
例如,docker pull ubuntu:18.04命令相当于 docker pull registry.hub.docker.com/ubuntu:18.04命令,即从默认的注册服务器Docker Hub Registry中的ubuntu仓库来下载标记为18.04的镜像。
如果从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址。例如从网易蜂巢的镜像源来下载ubuntu:18.04镜像,可以使用如下命令,此时下载的命令为: docker pull hub.c.163.com/public/ubuntu:18.04
pull子命令支持的选项主要包括:
-a ,--all-tags=true | false:是否获取仓库中的所有镜像,默认为否;--disable-content-trust:取消镜像的内容校验,默认为真。
另外,有时需要使用镜像代理服务来加速Docker镜像获取过程,可以在Docker服务启动配置中增加--registry-mirror=proxy_URL来指定镜像代理服务地址(如 https://registry.docker-cn.com)。
下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运行bash 应用,执行打印“ Hello World ”命令:
docker run - it ubuntu :18.04 bash
root @65663247040f:/# echo "He1lo World " Hello World
root @65663247040f:/# exit
二、查看镜像信息
本节主要介绍Docker镜像的ls、tag和inspect子命令。
1.使用images命令列出镜像
使用docker images或docker image ls命令可以列出本地主机上已有镜像的基本信息。
例如,下面的命令列出了上一小节中下载的镜像信息:
docker images

在列出信息中,可以看到几个字段信息:
- 来自于哪个仓库,比如ubuntu表示ubuntu系列的基础镜像;
- 镜像的标签信息,比如18.04、latest表示不同的版本信息。标签只是标记,并不能标识镜像内容;
- 镜像的ID(唯一标识镜像),如果两个镜像的ID相同,说明它们实际上指向了同一
个镜像,只是具有不同标签名称而已; - 创建时间,说明镜像最后的更新时间;
- 镜像大小,优秀的镜像往往体积都较小。
其中镜像的ID信息十分重要,它唯一标识了镜像。在使用镜像ID的时候,一般可以使用该ID的前若干个字符组成的可区分串来替代完整的 ID 。
TAG信息用于标记来自同一个仓库的不同镜像。例如ubuntu仓库中有多个镜像,通过TAG信息来区分发行版本,如18.04、18.10等。
镜像大小信息只是表示了该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像逻辑体积之和。
images子命令主要支持如下选项,用户可以自行进行尝试:
-a ,--all=true | false:列出所有(包括临时文件)镜像文件,默认为否;--digests=true | false:列出镜像的数字摘要值,默认为否;-f ,--filter=[]:过滤列出的镜像,如dangling=true 只显示没有被使用的镜像;也可指定带有特定标注的镜像等;--format=" TEMPLATE":控制输出格式,如.ID代表ID信息,.Repository代表仓库信息等;-no-trunc=true l 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 [image] inspect命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等:
docker "image" inspect ubuntu:18.04

上面代码返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用-f来指定,例如,获取镜像的Architecture:
docker "image" inspect -f {{".Architecture"}} ubuntu:18.04

4.使用history命令查看镜像历史
既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?这时候可以使用history子命令,该命令将列出各层的创建信息。
例如,查看ubuntu:18.04镜像的创建过程,可以使用如下命令:
docker history ubuntu:18.04

注意,过长的命令被自动截断了,可以使用前面提到的--no-trunc选项来输出完整命令。
docker history ubuntu:18.04 --no-trunc

三、搜寻镜像
本节主要介绍Docker镜像的search子命令。使用docker search命令可以搜索Docker Hub官方仓库中的镜像。语法为docker search [option] keyword。支持的命令选项主要包括:
-f ,--filter filter:过滤输出内容;--format string:格式化输出内容;--limit int:限制输出结果个数,默认为25个;--no-trunc:不截断输出结果。
例如,搜索官方提供的带nginx关键字的镜像,如下所示:
docker search --filter=is-official=true nginx

再比如,搜索所有收藏数超过4的关键词包括tensorflow的镜像:
docker search --filter=stars=4 tensorflow

可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、收藏数(表示该镜像的受欢迎程度、是否官方创建、是否自动创建等。默认的输出结果将按照星级评价进行排序。
四、删除和清理镜像
本节主要介绍Docker镜像的rm和prune命令
1.使用标签删除镜像
使用docker rmi或docker image rm命令可以删除镜像,命令格式为docker rmi IMAGE,其中IMAGE可以为标签或ID
支持选项包括:
-force:强制删除镜像,即使有容器依赖它;﹣no- prune:不要清理未带标签的父镜像。
例如、要删除掉myubuntu:latest镜像,可以使用如下命令:
docker rmi myubuntue:latest

读者可能会想到,本地的ubuntu:latest镜像是否会受到此命令的影响。无须担心,当同一个镜像拥有多个标签的时候,docker rmi命令只是删除了该镜像多个标签中的指定标签而已、并不影响镜像文件。因此上述操作相当于只是删除了镜像2b55860d4c66的一个标签副本而已。
保险起见,再次直看本地的镜像,发现 ubuntu:latest 镜像(准确地说,2dc39ba059dc镜像)仍然存在:
docker images

但当镜像只剩下一个标签的时候就要小心了,此时再使用 docker rmi 命令会彻底删除镜像。
例如通过执行docker rmi命令来删除只有一个标签的镜像,可以看出会副除这个镜像文件的所有文件层:
docker rmi ubuntu:latest

2.使用镜像 ID 来删除镜像
当使用 docker rmi命令,并且后面跟上镜像的ID(也可以是能进行区分的部分ID串前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,例如:先利用ubuntu:18.04镜像创建一个简单的容器来输出一段话:
docker run ubuntu:18.04 echo 'hello! i am here!'

使用docker ps -a命令可以看到本机上存在的所有容器:

可以看到,后台存在一个退出状态的容器,是刚基于ubuntu:18.04镜像创建的。试图删除该镜像,Docker会提示有容器正在运行,无法删除:
docker rmi ubuntu:18.04

如果要想强行删除镜像,可以使用-f参数:
docker rmi -f ubuntu:18.04

注意,通常并不推荐使用-f参数来强制删除一个存在容器依赖的镜像。正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。
首先查看创建的容器:
docker ps -a

然后删除容器2201a14cfcc5、e740917ae7d1、b6e28357c2b9三个容器
docker rm 2201a14cfcc5
docker rm e740917ae7d1
docker rm b6e28357c2b9
再通过docker images命令查找到ubuntu:18.04对应的ID

然后使用ID来删除镜像,此时会正常打印出删除的各层信息:
docker rmi 35b3f4f76a24

3.清理镜像
使用Docker段时间后,系统中可能会遗留一些临时的镜像文件,以及此没有被使用的镜像,可以通过docker image prune命令来进行清理。
支持选项包括:
-a,-all:删除所有无用镜像,不光是临时镜像;-filter filter:只清理出符合filter过滤器的镜像;-f, -force:强制清除镜像,而不进行确认;
例如,如下命令会西东清理临时的遗留镜像文件层,最后会提示释放的存储空间:
docker image prune -f

五、创建镜像
创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于
Dockerfile创建。
本节主要介绍Docker的commit、import和build子命令。
1.基于已有容器创建
该方法主要是使用docker “container” commit命令。
命令格式为docker [container] 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:18.04 /bin/bash
记住容器的ID为01cecb44cd3c 。此时该容器与原ubuntu:18.04镜像相比,已经发生了改变,可以使用docker [container] commit 命令来提交为个新的镜像。 提交时可以使用ID或名称来指定容器:
docker "container" commit -m "Added a new file" -a "Docker Newbee" 01cecb44cd3c test:0.1

此时在看本地镜像列表,会发现新创建的镜像已经存在了:
docker images

总结
本章具体介绍了围绕Docker镜像的系列重要命令操作, 包括获取,查看,搜索,
删除、 创建等。读者可以使用docker image help命令查看Docker支持的镜像操作子命令。
镜像是使用Docker的前提,也是最基本的资源。所以,在平时的Docker使用中,要注意积累自己定制的镜像文件,并将自己创建的高质量镜像分享到社区中。在后续章节,笔者将通过更多案例介绍Docker镜像的操作技巧。

本文详细介绍了Docker镜像的获取、查看、搜索、删除和创建等操作,包括使用`docker pull`下载镜像,`docker images`列出信息,`docker tag`添加标签,`docker search`搜寻镜像,`docker rm`删除镜像,以及基于已有容器创建新镜像。强调了镜像在Docker中的重要性,并提示用户注意镜像的管理和版本控制。
1499

被折叠的 条评论
为什么被折叠?



