镜像作为 Docker 三大核心概念中,最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的。本文将带您一步一步,图文并重,上手操作来学习它。
目录:
一、Docker 下载镜像1.1下载镜像
1.2 验证
1.3 下载镜像相关细节
1.4 PULL 子命令
二、Docker 查看镜像信息2.1 images 命令列出镜像
2.2 使用 tag 命令为镜像添加标签
2.3 使用 inspect 命令查看镜像详细信息
2.4 使用 history 命令查看镜像历史
三、Docker 搜索镜像3.1 search 命令
3.2 search 子命令
四、总结
一、Docker 下载镜像
如果我们想要在本地运行容器,就必须保证本地存在对应的镜像。所以,第一步,我们需要下载镜像。当我们尝试下载镜像时,Docker 会尝试先从默认的镜像仓库(默认使用 Docker Hub 公共仓库)去下载,当然了,用户也可以自定义配置想要下载的镜像仓库。
1.1 下载镜像
镜像是运行容器的前提,我们可以使用 docker pull[IMAGE_NAME]:[TAG]命令来下载镜像,其中 IMAGE_NAME表示的是镜像的名称,而 TAG 是镜像的标签,也就是说我们需要通过 “镜像 + 标签” 的方式来下载镜像。注意:您也可以不显式地指定 TAG, 它会默认下载 latest 标签,也就是下载仓库中最新版本的镜像。这里并不推荐您下载 latest 标签,因为该镜像的内容会跟踪镜像的最新版本,并随之变化,所以它是不稳定的。在生产环境中,可能会出现莫名其妙的 bug, 推荐您最好还是显示的指定具体的 TAG。
举个例子,如我们想要下载一个 Mysql 5.7 镜像,可以通过命令来下载:docker pull mysql:5.7
会看到控制台输出内容如下:
注意:由于官方 DockerHub 仓库服务器在国外,下载速度较慢,所以我将仓库的地址更改成了国内的 docker.io 的镜像仓库,所以在上图中,镜像前面会有 docker.io 出现。
当有 Downloaded 字符串输出的时候,说明下载成功了!!
1.2 验证
让我们来验证一下,本地是否存在 Mysql5.7 的镜像,运行命令:docker images
可以看到本地的确存在该镜像,确实是下载成功了!
1.3 下载镜像相关细节
再说说上面下载镜像的过程:
通过下载过程,可以看到,一个镜像一般是由多个层( layer) 组成,类似 f7e2b70d04ae这样的串表示层的唯一 ID。PS: 实际上完整的 ID 包括了 256 个 bit, 64 个十六进制字符组成的。
您可能会想,如果多个不同的镜像中,同时包含了同一个层( layer),这样重复下载,岂不是导致了存储空间的浪费么?
实际上,Docker 并不会这么傻会去下载重复的层( layer),Docker 在下载之前,会去检测本地是否会有同样 ID 的层,如果本地已经存在了,就直接使用本地的就好了。
另一个问题,不同仓库中,可能也会存在镜像重名的情况发生, 这种情况咋办?
严格意义上,我们在使用 docker pull 命令时,还需要在镜像前面指定仓库地址( Registry), 如果不指定,则 Docker 会使用您默认配置的仓库地址。例如上面,由于我配置的是国内 docker.io 的仓库地址,我在 pull 的时候,docker 会默认为我加上 docker.io/library 的前缀。
如:当我执行 docker pull mysql:5.7 命令时,实际上相当于 docker pull docker.io/mysql:5.7,如果您未自定义配置仓库,则默认在下载的时候,会在镜像前面加上 DockerHub 的地址。
Docker 通过前缀地址的不同,来保证不同仓库中,重名镜像的唯一性。
1.4 PULL 子命令
命令行中输入:docker pull --help
会得到如下信息:[root@iZbp1j8y1bab0djl9gdp33Z~]#docker pull--help
Usage:docker pull[OPTIONS]NAME[:TAG|@DIGEST]
Pullan image or a repository from a registry
Options:
-a,--all-tagsDownloadall tagged imagesinthe repository
--disable-content-trustSkipimage verification(default true)
--helpPrintusage
我们可以看到主要支持的子命令有:-a,--all-tags=true|false: 是否获取仓库中所有镜像,默认为否;
--disable-content-trust: 跳过镜像内容的校验,默认为 true;
二、Docker 查看镜像信息
2.1 images 命令列出镜像
通过使用如下两个命令,列出本机已有的镜像:docker images
或:docker image ls
如下图所示:
对上述红色标注的字段做一下解释:REPOSITORY: 来自于哪个仓库;
TAG: 镜像的标签信息,比如 5.7、latest 表示不同的版本信息;
IMAGE ID: 镜像的 ID, 如果您看到两个 ID 完全相同,那么实际上,它们指向的是同一个镜像,只是标签名称不同罢了;
CREATED: 镜像最后的更新时间;
SIZE: 镜像的大小,优秀的镜像一般体积都比较小,这也是我更倾向于使用轻量级的 alpine 版本的原因;注意:图中的镜像大小信息只是逻辑上的大小信息,因为一个镜像是由多个镜像层( layer)组成的,而相同的镜像层本地只会存储一份,所以,真实情况下,占用的物理存储空间大小,可能会小于逻辑大小。
2.2 使用 tag 命令为镜像添加标签
通常情况下,为了方便在后续工作中,快速地找到某个镜像,我们可以使用 docker tag 命令,为本地镜像添加一个新的标签。如下图所示:
为 docker.io/mysql 镜像,添加新的镜像标签 allen_mysql:5.7。然后使用 docker images 命令,查看本地镜像:
可以看到,本地多了一个 allen_mysql:5.7 的镜像。细心的你一定还会发现, allen_mysql:5.7 和 docker.io/mysql:5.7 的镜像 ID 是一模一样的,说明它们是同一个镜像,只是别名不同而已。
docker tag 命令功能更像是, 为指定镜像添加快捷方式一样。
2.3 使用 inspect 命令查看镜像详细信息
通过 docker inspect 命令,我们可以获取镜像的详细信息,其中,包括创建者,各层的数字摘要等。docker inspect docker.io/mysql:5.7
docker inspect 返回的是 JSON 格式的信息,如果您想获取其中指定的一项内容,可以通过 -f 来指定,如获取镜像大小:docker inspect -f {{".Size"}} docker.io/mysql:5.7
2.4 使用 history 命令查看镜像历史
前面的小节中,我们知道了,一个镜像是由多个层(layer)组成的,那么,我们要如何知道各个层的具体内容呢?
通过 docker history 命令,可以列出各个层(layer)的创建信息,如我们查看 docker.io/mysql:5.7 的各层信息:docker history docker.io/mysql:5.7
可以看到,上面过长的信息,为了方便展示,后面都省略了,如果您想要看具体信息,可以通过添加 --no-trunc选项,如下面命令:docker history --no-trunc docker.io/mysql:5.7
三、Docker 搜索镜像
3.1 search 命令
您可以通过下面命令进行搜索:docker search [option] keyword
比如,您想搜索仓库中 mysql 相关的镜像,可以输入如下命令:docker search mysql
3.2 search 子命令
命令行输入 docker search--help, 输出如下:Usage:docker search[OPTIONS]TERM
SearchtheDockerHubforimages
Options:
-f,--filter filterFilteroutput based on conditions provided
--helpPrintusage
--limit intMaxnumber of search results(default25)
--no-indexDon't truncate output
--no-trunc Don't truncate output
可以看到 search 支持的子命令有:-f,--filter filter: 过滤输出的内容;
--limitint:指定搜索内容展示个数;
--no-index: 不截断输出内容;
--no-trunc:不截断输出内容;
举个列子,比如我们想搜索官方提供的 mysql 镜像,命令如下:docker search --filter=is-offical=true mysql
再比如,我们想搜索 Stars 数超过 100 的 mysql 镜像:docker search --filter=stars=100 mysql
四、总结
本文中,我们着重学习了 Docker 中下载镜像, 查看镜像信息,以及搜索镜像的相关操作。本文是上篇,下篇的文章中,将带领您学习更多的镜像操作,也祝您学习愉快!