news 2026/4/21 23:25:13

第6章 Docker镜像基础操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第6章 Docker镜像基础操作

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}}"nginx

6.1.3 搜索技巧

选择镜像的原则

  1. 优先选择官方镜像

    dockersearch --filter"is-official=true"python
  2. 查看星标数

    • 星标数反映社区认可度
    • 一般选择星标>100的镜像
  3. 检查更新频率

    • 访问Docker Hub查看最后更新时间
    • https://hub.docker.com/
  4. 查看镜像文档

    • 阅读镜像的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=tags

6.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/nginx

6.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.0

6.2.4 批量拉取

# 拉取多个版本fortagin1.231.241.25;dodockerpull nginx:$tagdone# 从文件读取并拉取# images.txt内容:# nginx:1.25# redis:7.0# postgres:13catimages.txt|whilereadimage;dodockerpull$imagedone

6.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 complete

6.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 117MB

6.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.8MB

6.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.25

6.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.24

6.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_COMMIT

6.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-tags

6.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:stable

6.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 605c77e624dd

6.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.tar

6.6.2 导入镜像:docker load

# 导入镜像dockerload<nginx-1.25.tardockerload -i nginx-1.25.tar# 导入压缩的镜像gunzip -c nginx-1.25.tar.gz|dockerload# 查看导入结果dockerimages nginx

6.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 mynginx

6.6.5 save vs export 对比

特性docker savedocker export
操作对象镜像容器
保留内容完整的镜像层、历史、元数据容器的文件系统快照
大小较大(包含所有层)较小(单层)
恢复命令docker loaddocker 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.gzdone

6.7 镜像层的理解

6.7.1 查看镜像层

# 查看镜像层dockerimage inspect nginx:1.25 --format='{{json .RootFS.Layers}}'|jq# 输出示例:# [# "sha256:abc123...",# "sha256:def456...",# "sha256:ghi789..."# ]# 查看每层的大小dockerhistorynginx:1.25 --no-trunc

6.7.2 层的共享

# 两个镜像共享基础层dockerpull nginx:1.25dockerpull nginx:1.24# 查看实际占用空间dockersystemdf# 注意:两个镜像的SIZE之和 > 实际占用空间# 查看层的共享情况dockerimage inspect nginx:1.25 nginx:1.24 --format='{{.RootFS.Layers}}'|sort|uniq-d

6.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实践中最重要的技能之一。


本章思考题

  1. docker save和docker export的区别是什么?各适用于什么场景?
  2. 为什么多个镜像可以共享存储空间?
  3. 如何设计一个合理的镜像标签策略?
  4. 在生产环境中,应该如何管理镜像的生命周期?

相关资源

  • Docker Hub:https://hub.docker.com/
  • 镜像最佳实践:https://docs.docker.com/develop/dev-best-practices/
  • Dockerfile参考:https://docs.docker.com/engine/reference/builder/
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 17:53:19

多语言支持:用TranslateGemma实现文档批量翻译自动化

多语言支持&#xff1a;用TranslateGemma实现文档批量翻译自动化 1. 为什么企业需要本地化、高精度的批量翻译方案 你有没有遇到过这些场景&#xff1a; 技术团队刚收到一份30页的英文API文档&#xff0c;明天就要给国内开发做培训市场部紧急要将5份产品白皮书同步翻译成德语…

作者头像 李华
网站建设 2026/4/19 19:02:59

Qwen2-VL-2B多模态向量模型效果实测:UMRB+SOTA基准下的真实检索表现

Qwen2-VL-2B多模态向量模型效果实测&#xff1a;UMRBSOTA基准下的真实检索表现 1. 模型简介与核心能力 GME多模态向量-Qwen2-VL-2B是一个强大的多模态向量生成模型&#xff0c;它能够处理文本、图像以及图文对三种不同类型的输入&#xff0c;并为它们生成统一的向量表示。这个…

作者头像 李华
网站建设 2026/4/18 6:50:32

文墨共鸣效果展示:医疗科普文本语义相似度分析|避免患者理解歧义

文墨共鸣效果展示&#xff1a;医疗科普文本语义相似度分析&#xff5c;避免患者理解歧义 1. 项目概览 文墨共鸣是一个将深度学习技术与传统水墨美学相结合的语义相似度分析系统。基于阿里达摩院开源的StructBERT大模型&#xff0c;专门针对中文语义优化&#xff0c;能够精准识…

作者头像 李华
网站建设 2026/4/17 17:40:02

Z-Image i2L效果实测:这些惊艳图片都是AI生成的

Z-Image i2L效果实测&#xff1a;这些惊艳图片都是AI生成的 想象一下&#xff0c;你脑海中有一个绝妙的画面&#xff1a;一座未来感十足的城市&#xff0c;霓虹灯在雨夜中闪烁&#xff0c;赛博朋克的氛围拉满。过去&#xff0c;你需要花重金聘请插画师&#xff0c;或者自己苦学…

作者头像 李华
网站建设 2026/4/18 8:16:59

AI绘画新手必看:造相Z-Image保姆级部署教程

AI绘画新手必看&#xff1a;造相Z-Image保姆级部署教程 1. 前言&#xff1a;为什么选择造相Z-Image&#xff1f; 如果你刚刚接触AI绘画&#xff0c;可能会被各种复杂的模型和配置搞得头晕眼花。别担心&#xff0c;造相Z-Image就是为你这样的新手准备的完美入门选择。 造相Z-…

作者头像 李华
网站建设 2026/4/17 8:26:18

工厂充电桩远程监控管理系统方案

随着工厂规模越来越大&#xff0c;内部电动运输车辆、仓储物流小车以及员工电车的数量日益增长&#xff0c;充电桩作为其关键配套设施&#xff0c;必须同步匹配。与住宅小区相比&#xff0c;工厂充电桩分布更为集中、使用频率高、负荷强度大、运行环境复杂&#xff0c;面临着设…

作者头像 李华