6.1 搜索镜像:docker search
6.1.1 基本搜索
# 搜索镜像dockersearch nginx# 输出示例:# NAME DESCRIPTION STARS OFFICIAL AUTOMATED# nginx Official build of Nginx 19000 [OK]# linuxserver/nginx Nginx web server 200 [OK]# bitnami/nginx Bitnami nginx Docker Image 150 [OK]输出字段说明:
NAME: 镜像名称DESCRIPTION: 镜像描述STARS: 星标数(受欢迎程度)OFFICIAL: 是否为官方镜像AUTOMATED: 是否为自动构建
6.1.2 过滤搜索结果
# 只显示官方镜像dockersearch --filter"is-official=true"nginx# 只显示自动构建的镜像dockersearch --filter"is-automated=true"nginx# 显示星标>=100的镜像dockersearch --filter"stars=100"nginx# 限制显示数量dockersearch --limit5nginx# 不截断描述dockersearch --no-trunc nginx# 格式化输出dockersearch --format"table {{.Name}}\t{{.StarCount}}\t{{.IsOfficial}}"nginx6.1.3 搜索技巧
选择镜像的原则:
优先选择官方镜像
dockersearch --filter"is-official=true"python查看星标数
- 星标数反映社区认可度
- 一般选择星标>100的镜像
检查更新频率
- 访问Docker Hub查看最后更新时间
- https://hub.docker.com/
查看镜像文档
- 阅读镜像的README
- 了解支持的标签和版本
6.1.4 实战示例
# 场景1:寻找Python运行环境dockersearch python --filter"is-official=true"# 场景2:寻找Redis数据库dockersearch redis --filter"stars=100"--limit10# 场景3:搜索特定版本# 注意:search命令不支持标签搜索,需要到Docker Hub查看# https://hub.docker.com/_/nginx?tab=tags6.2 拉取镜像:docker pull
6.2.1 基本拉取
# 拉取最新版本(latest标签)dockerpull nginx# 等同于dockerpull nginx:latest# 拉取指定版本dockerpull nginx:1.25dockerpull nginx:1.25.3dockerpull nginx:alpine# 拉取指定摘要dockerpull nginx@sha256:abc123...6.2.2 从不同仓库拉取
# 从Docker Hub拉取(默认)dockerpull nginx# 完整格式dockerpull docker.io/library/nginx:latest# 从私有仓库拉取dockerpull registry.company.com:5000/myapp:1.0# 从其他公共仓库拉取dockerpull quay.io/prometheus/prometheusdockerpull gcr.io/google-containers/nginx6.2.3 多架构镜像
# 拉取特定平台的镜像dockerpull --platform linux/amd64 nginxdockerpull --platform linux/arm64 nginxdockerpull --platform linux/arm/v7 nginx# 查看镜像支持的平台dockermanifest inspect nginx|grep-A5"platform"# 在Apple Silicon Mac上拉取x86镜像dockerpull --platform linux/amd64 mysql:8.06.2.4 批量拉取
# 拉取多个版本fortagin1.231.241.25;dodockerpull nginx:$tagdone# 从文件读取并拉取# images.txt内容:# nginx:1.25# redis:7.0# postgres:13catimages.txt|whilereadimage;dodockerpull$imagedone6.2.5 拉取优化
# 使用镜像加速器(已在daemon.json配置)# 查看配置dockerinfo|grep-A5"Registry Mirrors"# 限制并发下载# 在daemon.json中配置{"max-concurrent-downloads":3}# 查看拉取进度dockerpull nginx:latest# 输出:# latest: Pulling from library/nginx# a2abf6c4d29d: Pull complete# a9edb18cadd1: Pull complete# 589b7251471a: Pull complete6.2.6 验证镜像
# 拉取后验证dockerpull nginx:1.25# 查看镜像详情dockerimage inspect nginx:1.25# 验证镜像签名(Docker Content Trust)exportDOCKER_CONTENT_TRUST=1dockerpull nginx:1.25# 会验证镜像签名6.3 查看本地镜像:docker images
6.3.1 基本列表
# 列出所有镜像dockerimages# 新格式dockerimagels# 输出示例:# REPOSITORY TAG IMAGE ID CREATED SIZE# nginx 1.25 605c77e624dd 2 weeks ago 141MB# nginx 1.24 ad17f2e2b55e 1 month ago 140MB# ubuntu 22.04 27941809078c 2 weeks ago 77.8MB# redis 7.0 7614ae9453d1 3 weeks ago 117MB6.3.2 过滤和筛选
# 只显示特定仓库的镜像dockerimages nginxdockerimages ubuntu# 显示完整的IMAGE IDdockerimages --no-trunc# 只显示镜像IDdockerimages -qdockerimages nginx -q# 显示悬空镜像(dangling)dockerimages --filter"dangling=true"# 过滤特定标签dockerimages --filter"reference=nginx:1.*"# 显示指定时间之前/之后创建的镜像dockerimages --filter"before=nginx:1.25"dockerimages --filter"since=nginx:1.24"6.3.3 格式化输出
# 自定义输出格式dockerimages --format"{{.Repository}}:{{.Tag}}"# 表格格式dockerimages --format"table {{.Repository}}\t{{.Tag}}\t{{.Size}}"# JSON格式dockerimages --format"{{json .}}"# 使用jq处理JSONdockerimages --format"{{json .}}"|jq -r'.Repository + ":" + .Tag'# 自定义输出示例dockerimages --format"table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.Size}}"# REPOSITORY TAG IMAGE ID SIZE# nginx 1.25 605c77e624 141MB# ubuntu 22.04 27941809078 77.8MB6.3.4 查看镜像详情
# 查看镜像详细信息dockerimage inspect nginx:1.25# 提取特定信息dockerimage inspect nginx:1.25 --format='{{.Architecture}}'dockerimage inspect nginx:1.25 --format='{{.Os}}'dockerimage inspect nginx:1.25 --format='{{.Size}}'# 查看镜像环境变量dockerimage inspect nginx:1.25 --format='{{.Config.Env}}'# 查看镜像暴露的端口dockerimage inspect nginx:1.25 --format='{{.Config.ExposedPorts}}'# 查看镜像层dockerimage inspect nginx:1.25 --format='{{.RootFS.Layers}}'6.3.5 查看镜像历史
# 查看镜像构建历史dockerhistorynginx:1.25# 输出示例:# IMAGE CREATED CREATED BY SIZE# 605c77e624dd 2 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B# <missing> 2 weeks ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B# <missing> 2 weeks ago /bin/sh -c #(nop) EXPOSE 80 0B# <missing> 2 weeks ago /bin/sh -c apt-get update && apt-get instal… 65MB# 不截断显示dockerhistory--no-trunc nginx:1.25# 显示完整命令dockerhistory--no-trunc --format"{{.CreatedBy}}"nginx:1.25# 查看每层的大小dockerhistory--format"table {{.ID}}\t{{.Size}}"nginx:1.256.4 删除镜像:docker rmi
6.4.1 基本删除
# 删除单个镜像dockerrmi nginx:1.24dockerimagermnginx:1.24# 使用镜像ID删除dockerrmi 605c77e624dd# 删除多个镜像dockerrmi nginx:1.24 nginx:1.23 ubuntu:20.04# 强制删除(即使有容器在使用)dockerrmi -f nginx:1.24# 注意:强制删除可能导致容器无法启动6.4.2 批量删除
# 删除所有悬空镜像(推荐)dockerimage prune# 删除所有未使用的镜像dockerimage prune -a# 删除所有镜像(危险操作)dockerrmi$(dockerimages -q)# 删除特定仓库的所有镜像dockerrmi$(dockerimages nginx -q)# 删除特定标签模式的镜像dockerrmi$(dockerimages --filter"reference=myapp:dev-*"-q)# 删除30天前创建的镜像dockerimage prune -a --filter"until=720h"6.4.3 清理策略
# 查看磁盘使用情况dockersystemdf# 输出示例:# TYPE TOTAL ACTIVE SIZE RECLAIMABLE# Images 10 5 2.5GB 1.2GB (48%)# Containers 5 3 150MB 50MB (33%)# Local Volumes 3 2 500MB 200MB (40%)# Build Cache 0 0 0B 0B# 详细信息dockersystemdf-v# 安全清理(只删除悬空镜像)dockerimage prune# 激进清理(删除所有未使用资源)dockersystem prune -a --volumes# 交互式清理dockersystem prune# 提示:Are you sure you want to continue? [y/N]6.4.4 防止误删
# 检查哪些容器在使用该镜像dockerps-a --filter"ancestor=nginx:1.24"# 查看镜像被哪些容器引用dockerimage inspect nginx:1.24 --format='{{.RepoDigests}}'# 先停止并删除相关容器dockerstop$(dockerps-a --filter"ancestor=nginx:1.24"-q)dockerrm$(dockerps-a --filter"ancestor=nginx:1.24"-q)# 然后删除镜像dockerrmi nginx:1.246.5 镜像标签管理:docker tag
6.5.1 基本标签操作
# 为镜像添加新标签dockertag nginx:1.25 mynginx:latestdockertag nginx:1.25 mynginx:proddockertag nginx:1.25 mynginx:v1.25.3# 查看结果dockerimages mynginx# REPOSITORY TAG IMAGE ID CREATED SIZE# mynginx latest 605c77e624dd 2 weeks ago 141MB# mynginx prod 605c77e624dd 2 weeks ago 141MB# mynginx v1.25.3 605c77e624dd 2 weeks ago 141MB# 注意:这些标签都指向同一个镜像(IMAGE ID相同)6.5.2 标签命名规范
# 语义化版本dockertag myapp:latest myapp:1.0.0dockertag myapp:latest myapp:1.0dockertag myapp:latest myapp:1# Git提交哈希GIT_COMMIT=$(gitrev-parse --short HEAD)dockertag myapp:latest myapp:$GIT_COMMIT# 时间戳TIMESTAMP=$(date+%Y%m%d-%H%M%S)dockertag myapp:latest myapp:$TIMESTAMP# 环境标签dockertag myapp:latest myapp:devdockertag myapp:latest myapp:stagingdockertag myapp:latest myapp:prod# 组合标签dockertag myapp:latest myapp:1.0.0-proddockertag myapp:latest myapp:1.0.0-$GIT_COMMIT6.5.3 推送到私有仓库
# 为私有仓库添加标签dockertag nginx:1.25 registry.company.com:5000/nginx:1.25dockertag myapp:latest registry.company.com:5000/myapp:prod# 推送到私有仓库dockerpush registry.company.com:5000/nginx:1.25dockerpush registry.company.com:5000/myapp:prod# 推送所有标签dockerpush registry.company.com:5000/myapp --all-tags6.5.4 标签管理策略
开发环境标签策略:
# 开发分支dockertag myapp:latest myapp:dev-feature-xdockertag myapp:latest myapp:dev-$(gitrev-parse --short HEAD)# 测试环境dockertag myapp:latest myapp:testdockertag myapp:latest myapp:test-$(date+%Y%m%d)# 预发布环境dockertag myapp:latest myapp:stagingdockertag myapp:latest myapp:rc-1.0.0# 生产环境dockertag myapp:latest myapp:proddockertag myapp:latest myapp:1.0.0dockertag myapp:latest myapp:stable6.5.5 删除标签
# 删除本地标签(实际是删除镜像引用)dockerrmi mynginx:proddockerrmi mynginx:latest# 注意:如果同一个IMAGE ID有多个标签,删除一个标签不会删除镜像dockerimages# mynginx prod 605c77e624dd 2 weeks ago 141MB# mynginx latest 605c77e624dd 2 weeks ago 141MBdockerrmi mynginx:prod# 只删除prod标签,latest标签和镜像本身仍然存在dockerrmi mynginx:latest# 删除latest标签,但镜像仍可能通过IMAGE ID访问# 完全删除镜像(所有标签)dockerrmi 605c77e624dd# 或强制删除dockerrmi -f 605c77e624dd6.6 镜像的导入导出
6.6.1 导出镜像:docker save
# 导出单个镜像dockersave nginx:1.25>nginx-1.25.tardockersave nginx:1.25 -o nginx-1.25.tar# 导出多个镜像到同一个文件dockersave nginx:1.25 nginx:1.24>nginx-multiple.tar# 导出所有标签dockersave nginx>nginx-all.tar# 压缩导出dockersave nginx:1.25|gzip>nginx-1.25.tar.gz# 查看tar文件大小ls-lh nginx-1.25.tar# -rw-r--r-- 1 user user 141M Feb 10 10:00 nginx-1.25.tar6.6.2 导入镜像:docker load
# 导入镜像dockerload<nginx-1.25.tardockerload -i nginx-1.25.tar# 导入压缩的镜像gunzip -c nginx-1.25.tar.gz|dockerload# 查看导入结果dockerimages nginx6.6.3 导出容器:docker export
# 运行一个容器dockerrun -d --name web nginx# 导出容器(导出容器的文件系统)dockerexportweb>web-container.tardockerexportweb -o web-container.tar# 注意:export导出的是容器的文件系统,不包含历史和元数据6.6.4 导入容器:docker import
# 从tar文件导入为镜像dockerimportweb-container.tar mynginx:exported# 从URL导入dockerimporthttp://example.com/container.tar mynginx:imported# 指定提交信息dockerimport-c"CMD nginx -g 'daemon off;'"web-container.tar mynginx:v1# 查看导入的镜像dockerimages mynginx6.6.5 save vs export 对比
| 特性 | docker save | docker export |
|---|---|---|
| 操作对象 | 镜像 | 容器 |
| 保留内容 | 完整的镜像层、历史、元数据 | 容器的文件系统快照 |
| 大小 | 较大(包含所有层) | 较小(单层) |
| 恢复命令 | docker load | docker import |
| 使用场景 | 迁移镜像、备份 | 创建新的基础镜像 |
实例对比:
# save保留完整历史dockersave nginx:1.25>nginx-save.tardockerload<nginx-save.tardockerhistorynginx:1.25# 显示完整构建历史# export只保留文件系统dockerrun -d --name temp nginx:1.25dockerexporttemp>nginx-export.tardockerimportnginx-export.tar mynginx:importeddockerhistorymynginx:imported# 只有一层6.6.6 实用场景
场景1:离线环境部署
# 在联网机器上dockerpull nginx:1.25dockerpull redis:7.0dockerpull postgres:13# 导出所有镜像dockersave nginx:1.25 redis:7.0 postgres:13>offline-images.tar# 复制到离线机器scpoffline-images.tar user@offline-server:/tmp/# 在离线机器上dockerload</tmp/offline-images.tar场景2:快速分发自定义镜像
# 构建自定义镜像dockerbuild -t myapp:1.0.# 导出并压缩dockersave myapp:1.0|gzip>myapp-1.0.tar.gz# 分发给其他开发者# 其他开发者导入gunzip -c myapp-1.0.tar.gz|dockerload场景3:镜像备份
# 定期备份重要镜像#!/bin/bashBACKUP_DIR=/backup/docker-imagesmkdir-p$BACKUP_DIRforimagein$(dockerimages --format"{{.Repository}}:{{.Tag}}"|grepmycompany);dofilename=$(echo$image|tr'/:''_')dockersave$image|gzip>$BACKUP_DIR/$filename-$(date+%Y%m%d).tar.gzdone6.7 镜像层的理解
6.7.1 查看镜像层
# 查看镜像层dockerimage inspect nginx:1.25 --format='{{json .RootFS.Layers}}'|jq# 输出示例:# [# "sha256:abc123...",# "sha256:def456...",# "sha256:ghi789..."# ]# 查看每层的大小dockerhistorynginx:1.25 --no-trunc6.7.2 层的共享
# 两个镜像共享基础层dockerpull nginx:1.25dockerpull nginx:1.24# 查看实际占用空间dockersystemdf# 注意:两个镜像的SIZE之和 > 实际占用空间# 查看层的共享情况dockerimage inspect nginx:1.25 nginx:1.24 --format='{{.RootFS.Layers}}'|sort|uniq-d6.7.3 优化镜像大小
技巧1:使用精简基础镜像
# Alpine Linux版本更小dockerimages nginx# nginx 1.25 141MB# nginx alpine 24MB技巧2:合并层
# 不好的做法(多层) RUN apt-get update RUN apt-get install -y curl RUN apt-get install -y vim # 好的做法(单层) RUN apt-get update && apt-get install -y \ curl \ vim \ && rm -rf /var/lib/apt/lists/*6.8 小结
通过本章学习,我们掌握了Docker镜像的基础操作:
✅搜索镜像
- docker search命令
- 过滤和筛选
- 选择镜像的原则
✅拉取镜像
- docker pull命令
- 多架构支持
- 批量拉取和优化
✅查看镜像
- docker images命令
- 过滤和格式化
- 查看详情和历史
✅删除镜像
- docker rmi命令
- 批量删除
- 清理策略
✅标签管理
- docker tag命令
- 标签命名规范
- 版本管理策略
✅导入导出
- save/load vs export/import
- 离线部署
- 备份策略
下一步
在第7章中,我们将学习构建自定义镜像:
- Dockerfile语法详解
- 常用指令(FROM、RUN、COPY等)
- 构建上下文
- 多阶段构建
- 构建缓存优化
这是Docker实践中最重要的技能之一。
本章思考题:
- docker save和docker export的区别是什么?各适用于什么场景?
- 为什么多个镜像可以共享存储空间?
- 如何设计一个合理的镜像标签策略?
- 在生产环境中,应该如何管理镜像的生命周期?
相关资源:
- Docker Hub:https://hub.docker.com/
- 镜像最佳实践:https://docs.docker.com/develop/dev-best-practices/
- Dockerfile参考:https://docs.docker.com/engine/reference/builder/