Docker镜像核心作战手册:镜像命令全解析+离线迁移实战+压缩共享储存,打造无缝跨环境部署!
本篇摘要
本文围绕Docker核心操作展开,涵盖镜像本质与分层机制、常用命令(如rmi/save/load/prune等)详解、BusyBox实战演练、离线迁移方法及镜像压缩共享存储原理。
欢迎拜访: 点击进入博主主页
本篇主题: Docker之镜像命令全解析+离线迁移实战+压缩共享储存全方位解析
制作日期: 2025.09.19
隶属专栏: 点击进入所属Docker专栏
一.认识Docker镜像
Docker镜像本质与定义
- Docker image本质是
只读文件
,包含文件系统、源码、库文件、依赖、工具
等运行应用所需的文件。 - 可将Docker image理解为
模板
,能实例化出多个容器
。
比如: 像类似Java或C++中的类(模板),可方便构建不同对象(容器):
- image由一层一层文件系统(Union FS联合文件系统)组成,可将多层目录挂载成虚拟文件系统。
镜像分层与权限
- 每一层文件系统叫一层layer,联合文件系统对单层可设置只读、读写、写出三种权限,但Docker镜像中每层默认都是
只读
。 - 构建镜像时从基础操作系统开始,每次构建操作相当于新增一层文件系统,层层叠加,上层修改会覆盖底层同位置可见性,
使用时看到的是整体
,看不到内部层数与单层修改细节。
如下:
为什么需要镜像?
- 部署痛点:手工或脚本部署应用存在云端和本地环境一致问题,且应用打包过程繁琐、操作费劲。
- 镜像本质与作用:Docker 镜像类似
压缩包
,把操作系统文件和目录结构制成完整压缩包,解决云端和本地一致性难题。 - Docker 贡献:定义容器镜像分层存储格式,基于联合文件系统(UnionFS),能充分利用共享层并减少存储空间占用。
- 镜像优势:提供便捷的打包应用程序和预配置服务器环境的方式,便于个人使用和公开共享。
Docker镜像技术缺点
首先要知道Docker屏蔽了底层技术的差别,如果是生产和研发环境是不同的话,需要配置,首先基于它这个分层结构,除了上层应用,还会包括对的比如操作系统,占用更大内存
;其次就是如果要配置某个环境,还需要往下层去找,影响性能
。
总结下:
Docker的镜像简单理解成一种文件系统,类似压缩包,然后可以直接在不同地方,用不同的这种压缩包,直接打包好运行即可,如果想应用不同的环境,可以对这个镜像进行配置,基于镜像结构,操作起来也是非常轻松,大多数都是有不同版本环境的,可以直接拉下来用。
二.镜像命令介绍
基础命令概览:
命令 | 别名 | 功能 | 备注 |
---|---|---|---|
docker images | docker image ls/docker image list | 列出本地镜像 | 必须掌握 |
docker tag | docker image tag | 给镜像打标签,可用于推送镜像仓库 | 必须掌握 |
docker pull | docker image pull | 从镜像仓库拉取镜像 | 和镜像仓库命令相同,也可以归类为镜像操作命令,必须掌握,参考镜像命令此处不赘述 |
docker push | docker image push | 推送镜像到仓库 | 和镜像仓库命令相同,也可以归类为镜像操作命令必须掌握,参考镜像命令此处不赘述 |
docker rmi | docker image rm/docker image remove | 删除本地镜像 | 必须掌握 |
docker build | docker image build | 通过 dockerfile 制作镜像 | 必须掌握 |
docker save | docker image save | 将指定镜像保存成 tar 归档文件 | 必须掌握 |
docker load | docker image load | 导入使用 docker save 命令导出的镜像 | 必须掌握 |
docker image inspect | 查看镜像详细信息 | 必须掌握 | |
docker history | docker image history | 查看镜像历史 | 必须掌握 |
docker import | docker image import | 从归档文件 docker export 中创建镜像。 | |
docker image prune | 删除不使用的镜像 |
1. Docker rmi 命令详解
功能:
docker rmi
命令用于删除 Docker 镜像(id
或者库名+tag
)。
语法:
docker rmi [OPTIONS] IMAGE [IMAGE...]
别名:
docker image rm
docker image remove
关键参数:
-f
: 强制删除镜像--no-prune
: 不移除该镜像的过程镜像(默认情况下会移除)
使用场景:
当需要清理不再使用的 Docker 镜像以释放磁盘空间时,可以使用此命令。可以同时删除一个或多个镜像。
注意事项:
- 删除镜像前应确保没有容器正在使用该镜像。
- 使用
-f
参数可以强制删除正在被使用的镜像。 - 默认情况下会清理相关联的悬空镜像。
下面演示下:
当没有容器正在使用这个镜像的时候,通过库名+tag
以及id
来删除:
当有容器使用的时候再进行删除:
1·先删除正在使用,或者使用过但停止,而存在的容器:
- 默认如果运行,本地没有这个镜像就会去对应的Docker hub对应仓库拉取,然后发现这里不能直接删除这个镜像,因为有容器正在使用,需要先把对应容器干掉。
- 删除还存在的容器。
- 删除此镜像成功。
2·直接强制删除这个镜像(如果有在使用的容器,一般不建议直接):
- 直接删除成功。
小结下:
这里我们从hub中拉取过来的镜像,如果有容器用了这个镜像,直接删除是删除不了的,要么删除完使用的容器然后再删镜像,要么强制删镜像(
docker ps -a 查看对应使用的容器,docker images 看下镜像
)。
2.Docker save与load命令详解
docker save:
- 功能:将指定镜像保存成 tar 归档文件,方便镜像的备份、传输等操作。
- 语法:
docker save [OPTIONS] IMAGE [IMAGE...]
- 别名:
docker image save
- 关键参数:
-o
,用于指定输出到的文件。
docker load:
- 功能:导入使用
docker save
命令导出的镜像,实现镜像的恢复或迁移。 - 语法:
docker load [OPTIONS]
- 别名:
docker image load
- 关键参数:
--input, -i
:指定导入的文件,代替 STDIN。
演示操作:
- 这里是把俩打包成一个tar,也可以一个个打包。
- 删除对应的镜像。
- 重新加载。
- -q选项就是更加简单输出。
3.Docker history命令详解
docker history:
- 功能:显示镜像历史(相当于看镜像制作的那些层)。
- 语法:
docker history [OPTIONS] IMAGE
- 别名:
docker image history
- 关键参数:
-H, --human
:大小和日期采用人容易读的格式展现--no-trunc
:显示全部信息,不要隔断-q, --quiet
:只显示镜像 id 信息
演示:
简单介绍下:
- IMAGE:表示镜像的 ID 或者部分 ID。例如
eeb6ee3f44bd
就是某层镜像的 ID,<missing>
表示对应的镜像层信息在本地可能缺失或者无法完整获取(这种情况在镜像构建过程中因各种原因导致部分元数据丢失等情况时可能出现)。 - CREATED:显示镜像层创建的时间,这里所有显示的层都是 3 年前创建的。
- CREATED BY:描述了创建该镜像层的 Dockerfile 指令。比如
/bin/sh -c #(nop) CMD ["/bin/bash"]
表示使用 shell 执行CMD ["/bin/bash"]
指令,设置容器启动时默认执行的命令为/bin/bash
;/bin/sh -c #(nop) LABEL org.label - schema.sc...
是设置了镜像的标签信息;/bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4...
表示将指定的文件添加到镜像中(也就是对应容器run时候后缀启动的
)。 - SIZE:表示该镜像层的大小。例如
204MB
就是对应添加文件操作产生的镜像层大小,0B
表示某些指令(如设置默认命令、设置标签等)没有增加镜像的额外数据大小。 - COMMENT:此列在此次输出中均为空,一般用于记录关于该镜像层构建的注释信息,可在构建镜像时通过
docker build
命令的--label
等选项添加相关注释。
4.Docker image prune命令详解
功能:
删除不使用的镜像(默认删除悬空镜像)。
语法:
docker image prune [OPTIONS]
关键参数:
-a, --all
:删除全部不使用的镜像(包括悬空镜像和未被容器使用的镜像)。--filter filter
:指定过滤条件,例如按时间过滤,id,name
等等。-f, --force
:不提示是否删除,直接执行删除操作。
操作步骤:
-
基本用法:
执行以下命令可以删除所有悬空镜像(即没有被任何容器引用的镜像):docker image prune
执行该命令后,Docker 会提示你是否确认删除,输入
y
即可执行删除操作。 -
强制删除:
如果你不想看到确认提示,可以直接使用-f
或--force
参数进行强制删除:docker image prune -f
-
删除所有不使用的镜像:
若要删除所有不使用的镜像(包括悬空镜像和未被容器使用的镜像
),可以使用-a
或--all
参数:docker image prune -a
同样,加上
-f
参数可以强制删除而不提示:docker image prune -a -f
-
使用过滤条件:
你可以使用--filter
参数来指定过滤条件。例如,删除创建时间超过 24 小时的悬空镜像:docker image prune -a --filter "until=24h"
这里的
until=24h
表示只删除创建时间在 24 小时之前的镜像。
仔细理解下:
1·什么是悬空镜像?
那些没有被任何标签(Tag)引用的镜像
。换句话说,这些镜像是没有被分配名称的中间构建产物或未被使用的镜像层
。它们在 docker images命令的输出中通常显示为 <none>作为 REPOSITORY 和 TAG
(如果一个镜像存在,然后又创建了一个和它名字或者标签之类相同的,其实把它覆盖,然后原来的镜像变成悬空镜像)。
其实我们docker images看到的都不是悬空镜像(如果一个镜像内部结构被改变了,然后它就不能正常实例化出容器,当删除这个镜像,只是移除了标签,这个镜像就变成悬空镜像了
)(如果有容器正在使用这个镜像,此时把这个镜像移除,这个镜像就变成悬空镜像
)—>需要先移除正在使用镜像的容器,才能删镜像。
可以用它来查看悬空镜像:
docker images -f "dangling=true"
清理就用:
docker image prune
2.什么叫未被容器使用的镜像?
-
是指那些
没有被任何正在运行或已停止的容器使用的镜像
。这些镜像可能仍然有标签,但没有任何容器依赖于它们。 -
通常在 docker images输出中有明确的 REPOSITORY和 TAG。
-
镜像打标签相当于是对镜像引用。
比如docker ps -a
看下所有容器,然后发现是这样的对应的镜像就是已经停用停用容器使用的镜像:
- 至于查看运行的容器可以用 只
ps
查看。
3.某镜像的容器是和镜像一种什么关系?
当你执行 docker run <镜像名>时,Docker 会:
-
基于该镜像的只读层 创建一个新的容器。
-
在最上层添加一个可写层(容器层),用于运行时写入数据(比如日志、临时文件等来通知对应镜像,并记录)。
-
启动容器内的主进程(比如 nginx、bash 等),使容器进入运行状态。
这里就是一个镜像(层状结构)根据它的只读层来创建一个容器添加到对应的可写层(用来容器与镜像交互),一个镜像可以搞多个容器,它们都是隔离开的容器,各自在各自的容器中有序运行。
总的来说就是:
运行镜像生成容器,是基于镜像的只读层,创建一个带有可写层的轻量级、隔离的运行时实例(容器)。
三.基于busybox演示镜像容器运行实战操作
首先对busybox镜像进行拉取:
检查相关信息:
打个标签方便后续测试:
- 这里可以根据对应的仓库进行tag操作,推送,这里就不演示了。
运行容器,进行简单操作:
退出容器,查看状态:
进行对应的镜像删除:
- 发现删除的是标签不是镜像。
再次删除镜像:
- 因为有个停止的容器还在用这个镜像。
下面删除对应的容器,在进行删除镜像:
- 对应容器被删除,镜像也没了。
小结下:
如果我们给对应镜像起了标签也就是别名,那么可以有很多,就相当于是对同一个镜像的引用,当移除镜像的时候我们移除的先是标签,最后才能是对应真正镜像(而且是最后一次才会报有容器正在使用这个镜像的错误)。
四.镜像离线迁移
理解:
把 Docker 的 镜像(Images) 从一台电脑(或服务器)复制到另一台,不用联网(比如内网、隔离环境、无外网的服务器)。
为什么需要?
-
目标机器 不能上网(比如内网、安全环境)
-
想快速迁移镜像,不用重新拉取(比如 docker pull)
-
离线环境部署应用(比如公司内网、政府、军队等)
演示流程:
两个不同系统进行交互docker进行(采取压缩包形式):
将pull下来的压缩包进行发送另一个环境主机:
另一端接受到进行解包:
- 成功运行。
- 成功删除。
五.镜像压缩与共享
- 从官网仓库pull 下来镜像,发现占用内存少于官网仓库对应镜像内存。
这是因为在仓库都是压缩态,而pull下来自动解压了。
那为什么要压缩存放呢?
1·云端存储以压缩态可以减少内存,更有利于节省空间。
2.以压缩形式发送,有利于节省带宽,传递的快。
然后我们试下push上去会不会也压缩:
- 发现也是以压缩态呈现。
看下如果是push仅hub对应仓库多份同镜像,然后打上不同标签传上去,是如何存储的:
进行打标签开始向仓库进行push:
进行推送:
- 这里发现本地要推送的对应的标签对应的镜像(也就是id)在hub总仓库就是直接存在的,因此不用网路中push,这节在对应仓库起个标签,挂载一下就好了。
- 符合预期。
下面总结下:
对于镜像在docker仓库是压缩存储的,发送到本地自动解压缩,而且当我们在对应的自己的docker仓库进行push镜像的时候,docker端先去对应的总仓库看是否有对应镜像,如果有的话,就直接打个标签(相当于定位,不新开空间存储,然后标签不同对应的镜像id都是同的);其次就是对于一些docker操作是跨平台运用,不受影响的。
六.本篇小结
通过镜像基础理论、命令实践、容器关联及离线部署等全流程解析,掌握Docker镜像管理核心技术,理解其分层存储、高效复用及跨环境迁移的核心价值。