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 指令
作用:用于从镜像仓库拉取镜像到本地
基本语法
bash
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
不指定 TAG 时默认拉取 latest 标签;也可以用 @DIGEST 精确拉取某个内容哈希对应的镜像版本。

常用选项
| 选项 | 说明 |
|---|---|
-a, --all-tags |
拉取该仓库下所有标签的镜像 |
--platform |
指定平台架构,如 linux/amd64、linux/arm64,多架构镜像时有用 |
-q, --quiet |
精简输出,只显示镜像 ID |
使用示例
bash
# 拉取最新版
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 nginx@sha256:557c9ede65655e5a70e4a32f1651638ea3bfb0802edd982810884602f700ba25
注意:镜像存储在 docker hub 时进行了压缩,所以拉取后的镜像大小比 docker hub 显示的镜像大小要大,这样做的目的是节省存储空间和提高拉取速度。
2.2 docker push 指令
作用:用于将本地镜像上传到镜像仓库
基本语法
bash
docker push [OPTIONS] NAME[:TAG]
#或者
docker image push [OPTIONS] NAME[:TAG]
| 选项 | 说明 |
|---|---|
-a, --all-tags |
推送该仓库下所有标签的镜像 |
-q, --quiet |
精简输出,只显示镜像 ID |
--platform |
推送指定平台(如 linux/amd64)的单一清单,多架构镜像慎用 |
推送前必须先将本地镜像"标记"为目标仓库的完整地址,否则 docker push 不知道往哪推。
bash
# 格式: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 上找,不会使用命令行找。
基本语法
bash
docker search [OPTIONS] TERM
执行后会返回一个表格,包含这几列:
NAME :镜像名。不带
/的是官方镜像,带/的是用户/组织镜像(如username/image)。DESCRIPTION:镜像描述(默认截断)。
STARS:收藏数,大致反映受欢迎程度。
OFFICIAL :显示
[OK]表示是 Docker 官方镜像。AUTOMATED:是否自动构建(此功能已标记弃用)。
常用选项
| 选项 | 说明 |
|---|---|
-f, --filter |
按条件过滤,支持 stars=N(星数≥N)、is-official=true(仅官方) |
--limit |
限制返回结果数量(默认通常为 25,最大 100) |
--no-trunc |
不截断描述信息,显示完整内容 |
--format |
使用 Go 模板自定义输出,如 --format "{``{.Name}}: {``{.StarCount}}" |
2.4 docker logout 指令
作用:用于退出已登录的镜像仓库,并清除本地保存的对应凭证。如果不指定仓库地址,默认退出 Docker 官方公共仓库。
基本语法
bash
docker logout [SERVER]
SERVER 参数是可选的,可以填仓库的 URL 或主机名。
使用示例
bash
# 退出 Docker Hub(默认行为)
docker logout
# 退出本地或私有仓库(例如 localhost:8080)
docker logout localhost:8080
执行成功后,通常会看到类似 Removing login credentials for https://index.docker.io/v1/ 的提示,表示凭证已从本地配置中移除。
2.5 docker images 指令
作用:用于列出本地存储的 Docker 镜像
基本语法
bash
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 |
按条件过滤,例如 dangling=true 只看悬空镜像, before=镜像名 只看早于 镜像名 的镜像 |
使用示例
bash
# 查看本地所有镜像
docker images
# 只看镜像 ID(常用于批量删除等脚本)
docker images -q
# 查看悬空镜像(没有标签、不被任何容器引用的镜像)
docker images --filter "dangling=true"
# 查看 nginx 仓库的所有本地镜像
docker images nginx
默认输出包含 REPOSITORY(仓库名)、TAG(标签)、IMAGE ID(镜像 ID)、CREATED(创建时间)、SIZE(大小)。其中 IMAGE ID 默认截断显示,但通常前几位字符就足以在其他 Docker 命令中引用该镜像。
2.6 docker image inspect 指令
作用:用于查看一个或多个本地镜像的详细元数据,输出为 JSON 格式。
基本语法
bash
docker image inspect [OPTIONS] IMAGE [IMAGE...]
常用选项
| 选项 | 作用 |
|---|---|
-f, --format |
用 Go 模板自定义输出,提取特定字段,避免阅读大段 JSON |
--platform |
查看多平台镜像中指定平台(如 linux/amd64)的详细配置(需 API 1.49+) |
使用示例
bash
docker image inspect nginx:latest
输出中的关键字段
| 字段 | 含义 |
|---|---|
Id |
镜像的内容寻址 ID(SHA256) |
RepoTags |
指向该镜像的本地标签列表 |
RepoDigests |
从仓库拉取时记录的 manifest digest |
Architecture / Os |
镜像的目标平台 |
Config.Env / Config.Cmd |
默认环境变量与启动命令 |
RootFS.Layers |
组成镜像的每一层 digest |
Size |
镜像总大小(字节) |
2.7 docker tag 指令
作用:用于为本地镜像创建一个新的标签(别名)。它不会复制镜像数据,只是让同一个镜像 ID 多了一个可引用的名称,常用于在推送前将镜像"标记"为目标仓库的完整地址。
基本语法
bash
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
理解 TARGET_IMAGE 的组成很重要,因为它决定了镜像会被推送到哪里:
bash
[HOST[:PORT]/]NAMESPACE/REPOSITORY[:TAG]
| 组成部分 | 说明 | 默认值 |
|---|---|---|
| HOST | 仓库地址(如 registry.cn-hangzhou.aliyuncs.com) |
docker.io(Docker Hub) |
| NAMESPACE | 用户或组织名 | library(官方镜像命名空间) |
| REPOSITORY | 镜像仓库名 | 必填 |
| TAG | 版本标识 | latest |
常用示例
1. 为镜像 ID 打标签
bashdocker tag 0e5574283393 fedora/httpd:version1.0将短 ID 为
0e5574283393的本地镜像标记为fedora/httpd:version1.0。2. 为已有名称的镜像打新标签
bashdocker tag httpd:test fedora/httpd:version1.0.test源镜像指定了
httpd:test,目标标签为fedora/httpd:version1.0.test。3. 为推送到私有仓库做准备
bashdocker tag my-app:latest myregistryhost:5000/fedora/httpd:version1.0目标名称包含了仓库主机名和端口,这样后续
docker push才会推送到私有仓库而非 Docker Hub。4. 准备推送到 Docker Hub
bashdocker tag my-app yourusername/my-app:v1.0将本地
my-app标记为yourusername/my-app:v1.0,之后即可docker push yourusername/my-app:v1.0
2.8 docker rmi 指令
作用:rmi:r em oveimage。删除本地一个或多个镜像。只操作本地存储,不会影响远程仓库中的镜像
基本语法
bash
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. 省略标签会默认指向
latest
docker rmi centos实际尝试删除的是centos:latest。如果本地只有centos:7,会报No such image。删除前先用docker images确认实际标签,带上完整名称:标签最稳妥。
使用示例
bash
# 按名称和标签删除
docker rmi nginx:1.25
# 按镜像 ID 删除
docker rmi d583c3ac45fd
# 强制删除(处理多标签冲突等)
docker rmi -f d583c3ac45fd
# 批量删除多个镜像
docker rmi img1:tag img2:tag
2.9 docker save 指令
作用:用于将一个或多个本地镜像保存为 tar 归档文件,常用于离线环境部署或镜像备份。它保存的是完整的镜像,包含所有层、标签和元数据,后续可通过 docker load 完整恢复
基本语法
bash
docker save [OPTIONS] IMAGE [IMAGE...]
常用选项
| 选项 | 作用 |
|---|---|
-o, --output |
将归档写入文件,而不是输出到标准输出(STDOUT) |
--platform |
仅保存指定平台变体(如 linux/amd64)。默认会保存本地所有平台变体 |
使用示例
保存到文件(最常用)
bashdocker save -o nginx_latest.tar nginx:latest或使用重定向:
bashdocker save nginx:latest > nginx_latest.tar保存多个镜像到同一个归档
bashdocker save -o combined.tar image1:tag1 image2:tag2保存并压缩(节省空间)
bashdocker save myimage:latest | gzip > myimage_latest.tar.gz仅保存指定平台
bashdocker save --platform linux/amd64 -o alpine_amd64.tar alpine:latest
2.10 docker load 指令
作用:用于从 tar 归档文件(或标准输入)中加载镜像到本地,是 docker save 的逆向操作。它会恢复镜像及其标签,保留完整的层历史和元数据,是离线环境迁移镜像的标准方式。
基本语法
bash
docker load [OPTIONS]
常用选项
| 选项 | 作用 |
|---|---|
-i, --input |
从指定 tar 文件读取,而非标准输入 |
-q, --quiet |
减少加载过程的输出 |
--platform |
仅加载指定平台变体(如 linux/amd64),支持逗号分隔多个 |
使用示例
从文件加载(最常用)
bashdocker load -i nginx_latest.tar或使用重定向:
bashdocker load < nginx_latest.tar加载压缩归档
docker load能自动识别 gzip、bzip2、xz、zstd 等压缩格式,无需手动解压:
bashdocker load < myimage.tar.gz仅加载指定平台
当归档包含多平台镜像时,可只提取需要的架构:
bashdocker load -i multiarch.tar --platform=linux/amd64
2.11 docker history 指令
作用:用于查看本地镜像的构建历史,展示每一层是如何产生的
基本语法
bash
docker history [OPTIONS] IMAGE
常用选项
| 选项 | 作用 |
|---|---|
-H, --human |
以人类可读格式显示大小和时间(默认开启) |
--no-trunc |
不截断输出(完整显示命令和 ID) |
-q, --quiet |
仅显示镜像 ID |
--format |
自定义输出格式,支持 table、json 或 Go 模板 |
输出列的含义
执行 docker history nginx 会看到类似输出:
IMAGE:每层对应的镜像 ID
CREATED:该层的创建时间
CREATED BY :创建该层的命令(如
RUN、COPY指令)SIZE:该层占用的磁盘空间
COMMENT :注释信息(通常由
docker commit -m添加)
使用示例
bash
# 查看完整历史(不截断命令)
docker history --no-trunc nginx:latest
# 只看镜像 ID
docker history -q nginx:latest
# 自定义输出,只显示创建命令和大小
docker history --format "{{.CreatedBy}} {{.Size}}" nginx:latest
2.12 docker import 指令 之后补充
2.13 docker image prune 指令
作用:(prune: 修剪;削减;精简;)清理本地未被使用的镜像,是释放磁盘空间的常用命令。它和 docker rmi 的区别在于:rmi 需要你明确指定要删的镜像,而 prune 是批量清理"符合条件"的镜像,不需要逐个列出
基本语法
bash
docker image prune [OPTIONS]
默认行为(不带任何选项) :只清理 悬空镜像(dangling images) 。悬空镜像是指既没有标签(<none>:<none>),也没有被任何容器(包括已停止的容器)引用的镜像。这类镜像通常由重新构建同名标签等操作产生。
常用选项
| 选项 | 作用 |
|---|---|
-a, --all |
扩大清理范围:除了悬空镜像,还会删除所有没有被任何容器引用的镜像(包括有标签的) |
-f, --force |
跳过确认提示,直接执行 |
--filter |
按条件过滤,缩小清理范围 |
使用 -a 时务必谨慎 :它会把你有标签、但当前没有任何容器在用的镜像也删掉。如果你有停止状态的容器,它们引用的镜像不会 被删除(因为容器还存在就算"被引用")。但如果你手动 docker rm 了某个容器,它对应的镜像就可能变成"未被引用"的状态,从而被 -a 清理掉。
过滤器的用法
--filter支持until和label两类条件。按时间过滤(只清理创建超过指定时长的镜像):
bash# 只清理创建超过 24 小时的未使用镜像 docker image prune -a --filter "until=24h"
until的值可以是 Go 时长格式(如24h、10m),也可以是具体时间戳。按标签过滤:
bash# 只清理带有 deprecated 标签的镜像 docker image prune --filter "label=deprecated"多个不同键的过滤器之间是 AND 关系(必须同时满足),同一个键的多个值是 OR 关系(满足任一即可)。
