2.1 镜像的拉取与查看词条:pull、images、inspect、history


2.1 镜像的拉取与查看词条:pull、images、inspect、history

本节摘要:本节是贰部的入口词条组:docker pull 把镜像从仓库取回本地,docker images 列出家底,docker image inspect 读结构,docker history 查来路。词条覆盖"拿到镜像、看清镜像"的完整动作链,重点在输出的读法——分层下载、层共享、体积口径、层与指令的对应关系。

壹部教会了你向 Docker 提问,贰部从"拿到镜像"开始。别以为拉镜像就是敲个 pull 等进度条:输出里每一行的含义、latest 标签的真面目、SIZE 列与磁盘占用的口径差,都是后面排查与清理的地基。本节按"取—列—查—溯"的顺序给全词条。

词条卡:docker pull

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

义项(常用选项):

选项 含义 使用时机
无参数 + 名字 拉取该镜像的 latest 标签 明确知道 latest 可接受时
名字:标签 拉取指定标签 绝大多数正式场景
名字@摘要 按内容摘要拉取 要求内容不可变时
-a 拉取全部标签 少见,体积代价大
-q 精简输出 脚本里压掉进度行

使用现场:一次完整的拉取会话

$ docker pull nginx:1.25 1.25: Pulling from library/nginx a2abf6c4d29d: Pull complete c2d78e6b9f3b: Pull complete 4e1d0a9d2f8a: Pull complete f8b3e6a1c7d2: Pull complete Digest: sha256:6fd15a2b...(摘要串,此处截断) Status: Downloaded newer image for nginx:1.25 docker.io/library/nginx:1.25

逐段读这份输出。冒号前是层的哈希前缀,Pull complete 表示该层已落盘。如果某行显示 Already exists,说明这层本地已经有——多个镜像共享底层正是分层设计的目的,也解释了为什么第二个基于同基础镜像的 pull 快得多。Digest 是镜像内容的摘要,可用于精确引用。最后一行给出完整规范名:docker.io/library/nginx:1.25,其中 library 是官方镜像的命名空间。

使用现场:latest 标签的真面目

$ docker pull nginx Using default tag: latest latest: Pulling from library/nginx ... $ docker pull nginx:latest

上面写法等价。关键认知是:latest 不是"最新版本",只是个普通标签名,仓库维护者把它指向哪个版本完全由人决定。生产机器上拉 latest 意味着两次拉取可能得到不同内容——这是很多"昨天还好好的"事故的源头。词条用法约定:正式环境永远写显式版本标签。

词条卡:docker images

docker images [OPTIONS] [REPOSITORY[:TAG]]

义项

选项 含义 使用时机
无参数 列出顶层镜像 日常查看
-a 含中间层 排查悬空层
-q 只输出 ID 配合批量删除
--digests 附摘要列 核对内容一致性
--filter dangling=true 只列悬空镜像 清理前盘点
--format Go 模板定制列 脚本化输出

使用现场:读一份镜像清单

$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.25 a72860cb95fd 3 weeks ago 187MB nginx latest a72860cb95fd 3 weeks ago 187MB redis 7.2 da167ab9b8d0 5 weeks ago 138MB <none> <none> 3f8a2c1d9e4b 6 days ago 187MB

四列各有读法。REPOSITORY 与 TAG 组成引用名,注意 nginx 两个标签指向同一个 IMAGE ID——同一份内容挂了多个名字,删掉其中标题不会真正释放空间。CREATED 是镜像构建时间而非拉取时间。SIZE 是镜像解包后的逻辑体积,实际磁盘占用通常更小,因为层被共享。最后那行 <none> <none> 就是悬空镜像:旧标签被新构建顶掉后留下的无主层,2.3 节清理词条的主角。

$ docker images --filter dangling=true -q 3f8a2c1d9e4b $ docker images --format '{{.Repository}}:{{.Tag}} {{.Size}}' nginx:1.25 187MB nginx:latest 187MB redis:7.2 138MB

过滤加模板是脚本里的固定搭配:前者圈出目标,后者压出需要的列。

查结构:inspect 与 history

images 告诉你有什么,inspect 与 history 告诉你它是什么。inspect 输出完整的元数据 JSON,history 按序列出每层的生成指令,两者互为补充。

查结构:inspect 与 history

图里这叠层的实际数据可以这样验证:

$ docker image inspect nginx:1.25 --format '{{.Id}}' sha256:a72860cb95fd... $ docker history nginx:1.25 IMAGE CREATED CREATED BY SIZE a72860cb95fd 3 weeks ago CMD ["nginx" "-g" "daemon off;"] 0B <missing> 3 weeks ago COPY 30-tune-worker-processes.sh /docker-ent… 1.62kB <missing> 3 weeks ago COPY 20-envsubst-on-templates.sh /docker-ent… 3.02kB <missing> 3 weeks ago RUN /bin/sh -c apt-get update && apt-get ins… 59.5MB <missing> 3 weeks ago /bin/sh -c #(nop) ENV DYNPKG_RELEASE=1~book… 0B <missing> 3 weeks ago /bin/sh -c #(nop) ADD file:... in / 74.8MB

history 的读法:自下而上是构建顺序,SIZE 非零的层是真正占空间的层(通常是 RUN 与 COPY),0B 的层只改元数据(ENV、CMD 之类)。CREATED BY 列直接暴露生成指令,这也是反推别人镜像怎么造出来的标准手法。<missing> 不是错误——那表示该层来自远端清单,本地只存了压缩后的内容。inspect 的 --format 取 Id 字段则常用于脚本比对两处镜像是否同一份内容。

⚠️ 常见坑:用 IMAGE ID 判断"两个标签是不是同一镜像"没错,但用 SIZE 判断"删掉能腾多少空间"会失算——SIZE 是解包体积,且共享层删一个引用不会释放。真正释放多少,等 2.3 清理完用系统 df 对比才知道。

本节要点回顾

  • pull 认标签与摘要:latest 只是默认标签名不是"最新",正式环境写显式版本。
  • 层共享让 pull 变快:Already exists 的行不是跳过下载,而是复用本地已有层。
  • images 的口径:SIZE 是逻辑体积;<none> 标签是悬空镜像,清理前先用 dangling 过滤盘点。
  • inspect 管结构、history 管来路:前者取元数据字段,后者按层暴露生成指令与体积。
  • 引用名与内容分离:多个标签可挂同一个 IMAGE ID,删名字不删层。

下一条词条从"用别人的镜像"转到"造自己的镜像":docker build 把一叠指令变成一叠层,2.2 见。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U