目录
[1. Docker 镜像是什么](#1. Docker 镜像是什么)
[2. 镜像命令详解](#2. 镜像命令详解)
[2.1 docker images](#2.1 docker images)
[2.2 docker tag](#2.2 docker tag)
[2.3 docker pull](#2.3 docker pull)
[2.4 docker push](#2.4 docker push)
[2.5 docker rmi](#2.5 docker rmi)
[2.6 docker save](#2.6 docker save)
[2.7 docker load](#2.7 docker load)
[2.8 docker image inspect](#2.8 docker image inspect)
[2.9 docker history](#2.9 docker history)
[2.10 docker image prune](#2.10 docker image prune)
[2.11 docker build](#2.11 docker build)
[2.12 docker import](#2.12 docker import)
[3. 镜像实操演示:](#3. 镜像实操演示:)
[3.1 查找、拉取镜像:](#3.1 查找、拉取镜像:)
[3.2 镜像详情查看和打标推送:](#3.2 镜像详情查看和打标推送:)
[3.3 运行容器和删除镜像](#3.3 运行容器和删除镜像)
[4. 综合练习:离线迁移镜像(值得熟练掌握)](#4. 综合练习:离线迁移镜像(值得熟练掌握))
[5. 综合练习:镜像存储的压缩与共享](#5. 综合练习:镜像存储的压缩与共享)
正文开始:
1. Docker 镜像是什么
Docker 镜像是什么:
-
Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。
-
我们可以把 Docker image 理解成一个模板, 可以通过这个模板实例化出来很多容器。
-
image 里面是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统
每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker镜像中每一层文件系统都是只读的。
构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。
镜像生活案例:
镜像相当于我们 java 或者 C++中的类,相当于一个模板,可以很方便的构建出来不同的对象。

镜像分层的生活案例:
我们以日常的地板为例,开发商的房子提供给用户的时候一般是做好了地暖,而这些地暖其实是一层一层添加的,最底层的钢筋水泥层,然后添加保温层,采暖管,再铺设水泥层,到最后交付的时候家家户户都是水泥面,这一层一般是不可修改的,最上层用户一般会再铺设商木地板或者地板砖每家每户的选择不一样,相当于我们镜像的容器层。

为什么需要镜像:
在部署应用时,通过手工或写一些脚本的方式进行部署。这样部署面临问题就是云端和本地环境一致问题。用户为每个应用打包过程比较繁琐,需要配置和给中修改等操作,非常费劲。
然而,Docker 镜像就是为了解决这个小小的打包功能,突然一夜之间成名。那么,你可能说 Docker 镜像就是个压缩包,是的,你猜对了,它就像一个压缩包文件。它是如何解决 Paas 时代所面临的云端和本地一致性问题?很简单,它是把一个镜像制作成一个完整的操作系统所有文件和对应的目录结构,这样的压缩包是跟你本地和测试环境用的操作系统一摸一样。
docker****最大的贡献就是定义了容器镜像的分层的存储格式,docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。
docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便的将其用于个人用途或与其他 Docker 用户公开共享。
2. 镜像命令详解
2.1 docker images
- 功能:列出本地镜像。
- 语法:
bash
docker images [OPTIONS] [REPOSITORY[:TAG]]
- 别名:
bash
docker image ls, docker image list
- 关键参数:
-
**-a :**列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
-
**--digests :**显示镜像的摘要信息;
-
**-f :**显示满足条件的镜像;
-
**--format :**指定返回值的模板文件;
-
**--no-trunc :**显示完整的镜像信息;
-
**-q :**只显示镜像 ID。
- 样例
bash
#列出本地全部镜像
docker images
#列出本地镜像中 REPOSITORY 为 ubuntu 的镜像列表。
docker images ubuntu
2.2 docker tag
- 功能:标记本地镜像,将其归入某一仓库。
- 语法
bash
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
- 别名
bash
docker image tag
- 样例
bash
docker tag ubuntu:22.04 myregistry.com/myubuntu:22.04
2.3 docker pull
可参考镜像仓库实操一文中的使用演示。
2.4 docker push
可参考镜像仓库实操一文中的使用演示。
2.5 docker rmi
- 功能:删除镜像。
- 语法
bash
docker rmi [OPTIONS] IMAGE [IMAGE...]
- 别名
bash
docker image rm, docker image remove
- 关键参数:
1. **-f :**强制删除;
**2. --no-prune :**不移除该镜像的过程镜像,默认移除;
- 样例

再查看发现本地以及删除了:

还可通过REPOSITORY和TAG进行删除:

2.6 docker save
- 功能:将指定镜像保存成 tar 归档文件。
- 语法
bash
docker save [OPTIONS] IMAGE [IMAGE...]
- 别名
bash
docker image save
- 关键参数
1. **-o :**输出到的文件。
- 样例

2.7 docker load
- 功能:导入使用 docker save 命令导出的镜像。
- 语法
bash
docker load [OPTIONS]
- 别名
bash
docker image load
- 关键参数
1. **--input , -i :**指定导入的文件,代替 STDIN。
**2. --quiet , -q :**精简输出信息。
- 样例


2.8 docker image inspect
- 功能:查看镜像详细信息
- 语法
bash
docker image inspect [OPTIONS] IMAGE [IMAGE...]
- 注意事项:docker inspect 会自动检查是镜像还是容器然后显示相关信息
- 样例
bash
#查看镜像详细信息
docker images inspect nginx:1.23.3
2.9 docker history
- 功能:显示镜像历史。
- 语法
bash
docker history [OPTIONS] IMAGE
- 别名
bash
docker image history
- 关键参数
-
**-H , --human :**大小和日期采用人容易读的格式展现
-
**--no-trunc :**显示全部信息,不要隔断;
-
**-q, --quiet:**只显示镜像 id 信息;
- 样例

2.10 docker image prune
- 功能:删除不使用的镜像。
- 语法
bash
docker image prune [OPTIONS]
- 关键参数
-
**-a , --all :**删除全部不使用的镜像;
-
**--filter filter:**指定过滤条件;
-
**-f, --force :**不提示是否删除;
2.11 docker build
功能:docker build命令用于使用 Dockerfile 创建镜像。
语法:
bash
docker build [OPTIONS] PATH | URL | -
关键参数:
-
**--build-arg=\[\] :**设置镜像创建时的变量;
-
**-f :**指定要使用的 Dockerfile 路径;
-
**--label=\[\] :**设置镜像使用的元数据;
-
**--no-cache :**创建镜像的过程不使用缓存;
-
**--pull :**尝试去更新镜像的新版本;
-
**--quiet, -q :**安静模式,成功后只输出镜像 ID;
-
**--tag, -t:**镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
-
**--network:**默认 default。在构建期间设置 RUN 指令的网络模式
2.12 docker import
功能:从归档文件中创建镜像
语法:
bash
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
别名
docker image import
关键参数:
-
**-c :**应用 docker 指令创建镜像;
-
**-m :**提交时的说明文字;
样例:

3. 镜像实操演示:
3.1 查找、拉取镜像:


3.2 镜像详情查看和打标推送:

进入/data/var/lib/docker/image/目录,注意存储位置是修改后的

查看镜像的详细信息:
bash
docker image inspect busybox:1.36.0
bash
root@hcss-ecs-c91e:/data/var/lib/docker/image# docker image inspect busybox:1.36.0
[
{
"Id": "sha256:9e2bbca079387d7965c3a9cee6d0c53f4f4e63ff7637877a83c4c05f2a666112",
"RepoTags": [
"busybox:1.36.0",
"lih2026/maxhou:v1.0"
],
"RepoDigests": [
"busybox@sha256:9e2bbca079387d7965c3a9cee6d0c53f4f4e63ff7637877a83c4c05f2a666112",
"lih2026/maxhou@sha256:9e2bbca079387d7965c3a9cee6d0c53f4f4e63ff7637877a83c4c05f2a666112"
],
"Created": "2023-05-11T22:48:43.533857581Z",
"Config": {
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"sh"
]
},
"Architecture": "amd64",
"Os": "linux",
"Size": 7581664,
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:1f1d08b81bbe3cb8d730d2e163d6737b4352192712b1f1548720dc224f6cac06"
]
},
"Metadata": {
"LastTagTime": "2026-10-30T08:22:23.728272293Z"
},
"Descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"digest": "sha256:9e2bbca079387d7965c3a9cee6d0c53f4f4e63ff7637877a83c4c05f2a666112",
"size": 2295
},
"Identity": {
"Pull": [
{
"Repository": "docker.io/library/busybox"
}
]
}
}
]
查看分层:


3.3 运行容器和删除镜像

从另一个xshell窗口可发现容器已经跑起来了:

exit后可发现容器已经没有在运行了:

通过该命令可以找到这个exit的容器:

镜像的删除:可以根据id和名字删除,对于使用的镜像需要先清理容器再删除镜像
该命令下只是去除标签并没有删除我们实践的空间:

4. 综合练习:离线迁移镜像(值得熟练掌握)
在Ubuntu的环境下保存一个镜像,把它拷贝到CentOS的服务器上加载运行它。值得注意的是像之前文章中介绍的不管是容器命令还是镜像命令,这些命令都属于Docker,所以在不同操作系统环境下执行这些命令都是一样的。
- 在Ubuntu环境下,把一个镜像打包成tar包。

拉取一个镜像:



2.在另外的环境下(CentOS):
先检查该环境有没有安装docker:
bash
docker version


注意:下图是在Ubuntu环境下的操作:

此时,即可在CentOS环境下看到我们需要的tar包:

如下图,镜像迁移成功:

交互式启动该镜像成为容器:

5. 综合练习:镜像存储的压缩与共享
拉取 nginx 镜像,如果本地没有,镜像是从仓库拉取,如果有会提示镜像已经存在,并且是最新的。
Docker images 查看本地镜像,可以看到该镜像为 142Mb

从上面看到 nginx 为 1.21.4 的大小是 140 多 MB,但是我们从 docker hub 上查看可以看到镜像是 50 多 MB,说明发生了压缩,因为仓库到本地需要走网络,所以文件越小越好

把一个镜像打多个 tag,然后同时推送仓库,可以看到是说层已经存在,不会重复存储
bash
root@139-159-150-152:/data/maxhou# docker tag nginx:1.22.1 maxhou/mybitnginx:1.22.1
root@139-159-150-152:/data/maxhou# docker tag nginx:1.22.1 maxhou/mybitnginx:1.22.2
root@139-159-150-152:/data/maxhou# docker tag nginx:1.22.1 maxhou/mybitnginx:1.22.3
root@139-159-150-152:/data/maxhou# docker tag nginx:1.22.1 maxhou/mybitnginx:1.22.4
root@139-159-150-152:/data/maxhou# docker push maxhou/mybitnginx -a
The push refers to repository [docker.io/maxhou/mybitnginx]
9543dec06aa8: Layer already exists
ccf4f419ba49: Layer already exists
21f8452ebfb1: Layer already exists
25bbf4633bb3: Layer already exists
a4f34e6fb432: Layer already exists
3af14c9a24c9: Layer already exists
1.22.1: digest:
sha256:9081064712674ffcff7b7bdf874c75bcb8e5fb933b65527026090dacda3
6ea8b size: 1570
9543dec06aa8: Layer already exists
ccf4f419ba49: Layer already exists
21f8452ebfb1: Layer already exists
25bbf4633bb3: Layer already exists
a4f34e6fb432: Layer already exists
3af14c9a24c9: Layer already exists
1.22.2: digest:
sha256:9081064712674ffcff7b7bdf874c75bcb8e5fb933b65527026090dacda3
6ea8b size: 1570
9543dec06aa8: Layer already exists
ccf4f419ba49: Layer already exists
21f8452ebfb1: Layer already exists
25bbf4633bb3: Layer already exists
a4f34e6fb432: Layer already exists
3af14c9a24c9: Layer already exists
添加一个新的镜像到我们的仓库的时候,如果 docker hub 发现已经有了是 mount 的,不是从本地推上去的
bash
root@139-159-150-152:/data/maxhou# docker tag nginx:1.16.1 maxhou/mybitnginx:1.16.1
root@139-159-150-152:/data/maxhou# docker push maxhou/mybitnginx:1.16.1
The push refers to repository [docker.io/maxhou/mybitnginx]
c23548ea0b99: Mounted from library/nginx
82068c842707: Mounted from library/nginx
c2adabaecedb: Mounted from library/nginx
1.16.1: digest:
sha256:2963fc49cc50883ba9af25f977a9997ff9af06b45c12d968b7985dc1e92
54e4b size: 948