社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

关于 Docker 镜像的操作,看完这篇就够啦 !(上)

公众号_小哈学Java • 6 年前 • 484 次点击  
阅读 89

关于 Docker 镜像的操作,看完这篇就够啦 !(上)

Docker 镜像学习上
Docker 镜像学习上

文章首发于微信公众号: 小哈学Java

镜像作为 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
复制代码

会看到控制台输出内容如下:

Docker 下载镜像
Docker 下载镜像

注意:由于官方 DockerHub 仓库服务器在国外,下载速度较慢,所以我将仓库的地址更改成了国内的 docker.io 的镜像仓库,所以在上图中,镜像前面会有 docker.io 出现。

当有 Downloaded 字符串输出的时候,说明下载成功了!!

1.2 验证

让我们来验证一下,本地是否存在 Mysql5.7 的镜像,运行命令:

docker images
复制代码

验证本地镜像是否存在
验证本地镜像是否存在

可以看到本地的确存在该镜像,确实是下载成功了!

1.3 下载镜像相关细节

再说说上面下载镜像的过程:

Docker 镜像下载
Docker 镜像下载

通过下载过程,可以看到,一个镜像一般是由多个层(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]

Pull an image or a repository from a registry

Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
      --help                    Print usage
复制代码

我们可以看到主要支持的子命令有:

  1. -a, --all-tags=true|false: 是否获取仓库中所有镜像,默认为否;
  2. --disable-content-trust: 跳过镜像内容的校验,默认为 true;

二、Docker 查看镜像信息

2.1 images 命令列出镜像

通过使用如下两个命令,列出本机已有的镜像:

docker images
复制代码

或:

docker image ls
复制代码

如下图所示:

Docker 查看镜像信息
Docker 查看镜像信息

对上述红色标注的字段做一下解释:

  • REPOSITORY: 来自于哪个仓库;
  • TAG: 镜像的标签信息,比如 5.7、latest 表示不同的版本信息;
  • IMAGE ID: 镜像的 ID, 如果您看到两个 ID 完全相同,那么实际上,它们指向的是同一个镜像,只是标签名称不同罢了;
  • CREATED: 镜像最后的更新时间;
  • SIZE: 镜像的大小,优秀的镜像一般体积都比较小,这也是我更倾向于使用轻量级的 alpine 版本的原因;

注意:图中的镜像大小信息只是逻辑上的大小信息,因为一个镜像是由多个镜像层(layer)组成的,而相同的镜像层本地只会存储一份,所以,真实情况下,占用的物理存储空间大小,可能会小于逻辑大小。

2.2 使用 tag 命令为镜像添加标签

通常情况下,为了方便在后续工作中,快速地找到某个镜像,我们可以使用 docker tag 命令,为本地镜像添加一个新的标签。如下图所示:

Docker tag 添加标签
Docker tag 添加标签

docker.io/mysql 镜像,添加新的镜像标签 allen_mysql:5.7。然后使用 docker images 命令,查看本地镜像:

Docker tag 添加标签
Docker tag 添加标签

可以看到,本地多了一个 allen_mysql:5.7 的镜像。细心的你一定还会发现,allen_mysql:5.7docker.io/mysql:5.7 的镜像 ID 是一模一样的,说明它们是同一个镜像,只是别名不同而已。

docker tag 命令功能更像是, 为指定镜像添加快捷方式一样。

2.3 使用 inspect 命令查看镜像详细信息

通过 docker inspect 命令,我们可以获取镜像的详细信息,其中,包括创建者,各层的数字摘要等。

docker inspect docker.io/mysql:5.7
复制代码

Docker inspect 查看镜像详细信息
Docker inspect 查看镜像详细信息

docker inspect 返回的是 JSON 格式的信息,如果您想获取其中指定的一项内容,可以通过 -f 来指定,如获取镜像大小:

docker inspect -f {{".Size"}} docker.io/mysql:5.7
复制代码

Docker inspect 查看镜像详细信息
Docker inspect 查看镜像详细信息

2.4 使用 history 命令查看镜像历史

前面的小节中,我们知道了,一个镜像是由多个层(layer)组成的,那么,我们要如何知道各个层的具体内容呢?

通过 docker history 命令,可以列出各个层(layer)的创建信息,如我们查看 docker.io/mysql:5.7 的各层信息:

docker history docker.io/mysql:5.7
复制代码

Docker history 各层信息
Docker history 各层信息

可以看到,上面过长的信息,为了方便展示,后面都省略了,如果您想要看具体信息,可以通过添加 --no-trunc 选项,如下面命令:

docker history --no-trunc docker.io/mysql:5.7
复制代码

三、Docker 搜索镜像

3.1 search 命令

您可以通过下面命令进行搜索:

docker search [option] keyword
复制代码

比如,您想搜索仓库中 mysql 相关的镜像,可以输入如下命令:

docker search mysql
复制代码

Docker 搜索镜像
Docker 搜索镜像

3.2 search 子命令

命令行输入 docker search --help, 输出如下:

Usage:  docker search [OPTIONS] TERM

Search the Docker Hub for images

Options:
  -f, --filter filter   Filter output based on conditions provided
      --help            Print usage
      --limit int       Max number of search results (default 25)
      --no-index        Don't truncate output
      --no-trunc        Don't truncate output
复制代码

可以看到 search 支持的子命令有:

  • -f, --filter filter: 过滤输出的内容;
  • --limit int:指定搜索内容展示个数;
  • --no-index: 不截断输出内容;
  • --no-trunc:不截断输出内容;

举个列子,比如我们想搜索官方提供的 mysql 镜像,命令如下:

docker search --filter=is-offical=true mysql
复制代码

Docker 搜索官方镜像
Docker 搜索官方镜像

再比如,我们想搜索 Stars 数超过 100 的 mysql 镜像:

docker search --filter=stars=100 mysql
复制代码

Docker 搜索镜像
Docker 搜索镜像

四、总结

本文中,我们着重学习了 Docker 中下载镜像, 查看镜像信息,以及搜索镜像的相关操作。本文是上篇,下篇的文章中,将带领您学习更多的镜像操作,也祝您学习愉快!

欢迎关注个人公众号: 小哈学Java

小哈学Java

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30982
 
484 次点击