一、上期回顾

每天半小时,轻松学Docker第三篇:Docker 27.4.1部署与配置

二、Docker核心概念

概念(英文)核心作用简单类比
Image(镜像)存储应用及依赖的静态文件系统,构建后内容不变虚拟机快照、类(面向对象)
Container(容器)镜像运行后的实体,独立运行的进程,可创建 / 启停 / 删除运行中的虚拟机、类的实例
Repository(仓库)集中存储、分发镜像,按标签区分不同版本代码仓库(如 Git)、软件仓库

二、镜像分层原理

1、联合文件系统(UnionFS)

Docker使用联合文件系统来实现分层存储。UnionFS允许将多个目录(称为分支)透明地叠加,形成一个统一的文件系统视图。

主要特点:

  • 写时复制(Copy-on-Write)机制

  • 分层叠加

  • 资源共享

2、分层结构示意

┌─────────────────┐ ← 容器可写层 (Container Layer)
│     可写层       │
├─────────────────┤
│     镜像层 3     │ ← 添加应用配置
├─────────────────┤
│     镜像层 2     │ ← 安装应用程序
├─────────────────┤
│     镜像层 1     │ ← 安装系统工具
├─────────────────┤
│     镜像层 0     │ ← 基础操作系统
└─────────────────┘

三、镜像查找

1、命令行查找

root@debase:/home# docker search mysql
NAME                   DESCRIPTION                                     STARS     OFFICIAL
mysql                  MySQL is a widely used, open-source relation…   15583     [OK]
bitnami/mysql          Bitnami container image for MySQL               123
circleci/mysql         MySQL is a widely used, open-source relation…   30
...

默认情况下,Docker daemon服务会从Docker官网查找镜像image,但由于Docker官网位于中国大陆之外,网络通过质量极不稳定,为便于后续学习可以快速拉取镜像,需要学习Docker如何配置镜像加速。

2、官网查找

官网镜像地址 Docker Hub

四、镜像拉取

docker pull mariadb:12.1.1-ubi10-rc
root@debase:/home# docker pull mariadb:12.1.1-ubi10-rc
12.1.1-ubi10-rc: Pulling from library/mariadb
551849931ba0: Pull complete 
a5b5eb905320: Pull complete 
36d35d03dc1f: Pull complete 
91f1aedeaa87: Pull complete 
43bc53c76daf: Pull complete 
b07a02cf2098: Pull complete 
157b7dd0986b: Pull complete 
3b84c8b1fbbe: Pull complete 
b1f10801bd19: Pull complete 
fcc7a4c4a770: Pull complete 
Digest: sha256:986f196ef4e5fd8ad2aad341c4b8f4c807d1cd48f12ff644e4e725e8dbc45f26
Status: Downloaded newer image for mariadb:12.1.1-ubi10-rc
docker.io/library/mariadb:12.1.1-ubi10-rc
root@debase:/home# docker images
REPOSITORY    TAG               IMAGE ID       CREATED       SIZE
mariadb       12.1.1-ubi10-rc   033df3477506   7 weeks ago   572MB
hello-world   latest            1b44b5a3e06a   7 weeks ago   10.1kB
mariadb       latest            3ccf43d36f1d   7 weeks ago   330MB

五、镜像列表查看

1、docker images 命令用法全表

命令格式核心作用适用场景
docker images列出本地所有镜像,显示默认字段(仓库名、标签、镜像 ID、创建时间、大小)快速查看本地镜像库存,确认镜像是否存在
docker images <仓库名>筛选显示指定仓库的所有镜像(如 docker images ubuntu仅关注某一类镜像(如 Ubuntu 系列),避免列表杂乱
docker images <仓库名>:<标签>精准查看指定仓库 + 指定标签的镜像(如 docker images nginx:1.24确认特定版本镜像是否已本地存在,避免版本混淆
docker images -a / docker images --all列出所有镜像(包括临时镜像、中间层镜像)排查镜像残留问题,清理无用中间层镜像
docker images -q / docker images --quiet仅输出本地所有镜像的 镜像 ID(无其他字段)批量操作镜像时使用(如结合 xargs 删除镜像:`docker images -q ubuntuxargs docker rmi`)
docker images --filter "dangling=true"筛选显示 “悬虚镜像”(标签为 <none> 的无用镜像)清理构建镜像后残留的无用悬虚镜像,释放磁盘空间
docker images --filter "reference=*:latest"筛选显示标签为 latest 的所有镜像统一管理默认标签镜像,检查是否需更新版本
docker images --format "{{.Repository}}:{{.Tag}} ({{.Size}})"自定义输出格式(按指定字段展示,支持的字段见注)按需提取关键信息(如仅显示 “仓库:标签 + 大小”),方便数据整理
docker images -f "since=<镜像ID/仓库:标签>"列出在指定镜像 之后创建 的所有镜像(如 docker images -f "since=nginx:1.24"追踪某镜像构建后新增的本地镜像,排查版本关联问题
docker images -f "until=<镜像ID/仓库:标签>"列出在指定镜像 之前创建 的所有镜像筛选早期镜像,清理过时的旧版本镜像
docker images --no-trunc显示完整的镜像 ID(默认显示缩写 ID)精准匹配镜像(如远程仓库镜像 ID 比对时,避免缩写冲突)

--format 支持的常用字段:

  • .Repository:镜像仓库名
  • .Tag:镜像标签
  • .ID:镜像 ID(默认缩写,配合 --no-trunc 显示完整)
  • .CreatedSince:镜像创建距离现在的时间(如 “2 weeks ago”)
  • .Size:镜像大小

2、常用命令

root@debase:/home# docker images
REPOSITORY    TAG               IMAGE ID       CREATED       SIZE
mariadb       12.1.1-ubi10-rc   033df3477506   7 weeks ago   572MB
hello-world   latest            1b44b5a3e06a   7 weeks ago   10.1kB
mariadb       latest            3ccf43d36f1d   7 weeks ago   330MB

六、镜像删除

1、基础用法

1.1、删除指定镜像(常用)

# 通过 镜像ID (通常前3-4位即可) 删除
docker rmi 1f9b

# 通过 仓库名:标签 删除
docker rmi nginx:latest

1.2、同时删除多个镜像

docker rmi nginx:latest redis:6.2 alpine:3.18

2、高级用法与常见场景

2.1、强制删除镜像 (-f 或 --force)

当一个镜像正在被一个或多个容器使用时(即使容器已停止),直接删除会失败。此时需要使用 -f 参数强制删除。

# 假设 hello-world 镜像被某个容器引用
docker rmi hello-world
# 报错:Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container <container_id> is using its referenced image <image_id>

# 使用 -f 强制删除
docker rmi -f hello-world

2.2、删除所有本地镜像

这是一个危险操作,会清空你本地所有的镜像,请谨慎使用!通常结合 docker images -q 来实现

# docker images -q 会列出所有镜像的ID,然后通过 xargs 传递给 docker rmi
docker images -q | xargs docker rmi -f

2.3、删除所有悬虚镜像 (Dangling Images)

# 列出所有悬虚镜像
docker images --filter "dangling=true"

# 删除所有悬虚镜像
docker rmi $(docker images -f "dangling=true" -q)
# 直接删除所有悬虚镜像,并会提示你确认
docker image prune

# 加上 -f 或 --force 参数可以跳过确认,直接删除
docker image prune -f

3、命令参数详解

参数简写说明
--force-f强制删除镜像,即使有容器正在使用它。
--no-prune不要删除未被引用的父镜像。默认情况下,如果一个父镜像没有被任何其他子镜像引用,docker rmi 会一并删除它。使用此参数可以保留这些父镜像。
命令作用
docker rmi <镜像ID/标签>删除指定镜像。
docker rmi -f <镜像ID/标签>强制删除指定镜像。
docker rmi $(docker images -q)删除所有镜像。
docker image prune删除所有悬虚镜像(推荐)。
docker rmi $(docker images -q <仓库名>)删除指定仓库的所有镜像。

七、镜像归档和导入

1、镜像归档

# 归档镜像
root@debase:/home# docker save hello-world -o hello-world.tar.gz

root@debase:/home# ll
total 36
drwxr-xr-x  3 root root  4096 Sep 30 15:43 ./
drwxr-xr-x 18 root root  4096 Sep 29 17:37 ../
-rw-------  1 root root 22528 Sep 30 15:43 hello-world.tar.gz
drwx------  2 rz   rz    4096 Sep 30 10:11 rz/
# 删除本地镜像
root@debase:/home# docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:54e66cc1dd1fcb1c3c58bd8017914dbed8701e2d8c74d9262e26bd9cc1642d31
Deleted: sha256:1b44b5a3e06a9aae883e7bf25e45c100be0bb81a0e01b32de604f3ac44711634
Deleted: sha256:53d204b3dc5ddbc129df4ce71996b8168711e211274c785de5e0d4eb68ec3851
root@debase:/home# docker images
REPOSITORY   TAG               IMAGE ID       CREATED       SIZE
mariadb      12.1.1-ubi10-rc   033df3477506   7 weeks ago   572MB
mariadb      latest            3ccf43d36f1d   7 weeks ago   330MB

2、镜像导入

root@debase:/home# docker images
REPOSITORY   TAG               IMAGE ID       CREATED       SIZE
mariadb      12.1.1-ubi10-rc   033df3477506   7 weeks ago   572MB
mariadb      latest            3ccf43d36f1d   7 weeks ago   330MB
root@debase:/home# docker load -i hello-world.tar.gz 
53d204b3dc5d: Loading layer [==================================================>]  11.78kB/11.78kB
Loaded image: hello-world:latest
root@debase:/home# docker images
REPOSITORY    TAG               IMAGE ID       CREATED       SIZE
mariadb       12.1.1-ubi10-rc   033df3477506   7 weeks ago   572MB
hello-world   latest            1b44b5a3e06a   7 weeks ago   10.1kB
mariadb       latest            3ccf43d36f1d   7 weeks ago   330MB

八、总结与预告

本次课程围绕 Docker 镜像管理展开,从镜像分层原理入手,依次讲解了镜像的查找、拉取、列表查看、删除,以及归档与导入操作,覆盖了镜像全生命周期的核心管理场景,帮助大家掌握从获取镜像到维护镜像的实用技能,为后续容器管理奠定基础。

1、下节课程预告

每天半小时,轻松学Docker第五篇:Docker 容器管理

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐