Docker 镜像知识总结
Docker 镜像知识总结
一、Docker 镜像概述
- 定义:类似虚拟机镜像,是只读模板,可包含基础操作系统环境及特定软件(如 Apache),是创建 Docker 容器的基础
- 获取途径:本地不存在所需镜像时,Docker 默认从 Docker Hub 公共镜像源下载,也可从阿里云、DaoCloud 等其他公共仓库下载,或自行创建
- 核心特性:支持版本管理和增量文件系统,便于创建、更新和使用
二、Docker 镜像核心操作
1. 列出镜像列表
-
命令:
docker images
-
输出字段说明:
字段 含义 REPOSITORY 镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像 ID CREATED 镜像创建时间 SIZE 镜像大小 -
示例:
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest dabbfbe0c57b 5 months ago 144MB
2. 搜索镜像
- 两种方式:
- 访问 Docker Hub 网站(https://hub.docker.com/)在线搜索
- 使用命令搜索,命令:
docker search [镜像名]
(如docker search httpd
)
- 输出字段说明:
- NAME:镜像仓库源的名称
- DESCRIPTION:镜像的描述
- OFFICIAL:是否为 Docker 官方发布
- STARS:类似 GitHub 的 “星标”,表示受欢迎程度
- AUTOMATED:是否为自动构建
3. 获取镜像
- 触发方式:本地使用不存在的镜像时,Docker 自动下载;也可预先用命令下载
- 命令:
docker pull [镜像名]
(如docker pull httpd
,默认下载latest
标签版本) - 示例:
[root@docker ~]# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
...
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
4. 为镜像添加标签
- 作用:方便后续使用特定镜像,标签类似 “链接”,不创建新镜像
- 命令:
docker tag [原镜像名:原标签] [新镜像名:新标签]
(如docker tag httpd:latest myhttpd:latest
) - 特性:新标签镜像与原镜像的 IMAGE ID 一致,指向同一镜像文件
5. 查看镜像历史
- 作用:了解镜像的构建过程和历史操作,便于自定义镜像时排查问题
- 命令:
docker history [镜像名/镜像ID]
(如docker history httpd
) - 输出内容:包含各构建步骤的创建时间、执行命令、大小等信息
6. 删除镜像
- 核心规则:镜像被使用时无法删除,可通过镜像名称标签或镜像 ID 删除
- 三种场景:
- 通过镜像名称删除:命令
docker rmi [镜像名:标签]
(如docker rmi httpd
),会先移除标签,再删除镜像文件(无其他标签引用时) - 通过镜像 ID 删除:若镜像无其他标签,命令
docker rmi [镜像ID]
(如docker rmi dabbfbe0c57b
)可直接删除 - 强制删除多标签镜像:镜像被重新打标签后无法直接删除,需加
-f
(强制)选项,命令docker rmi -f [镜像ID]
,会一并删除镜像及所有关联标签
- 通过镜像名称删除:命令
7. 清理镜像
- 作用:清理系统遗留的临时镜像文件和未使用的镜像,释放存储空间
- 命令:
docker image prune [选项]
- 常用选项:
-a
/--all
:删除所有无用镜像(含非临时镜像)-f
/--force
:强制删除,无需确认
- 示例:
docker image prune -f
(清理临时镜像,输出 “Total reclaimed space: 0B” 表示无空间可回收)
8. 导出镜像
- 作用:将镜像打包为压缩包,便于在其他主机上导入使用
- 命令:
docker image save [镜像名] > [压缩包名]
(如docker image save httpd > cy-httpd.tar.gz
) - 示例:
[root@docker ~]# docker image save httpd > cy-httpd.tar.gz
[root@docker ~]# ll -h cy-httpd.tar.gz
-rw-r--r-- 1 root root 141M Jun 14 18:49 cy-httpd.tar.gz
9. 导入镜像
- 前提:需先准备镜像压缩包(建议先删除本地原有同名镜像以验证效果)
- 命令:
docker image load -i [压缩包名]
(如docker image load -i cy-httpd.tar.gz
) - 示例:
[root@docker ~]# docker image load -i cy-httpd.tar.gz
...
Loaded image: httpd:latest
10. 查看镜像详细信息
- 作用:获取镜像的完整信息,包括制作者、架构、各层摘要等(输出为 JSON 格式)
- 命令:
- 查看全部信息:
docker image inspect [镜像名:标签]
(如docker image inspect centos:7
) - 查看指定字段信息:加
-f
选项,如docker image inspect -f {{".Architecture"}} centos:7
(查看架构,输出 “amd64”)、docker image inspect -f {{".Os"}} centos:7
(查看操作系统,输出 “linux”)
- 查看全部信息:
Docker镜像相关操作:
列出镜像列表:
使用Docker images来列出本地主机上的镜像:
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 65005131d37e 7 weeks ago 117MB
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
搜索镜像:
从Docker Hub网站来搜索镜像,Docker Hub网址为: https://hub.docker.com/。也可以使用 docker search命令来搜索镜像。比如我们需要一个httpd的镜像。我们可以通过docker search命令搜索 httpd来寻找适合我们的镜像
[root@docker ~]# docker search httpd
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否docker官方发布
STARS: 类似Github 里面的star,表示点赞、喜欢的意思
AUTOMATED: 自动构建
获取镜像
当我们在本地主机上使用一个不存在的镜像时,Docker就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用docker pull命令来下载它。而镜像可以通过Docker Hub官方获取,或者通过国内的阿里云、DaoCloud等厂商所提供的镜像仓库下载
[root@docker ~]# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
a2abf6c4d29d: Already exists
dcc4698797c8: Pull complete
41c22baa66ec: Pull complete
67283bbdd4a0: Pull complete
d982c879c57e: Pull complete
Digest: sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
使用tag命令添加镜像标签
为了方便在后续工作中使用特定镜像,可以使用docker tag命令来作为本地镜像任意添加新的标签。
例如:添加一个myhttpd:latest镜像标签
[root@docker ~]# docker tag httpd:latest myhttpd:latest
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 65005131d37e 7 weeks ago 117MB
myhttpd latest 65005131d37e 7 weeks ago 117MB
之后就可以使用myhttpd:latest来表示这个镜像了,通过查看我们可以发现,myhttpd:latest镜像的
ID与httpd:latest是完全一致的,他们实际上指向了同一个镜像文件,只是别名不同而已。docker tag命令添加的标签实际上起到了类似链接的作用
镜像历史
可以使用docker history查看镜像的构建历史信息,因为在使用docker时经常会自己构建一些我们所
需要的镜像,所以要会查看镜像的构建信息
[root@docker ~]# docker history httpd
IMAGE CREATED CREATED BY SIZE COMMENT
65005131d37e 7 weeks ago CMD ["httpd-foreground"] 0B buildkit.dockerfile.v0
<missing> 7 weeks ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 7 weeks ago COPY httpd-foreground /usr/local/bin/ # buil… 138B buildkit.dockerfile.v0
<missing> 7 weeks ago STOPSIGNAL SIGWINCH 0B buildkit.dockerfile.v0
<missing> 7 weeks ago RUN /bin/sh -c set -eux; savedAptMark="$(a… 32.5MB buildkit.dockerfile.v0
<missing> 7 weeks ago ENV HTTPD_PATCHES= 0B buildkit.dockerfile.v0
<missing> 7 weeks ago ENV HTTPD_SHA256=58b8be97d9940ec17f7656c0c6b… 0B buildkit.dockerfile.v0
<missing> 7 weeks ago ENV HTTPD_VERSION=2.4.65 0B buildkit.dockerfile.v0
<missing> 7 weeks ago RUN /bin/sh -c set -eux; apt-get install --… 5.65MB buildkit.dockerfile.v0
<missing> 7 weeks ago WORKDIR /usr/local/apache2 0B buildkit.dockerfile.v0
<missing> 7 weeks ago RUN /bin/sh -c mkdir -p "$HTTPD_PREFIX" && … 0B buildkit.dockerfile.v0
<missing> 7 weeks ago ENV PATH=/usr/local/apache2/bin:/usr/local/s… 0B buildkit.dockerfile.v0
<missing> 7 weeks ago ENV HTTPD_PREFIX=/usr/local/apache2 0B buildkit.dockerfile.v0
<missing> 7 weeks ago # debian.sh --arch 'amd64' out/ 'trixie' '@1… 78.6MB debuerreotype 0.16
删除镜像
(1)删除镜像时,后面接镜像名称
可以使用docker rmi或者docker image rm将我们用不到的镜像删除,如果镜像被使用,那么无法删除镜像。删除的镜像可以是镜像名称标签或者是镜像ID
[root@docker ~]# docker rmi httpd
Untagged: httpd:latest
Untagged: httpd@sha256:027c678f36d3cd3dd2b44ad1e963e81be66f9eba065381c1126d3019fffeb01a
删除镜像时,后面接镜像ID。如果该镜像没有被打标签,可直接删除
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myhttpd latest 65005131d37e 7 weeks ago 117MB
[root@docker ~]# docker rmi 65005131d37e
Untagged: myhttpd:latest
Deleted: sha256:65005131d37e90347c3259856d51f35c505d260c308f2b7d0fc020a841dd1220
Deleted: sha256:4426c8d831496e681992983c2830799b357753f2985e3284141fcba9efae69fb
Deleted: sha256:a58005c0fd40b9908468daa86fb9f4d9cecf5de5898a4872447dd581e708be3e
Deleted: sha256:b607ebcb3913ea521cb132bccc6e14bc928284a9a5d2b2edce2cc3cb88425486
Deleted: sha256:85ae7b63eeeb6d71b70102d1582367b731ce74684ae850e26fce88b6c7ee024c
Deleted: sha256:aecbd7614fe1249afadeb1ff8e34a674ae1eabc0a9e7e77634771587ec52572a
Deleted: sha256:daf557c4f08e0cb77b2af2a08d8bca4f333cf408d88191911715e6f393eca215
如果该镜像被重新打了标签,是无法删除的,那么想一并删除该镜像和此镜像设置的标签后的镜像,可在后面跟-f选项,该选项是强制的意思
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 41f689c20910 6 weeks ago 192MB
httpd latest 65005131d37e 7 weeks ago 117MB
myhttpd latest 65005131d37e 7 weeks ago 117MB
[root@docker ~]# docker rmi 65005131d37e
Error response from daemon: conflict: unable to delete 65005131d37e (must be forced) - image is referenced in multiple repositories
[root@docker ~]# docker rmi 65005131d37e -f
Untagged: httpd:latest
Untagged: httpd@sha256:027c678f36d3cd3dd2b44ad1e963e81be66f9eba065381c1126d3019fffeb01a
Untagged: myhttpd:latest
Deleted: sha256:65005131d37e90347c3259856d51f35c505d260c308f2b7d0fc020a841dd1220
Deleted: sha256:4426c8d831496e681992983c2830799b357753f2985e3284141fcba9efae69fb
Deleted: sha256:a58005c0fd40b9908468daa86fb9f4d9cecf5de5898a4872447dd581e708be3e
Deleted: sha256:b607ebcb3913ea521cb132bccc6e14bc928284a9a5d2b2edce2cc3cb88425486
Deleted: sha256:85ae7b63eeeb6d71b70102d1582367b731ce74684ae850e26fce88b6c7ee024c
Deleted: sha256:aecbd7614fe1249afadeb1ff8e34a674ae1eabc0a9e7e77634771587ec52572a
Deleted: sha256:daf557c4f08e0cb77b2af2a08d8bca4f333cf408d88191911715e6f393eca215
清理镜像
使用docker一段时间后,系统可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通
过docker image prune命令来进行清理。支持的选项包括:
-a,-all:删除所有无用的镜像,不仅仅是临时镜像
-f,-force:强制删除镜像,而不进行提示确认
例如,如下命令会自动清理临时的遗留镜像文件层,最后会提示释放的存储空间:
[root@docker ~]# docker image prune -f
Total reclaimed space: 0B
导出镜像
可以使用docker image save将一个镜像导出到一个压缩包中,便于在其他主机上运行
[root@docker ~]# docker image save httpd > sy-httpd.tar.gz
[root@docker ~]# ll -h sy-httpd.tar.gz
-rw-r--r-- 1 root root 115M Sep 29 20:39 sy-httpd.tar.gz
导入镜像
可以使用docker image load导入我们需要的镜像压缩包(为了实验效果,首先我们把之前的httpd镜
像删除)
[root@docker ~]# docker image load -i sy-httpd.tar.gz
Loaded image: httpd:latest
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 41f689c20910 6 weeks ago 192MB
httpd latest 65005131d37e 7 weeks ago 117MB
使用 inspect 命令查看信息
使用 docker [image] inspect 命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等
[root@docker ~]# docker pull centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
[root@docker ~]# docker image inspect centos:7
[{"Id": "sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9","RepoTags": ["centos:7"],"RepoDigests": ["centos@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4"],"Parent": "","Comment": "","Created": "2021-09-15T18:20:23.99863383Z","DockerVersion": "20.10.7","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"],"Image": "sha256:ba35a4b787c8f11e3b6ed9248c7663b4f27459e9715a1ace09f966259d5ebc3a","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20201113","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS","org.opencontainers.image.created": "2020-11-13 00:00:00+00:00","org.opencontainers.image.licenses": "GPL-2.0-only","org.opencontainers.image.title": "CentOS Base Image","org.opencontainers.image.vendor": "CentOS"}},"Architecture": "amd64","Os": "linux","Size": 203936249,"GraphDriver": {"Data": {"MergedDir": "/var/lib/docker/overlay2/ea2568552c499a2ebf998753487a5a51d4eb1c3c178aba7422e70af93719e7b1/merged","UpperDir": "/var/lib/docker/overlay2/ea2568552c499a2ebf998753487a5a51d4eb1c3c178aba7422e70af93719e7b1/diff","WorkDir": "/var/lib/docker/overlay2/ea2568552c499a2ebf998753487a5a51d4eb1c3c178aba7422e70af93719e7b1/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:174f5685490326fc0a1c0f5570b8663732189b327007e47ff13d2ca59673db02"]},"Metadata": {"LastTagTime": "0001-01-01T00:00:00Z"}}
]
上面代码返回的是一个 JSON 格式的消息,如果我们只要其中一项内容时,可以使用-f 来指定
[root@docker ~]# docker image inspect -f "{{.Architecture}}" centos:7
amd64
[root@docker ~]# docker image inspect -f "{{.Os}}" centos:7
linux
[root@docker ~]# docker image inspect -f "{{.Size}}" centos:7
203936249
三、关键操作总结
- 本地无镜像时,
docker pull
可自动 / 手动从仓库下载 docker search
可快速查找所需镜像docker tag
添加的标签与原镜像 ID 一致,仅为 “别名”docker rmi
/docker image rm
删除镜像,镜像被使用或多标签时需注意(多标签需-f
强制删除)- 长期使用后,
docker image prune
可清理无用镜像,释放空间