目录1、镜像介绍2、镜像相关指令2.1 docker pull 指令2.2 docker push 指令2.3 docker search 指令2.4 docker logout 指令2.5 docker images 指令2.6 docker image inspect 指令2.7 docker tag 指令2.8 docker rmi 指令2.9 docker save 指令2.10 docker load 指令2.11 docker history 指令2.12 docker import 指令 之后补充2.13 docker image prune 指令1、镜像介绍Docker 镜像Image是 Docker 容器的基础可以把它理解为一个只读的模板用来创建容器。镜像 一个打包好的、不可变的文件系统快照里面包含了运行某个应用所需的一切操作系统基础如 Ubuntu、Alpine运行时环境如 Python、Node.js、JRE应用程序代码依赖库环境变量、启动命令等配置关键特性分层存储Layered镜像由多层layer叠加而成每一层文件系统我们叫做一层 layer每条 Dockerfile 指令生成一层。层可以复用和缓存所以多个镜像能共享相同的底层节省磁盘和传输时间。构建镜像的时候从一个最基本的操作系统开始每个构建的操作都相当于做一层 的修改增加了一层文件系统。一层层往上叠加上层的修改会覆盖底层该位置的可 见性这也很容易理解就像上层把底层遮住了一样。当你使用的时候你只会看到 一个完全的整体你不知道里面有几层也不清楚每一层所做的修改是什么只读镜像层不可修改。容器启动时会在最上面加一个可写层所有改动都发生在可写层镜像本身不变。可分发镜像可以 push 到镜像仓库如 Docker Hub、私有 Registry也可以 pull 下来使用实现一次构建到处运行。docker 镜像技术解决的问题1、环境不一致问题传统开发中应用依赖特定版本的 OS、库、运行时换一台机器就可能跑不起来。镜像把应用代码 依赖库 运行时 系统环境全部固化在一起开发、测试、生产用同一个镜像环境完全一致2、解决环境搭建和配置的重复劳动过去部署一个应用要手动装 JDK、配环境变量、装依赖、调系统参数每台机器重复一遍还容易出错。环境搭建过程写进 Dockerfile一次定义处处复用2、镜像相关指令2.1 docker pull 指令作用用于从镜像仓库拉取镜像到本地基本语法docker pull [OPTIONS] NAME[:TAG|DIGEST]不指定 TAG 时默认拉取 latest 标签也可以用 DIGEST 精确拉取某个内容哈希对应的镜像版本。常用选项选项说明-a, --all-tags拉取该仓库下所有标签的镜像--platform指定平台架构如linux/amd64、linux/arm64多架构镜像时有用-q, --quiet精简输出只显示镜像 ID使用示例# 拉取最新版 docker pull nginx # 拉取指定标签 docker pull nginx:1.27-alpine # 拉取指定架构在 arm 机器上拉 amd64 镜像等场景 docker pull --platform linux/amd64 nginx:latest # 拉取某仓库所有标签慎用可能非常大 docker pull -a myrepo/myimage #用 DIGEST 精确拉取 docker pull nginxsha256:557c9ede65655e5a70e4a32f1651638ea3bfb0802edd982810884602f700ba25注意镜像存储在 docker hub 时进行了压缩所以拉取后的镜像大小比 docker hub 显示的镜像大小要大这样做的目的是节省存储空间和提高拉取速度。2.2 docker push 指令作用用于将本地镜像上传到镜像仓库基本语法docker push [OPTIONS] NAME[:TAG] #或者 docker image push [OPTIONS] NAME[:TAG]选项说明-a, --all-tags推送该仓库下所有标签的镜像-q, --quiet精简输出只显示镜像 ID--platform推送指定平台如linux/amd64的单一清单多架构镜像慎用推送前必须先将本地镜像“标记”为目标仓库的完整地址否则docker push不知道往哪推。# 格式docker tag 本地镜像名 仓库地址/命名空间/仓库名:标签 docker tag my-app:latest yourusername/my-app:v1.0注意1、镜像存储在 docker hub 时进行了压缩,所以提交后的镜像大小比本地显示的镜像大小要小2、重复镜像(相同镜像不同 tag)不会存储两份只会存储一份2.3 docker search 指令作用用于在 Docker Hub 上按关键词搜索公开镜像但是我们一般使用浏览器直接在 hub.docker.com 上找不会使用命令行找。基本语法docker search [OPTIONS] TERM执行后会返回一个表格包含这几列NAME镜像名。不带/的是官方镜像带/的是用户/组织镜像如username/image。DESCRIPTION镜像描述默认截断。STARS收藏数大致反映受欢迎程度。OFFICIAL显示[OK]表示是 Docker 官方镜像。AUTOMATED是否自动构建此功能已标记弃用。常用选项选项说明-f, --filter按条件过滤支持starsN星数≥N、is-officialtrue仅官方--limit限制返回结果数量默认通常为 25最大 100--no-trunc不截断描述信息显示完整内容--format使用 Go 模板自定义输出如--format {{.Name}}: {{.StarCount}}2.4 docker logout 指令作用用于退出已登录的镜像仓库并清除本地保存的对应凭证。如果不指定仓库地址默认退出 Docker 官方公共仓库。基本语法docker logout [SERVER]SERVER参数是可选的可以填仓库的 URL 或主机名。使用示例# 退出 Docker Hub默认行为 docker logout # 退出本地或私有仓库例如 localhost:8080 docker logout localhost:8080执行成功后通常会看到类似Removing login credentials for https://index.docker.io/v1/的提示表示凭证已从本地配置中移除。2.5 docker images 指令作用用于列出本地存储的 Docker 镜像基本语法docker images [OPTIONS] [REPOSITORY[:TAG]]可以按仓库名和标签进行精确过滤。例如docker images java列出java仓库的所有镜像docker images java:8只列出标签为8的镜像。注意匹配必须是精确的docker images jav不会匹配到java。常用选项选项作用-a, --all显示所有镜像包括中间层镜像默认会隐藏-q, --quiet只显示镜像 ID适合脚本处理--no-trunc显示完整的镜像 ID不截断--digests额外显示镜像的摘要digest-f, --filter按条件过滤例如danglingtrue只看悬空镜像before镜像名 只看早于 镜像名 的镜像使用示例# 查看本地所有镜像 docker images # 只看镜像 ID常用于批量删除等脚本 docker images -q # 查看悬空镜像没有标签、不被任何容器引用的镜像 docker images --filter danglingtrue # 查看 nginx 仓库的所有本地镜像 docker images nginx默认输出包含REPOSITORY仓库名、TAG标签、IMAGE ID镜像 ID、CREATED创建时间、SIZE大小。其中IMAGE ID默认截断显示但通常前几位字符就足以在其他 Docker 命令中引用该镜像。2.6 docker image inspect 指令作用用于查看一个或多个本地镜像的详细元数据输出为 JSON 格式。基本语法docker image inspect [OPTIONS] IMAGE [IMAGE...]常用选项选项作用-f, --format用 Go 模板自定义输出提取特定字段避免阅读大段 JSON--platform查看多平台镜像中指定平台如linux/amd64的详细配置需 API 1.49使用示例docker image inspect nginx:latest输出中的关键字段字段含义Id镜像的内容寻址 IDSHA256RepoTags指向该镜像的本地标签列表RepoDigests从仓库拉取时记录的 manifest digestArchitecture/Os镜像的目标平台Config.Env/Config.Cmd默认环境变量与启动命令RootFS.Layers组成镜像的每一层 digestSize镜像总大小字节2.7 docker tag 指令作用用于为本地镜像创建一个新的标签别名。它不会复制镜像数据只是让同一个镜像 ID 多了一个可引用的名称常用于在推送前将镜像“标记”为目标仓库的完整地址。基本语法docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]理解TARGET_IMAGE的组成很重要因为它决定了镜像会被推送到哪里[HOST[:PORT]/]NAMESPACE/REPOSITORY[:TAG]组成部分说明默认值HOST仓库地址如registry.cn-hangzhou.aliyuncs.comdocker.ioDocker HubNAMESPACE用户或组织名library官方镜像命名空间REPOSITORY镜像仓库名必填TAG版本标识latest常用示例1. 为镜像 ID 打标签docker tag 0e5574283393 fedora/httpd:version1.0将短 ID 为0e5574283393的本地镜像标记为fedora/httpd:version1.0。2. 为已有名称的镜像打新标签docker tag httpd:test fedora/httpd:version1.0.test源镜像指定了httpd:test目标标签为fedora/httpd:version1.0.test。3. 为推送到私有仓库做准备docker tag my-app:latest myregistryhost:5000/fedora/httpd:version1.0目标名称包含了仓库主机名和端口这样后续docker push才会推送到私有仓库而非 Docker Hub。4. 准备推送到 Docker Hubdocker tag my-app yourusername/my-app:v1.0将本地my-app标记为yourusername/my-app:v1.0之后即可docker push yourusername/my-app:v1.02.8 docker rmi 指令作用rmiremoveimage。删除本地一个或多个镜像。只操作本地存储不会影响远程仓库中的镜像基本语法docker rmi [OPTIONS] IMAGE [IMAGE...]支持同时指定多个镜像可以用镜像名:标签、短/长镜像 ID 或 digest 来引用常用选项选项作用-f, --force强制删除用于处理容器占用或多标签冲突但并非万能--no-prune不删除未打标签的父镜像--platform仅删除指定平台变体API 1.50需配合--force注意1. 标签删除与镜像删除的区别如果镜像有多个标签docker rmi 标签只移除该标签镜像数据仍在。直到最后一个标签被删除或直接用 ID 配合-f强制删除镜像才会真正消失。输出中的Untagged表示移除标签Deleted表示删除存储层。2. 镜像被容器占用时无法删除即使容器已停止只要它还存在docker ps -a可见对应镜像就无法直接删除。需要先docker rm删除所有使用该镜像的容器再删镜像。-f在某些冲突下可以强制但不能绕过所有“容器正在使用”的保护。3. 省略标签会默认指向latestdocker rmi centos实际尝试删除的是centos:latest。如果本地只有centos:7会报No such image。删除前先用docker images确认实际标签带上完整名称:标签最稳妥。使用示例# 按名称和标签删除 docker rmi nginx:1.25 # 按镜像 ID 删除 docker rmi d583c3ac45fd # 强制删除处理多标签冲突等 docker rmi -f d583c3ac45fd # 批量删除多个镜像 docker rmi img1:tag img2:tag2.9 docker save 指令作用用于将一个或多个本地镜像保存为 tar 归档文件常用于离线环境部署或镜像备份。它保存的是完整的镜像包含所有层、标签和元数据后续可通过docker load完整恢复基本语法docker save [OPTIONS] IMAGE [IMAGE...]常用选项选项作用-o, --output将归档写入文件而不是输出到标准输出STDOUT--platform仅保存指定平台变体如linux/amd64。默认会保存本地所有平台变体使用示例保存到文件最常用docker save -o nginx_latest.tar nginx:latest或使用重定向docker save nginx:latest nginx_latest.tar保存多个镜像到同一个归档docker save -o combined.tar image1:tag1 image2:tag2保存并压缩节省空间docker save myimage:latest | gzip myimage_latest.tar.gz仅保存指定平台docker save --platform linux/amd64 -o alpine_amd64.tar alpine:latest2.10 docker load 指令作用用于从 tar 归档文件或标准输入中加载镜像到本地是docker save的逆向操作。它会恢复镜像及其标签保留完整的层历史和元数据是离线环境迁移镜像的标准方式。基本语法docker load [OPTIONS]常用选项选项作用-i, --input从指定 tar 文件读取而非标准输入-q, --quiet减少加载过程的输出--platform仅加载指定平台变体如linux/amd64支持逗号分隔多个使用示例从文件加载最常用docker load -i nginx_latest.tar或使用重定向docker load nginx_latest.tar加载压缩归档docker load能自动识别 gzip、bzip2、xz、zstd 等压缩格式无需手动解压docker load myimage.tar.gz仅加载指定平台当归档包含多平台镜像时可只提取需要的架构docker load -i multiarch.tar --platformlinux/amd642.11 docker history 指令作用用于查看本地镜像的构建历史展示每一层是如何产生的基本语法docker history [OPTIONS] IMAGE常用选项选项作用-H, --human以人类可读格式显示大小和时间默认开启--no-trunc不截断输出完整显示命令和 ID-q, --quiet仅显示镜像 ID--format自定义输出格式支持table、json或 Go 模板输出列的含义执行docker history nginx会看到类似输出IMAGE每层对应的镜像 IDCREATED该层的创建时间CREATED BY创建该层的命令如RUN、COPY指令SIZE该层占用的磁盘空间COMMENT注释信息通常由docker commit -m添加使用示例# 查看完整历史不截断命令 docker history --no-trunc nginx:latest # 只看镜像 ID docker history -q nginx:latest # 自定义输出只显示创建命令和大小 docker history --format {{.CreatedBy}} {{.Size}} nginx:latest2.12 docker import 指令 之后补充2.13 docker image prune 指令作用prune: 修剪削减精简清理本地未被使用的镜像是释放磁盘空间的常用命令。它和docker rmi的区别在于rmi需要你明确指定要删的镜像而prune是批量清理“符合条件”的镜像不需要逐个列出基本语法docker image prune [OPTIONS]默认行为不带任何选项只清理悬空镜像dangling images。悬空镜像是指既没有标签none:none也没有被任何容器包括已停止的容器引用的镜像。这类镜像通常由重新构建同名标签等操作产生。常用选项选项作用-a, --all扩大清理范围除了悬空镜像还会删除所有没有被任何容器引用的镜像包括有标签的-f, --force跳过确认提示直接执行--filter按条件过滤缩小清理范围使用-a时务必谨慎它会把你有标签、但当前没有任何容器在用的镜像也删掉。如果你有停止状态的容器它们引用的镜像不会被删除因为容器还存在就算“被引用”。但如果你手动docker rm了某个容器它对应的镜像就可能变成“未被引用”的状态从而被-a清理掉。过滤器的用法--filter支持until和label两类条件。按时间过滤只清理创建超过指定时长的镜像# 只清理创建超过 24 小时的未使用镜像 docker image prune -a --filter until24huntil的值可以是 Go 时长格式如24h、10m也可以是具体时间戳。按标签过滤# 只清理带有 deprecated 标签的镜像 docker image prune --filter labeldeprecated多个不同键的过滤器之间是AND关系必须同时满足同一个键的多个值是OR关系满足任一即可。