第6章 Docker镜像基础操作

📅 发布时间:2026/7/8 9:48:13 👁️ 浏览次数:
第6章 Docker镜像基础操作
6.1 搜索镜像docker search6.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 --filteris-officialtruenginx# 只显示自动构建的镜像dockersearch --filteris-automatedtruenginx# 显示星标100的镜像dockersearch --filterstars100nginx# 限制显示数量dockersearch --limit5nginx# 不截断描述dockersearch --no-trunc nginx# 格式化输出dockersearch --formattable {{.Name}}\t{{.StarCount}}\t{{.IsOfficial}}nginx6.1.3 搜索技巧选择镜像的原则优先选择官方镜像dockersearch --filteris-officialtruepython查看星标数星标数反映社区认可度一般选择星标100的镜像检查更新频率访问Docker Hub查看最后更新时间https://hub.docker.com/查看镜像文档阅读镜像的README了解支持的标签和版本6.1.4 实战示例# 场景1寻找Python运行环境dockersearch python --filteris-officialtrue# 场景2寻找Redis数据库dockersearch redis --filterstars100--limit10# 场景3搜索特定版本# 注意search命令不支持标签搜索需要到Docker Hub查看# https://hub.docker.com/_/nginx?tabtags6.2 拉取镜像docker pull6.2.1 基本拉取# 拉取最新版本latest标签dockerpull nginx# 等同于dockerpull nginx:latest# 拉取指定版本dockerpull nginx:1.25dockerpull nginx:1.25.3dockerpull nginx:alpine# 拉取指定摘要dockerpull nginxsha256: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-A5platform# 在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-A5Registry 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 TrustexportDOCKER_CONTENT_TRUST1dockerpull nginx:1.25# 会验证镜像签名6.3 查看本地镜像docker images6.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# 显示悬空镜像danglingdockerimages --filterdanglingtrue# 过滤特定标签dockerimages --filterreferencenginx:1.*# 显示指定时间之前/之后创建的镜像dockerimages --filterbeforenginx:1.25dockerimages --filtersincenginx:1.246.3.3 格式化输出# 自定义输出格式dockerimages --format{{.Repository}}:{{.Tag}}# 表格格式dockerimages --formattable {{.Repository}}\t{{.Tag}}\t{{.Size}}# JSON格式dockerimages --format{{json .}}# 使用jq处理JSONdockerimages --format{{json .}}|jq -r.Repository : .Tag# 自定义输出示例dockerimages --formattable {{.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--formattable {{.ID}}\t{{.Size}}nginx:1.256.4 删除镜像docker rmi6.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 --filterreferencemyapp:dev-*-q)# 删除30天前创建的镜像dockerimage prune -a --filteruntil720h6.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 --filterancestornginx:1.24# 查看镜像被哪些容器引用dockerimage inspect nginx:1.24 --format{{.RepoDigests}}# 先停止并删除相关容器dockerstop$(dockerps-a --filterancestornginx:1.24-q)dockerrm$(dockerps-a --filterancestornginx:1.24-q)# 然后删除镜像dockerrmi nginx:1.246.5 镜像标签管理docker tag6.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.25nginx-1.25.tardockersave nginx:1.25 -o nginx-1.25.tar# 导出多个镜像到同一个文件dockersave nginx:1.25 nginx:1.24nginx-multiple.tar# 导出所有标签dockersave nginxnginx-all.tar# 压缩导出dockersave nginx:1.25|gzipnginx-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# 导入镜像dockerloadnginx-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# 导出容器导出容器的文件系统dockerexportwebweb-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-cCMD nginx -g daemon off;web-container.tar mynginx:v1# 查看导入的镜像dockerimages mynginx6.6.5 save vs export 对比特性docker savedocker export操作对象镜像容器保留内容完整的镜像层、历史、元数据容器的文件系统快照大小较大包含所有层较小单层恢复命令docker loaddocker import使用场景迁移镜像、备份创建新的基础镜像实例对比# save保留完整历史dockersave nginx:1.25nginx-save.tardockerloadnginx-save.tardockerhistorynginx:1.25# 显示完整构建历史# export只保留文件系统dockerrun -d --name temp nginx:1.25dockerexporttempnginx-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:13offline-images.tar# 复制到离线机器scpoffline-images.tar useroffline-server:/tmp/# 在离线机器上dockerload/tmp/offline-images.tar场景2快速分发自定义镜像# 构建自定义镜像dockerbuild -t myapp:1.0.# 导出并压缩dockersave myapp:1.0|gzipmyapp-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 Hubhttps://hub.docker.com/镜像最佳实践https://docs.docker.com/develop/dev-best-practices/Dockerfile参考https://docs.docker.com/engine/reference/builder/