Docker 镜像知识总结

Docker 镜像知识总结

一、Docker 镜像概述

  1. 定义:类似虚拟机镜像,是只读模板,可包含基础操作系统环境及特定软件(如 Apache),是创建 Docker 容器的基础
  2. 获取途径:本地不存在所需镜像时,Docker 默认从 Docker Hub 公共镜像源下载,也可从阿里云、DaoCloud 等其他公共仓库下载,或自行创建
  3. 核心特性:支持版本管理和增量文件系统,便于创建、更新和使用

二、Docker 镜像核心操作

1. 列出镜像列表

  • 命令docker images

  • 输出字段说明:

    字段 含义
    REPOSITORY 镜像的仓库源
    TAG 镜像的标签
    IMAGE ID 镜像 ID
    CREATED 镜像创建时间
    SIZE 镜像大小
  • 示例

plaintext 复制代码
[root@docker ~]# docker images
REPOSITORY  TAG     IMAGE ID      CREATED       SIZE
httpd       latest  dabbfbe0c57b  5 months ago  144MB

2. 搜索镜像

  • 两种方式:
    1. 访问 Docker Hub 网站(https://hub.docker.com/)在线搜索
    2. 使用命令搜索,命令docker search [镜像名](如docker search httpd
  • 输出字段说明:
    • NAME:镜像仓库源的名称
    • DESCRIPTION:镜像的描述
    • OFFICIAL:是否为 Docker 官方发布
    • STARS:类似 GitHub 的 "星标",表示受欢迎程度
    • AUTOMATED:是否为自动构建

3. 获取镜像

  • 触发方式:本地使用不存在的镜像时,Docker 自动下载;也可预先用命令下载
  • 命令docker pull [镜像名](如docker pull httpd,默认下载latest标签版本)
  • 示例
plaintext 复制代码
[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 删除
  • 三种场景:
    1. 通过镜像名称删除 :命令docker rmi [镜像名:标签](如docker rmi httpd),会先移除标签,再删除镜像文件(无其他标签引用时)
    2. 通过镜像 ID 删除 :若镜像无其他标签,命令docker rmi [镜像ID](如docker rmi dabbfbe0c57b)可直接删除
    3. 强制删除多标签镜像 :镜像被重新打标签后无法直接删除,需加-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
  • 示例
plaintext 复制代码
[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
  • 示例
plaintext 复制代码
[root@docker ~]# docker image load -i cy-httpd.tar.gz
...
Loaded image: httpd:latest

10. 查看镜像详细信息

  • 作用:获取镜像的完整信息,包括制作者、架构、各层摘要等(输出为 JSON 格式)
  • 命令:
    1. 查看全部信息:docker image inspect [镜像名:标签](如docker image inspect centos:7
    2. 查看指定字段信息:加-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

三、关键操作总结

  1. 本地无镜像时,docker pull可自动 / 手动从仓库下载
  2. docker search可快速查找所需镜像
  3. docker tag添加的标签与原镜像 ID 一致,仅为 "别名"
  4. docker rmi/docker image rm删除镜像,镜像被使用或多标签时需注意(多标签需-f强制删除)
  5. 长期使用后,docker image prune可清理无用镜像,释放空间
相关推荐
梁正雄2 小时前
1、docker入门简介
运维·docker·容器
東雪蓮☆2 小时前
Docker 数据卷与存储机制(持久化与共享实战)
运维·docker·容器
牛马的人生2 小时前
GitLab入门教程:打开DevOps全流程的大门
运维·其他·gitlab·devops
拾光Ծ2 小时前
【Linux】入门指南:基础指令详解Part One
linux·运维·服务器·centos
石臻臻的杂货铺3 小时前
如何让AI实现自动化 —— PlayWright MCP 实测
运维·人工智能·自动化
红尘客栈23 小时前
保姆级 Docker 入门到进阶
运维·docker·容器
lingggggaaaa3 小时前
小迪安全v2023学习笔记(九十五讲)—— 云原生篇&Docker安全&权限环境检测&容器逃逸&特权模式&危险挂载
笔记·学习·安全·web安全·网络安全·docker·云原生
bxlj_jcj4 小时前
StatefulSet:有状态应用的“定海神针”
云原生·容器·kubernetes
想唱rap5 小时前
Linux指令(1)
linux·运维·服务器·笔记·新浪微博