【Docker】镜像相关指令

1、镜像介绍

Docker 镜像(Image)是 Docker 容器的基础,可以把它理解为一个只读的模板,用来创建容器。

镜像 = 一个打包好的、不可变的文件系统快照,里面包含了运行某个应用所需的一切:

  • 操作系统基础(如 Ubuntu、Alpine)

  • 运行时环境(如 Python、Node.js、JRE)

  • 应用程序代码

  • 依赖库

  • 环境变量、启动命令等配置

关键特性

  1. 分层存储(Layered)

    镜像由多层(layer)叠加而成,每一层文件系统我们叫做一层 layer,每条 Dockerfile 指令生成一层。层可以复用和缓存,所以多个镜像能共享相同的底层,节省磁盘和传输时间 。

    构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层 的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可 见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到 一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么

  2. 只读

    镜像层不可修改。容器启动时会在最上面加一个可写层,所有改动都发生在可写层,镜像本身不变。

  3. 可分发

    镜像可以 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)不会存储两份,只会存储一份

作用:用于在 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 打标签

bash 复制代码
docker tag 0e5574283393 fedora/httpd:version1.0

将短 ID 为 0e5574283393 的本地镜像标记为 fedora/httpd:version1.0。

2. 为已有名称的镜像打新标签

bash 复制代码
docker tag httpd:test fedora/httpd:version1.0.test

源镜像指定了 httpd:test,目标标签为 fedora/httpd:version1.0.test。

3. 为推送到私有仓库做准备

bash 复制代码
docker tag my-app:latest myregistryhost:5000/fedora/httpd:version1.0

目标名称包含了仓库主机名和端口,这样后续 docker push 才会推送到私有仓库而非 Docker Hub。

4. 准备推送到 Docker Hub

bash 复制代码
docker 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)。默认会保存本地所有平台变体

使用示例

保存到文件(最常用)

bash 复制代码
docker save -o nginx_latest.tar nginx:latest

或使用重定向:

bash 复制代码
docker save nginx:latest > nginx_latest.tar

保存多个镜像到同一个归档

bash 复制代码
docker save -o combined.tar image1:tag1 image2:tag2

保存并压缩(节省空间)

bash 复制代码
docker save myimage:latest | gzip > myimage_latest.tar.gz

仅保存指定平台

bash 复制代码
docker 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),支持逗号分隔多个

使用示例

从文件加载(最常用)

bash 复制代码
docker load -i nginx_latest.tar

或使用重定向:

bash 复制代码
docker load < nginx_latest.tar

加载压缩归档

docker load 能自动识别 gzip、bzip2、xz、zstd 等压缩格式,无需手动解压:

bash 复制代码
docker load < myimage.tar.gz

仅加载指定平台

当归档包含多平台镜像时,可只提取需要的架构:

bash 复制代码
docker 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 关系(满足任一即可)。

相关推荐
feng_you_ying_li1 小时前
linux之网络层
linux·运维·网络
未来之窗软件服务1 小时前
Linux 运维日志删除的多种方式—东方仙盟
linux·运维·服务器·仙盟创梦ide·东方仙盟
卓豪终端管理1 小时前
IT 运维视角下的终端数据安全:能力框架与落地清单
运维
小雉系统2 小时前
BcoreOS实战:用一个升级包,让Rocky Linux跑进Debian服务器
linux·运维·服务器·debian
甜到心里的蛋糕2 小时前
从 QQ 机器人到 B 站 AI 运营:一套可复现的视频流水线踩坑实录
运维·人工智能·python·自动化·视频制作
QYR-分析2 小时前
26.2% 高增!场内及园区无人物流车,厂内短驳自动化的 L4 货运载体
运维·自动化
java_logo2 小时前
Docker 部署 DPanel:轻松搭建轻量容器管理平台
运维·docker·容器·podman·容器管理·dpanel·轩辕镜像
死磕音视频2 小时前
Open WebUI 入门:用 Docker 装上本地对话界面并连接 Ollama
docker·ollama·本地大模型·open webui
时间售卖铺2 小时前
Oracle DQL精髓:从基础到高级实战
运维·数据库·云原生·oracle