第一部分-Docker基础入门——03. 镜像管理

张开发
2026/5/7 9:41:02 15 分钟阅读

分享文章

第一部分-Docker基础入门——03. 镜像管理
03. 镜像管理1. 镜像概述镜像是 Docker 的核心概念之一是容器运行的基础。掌握镜像管理是使用 Docker 的必备技能。1.1 镜像的组成┌─────────────────────────────────────────────────────────────┐ │ 镜像的组成 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ ┌─────────────────────────────────────────────────┐│ │ │ │ │ Layer 4: App Code (只读) ││ │ │ │ ├─────────────────────────────────────────────────┤│ │ │ │ │ Layer 3: Dependencies (只读) ││ │ │ │ ├─────────────────────────────────────────────────┤│ │ │ │ │ Layer 2: OS Packages (只读) ││ │ │ │ ├─────────────────────────────────────────────────┤│ │ │ │ │ Layer 1: Base OS (只读) ││ │ │ │ └─────────────────────────────────────────────────┘│ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌─────────────────────┐ │ │ │ │ │ Container Layer │ (可写) │ │ │ │ │ (每个容器独立) │ │ │ │ │ └─────────────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 镜像层特点 │ │ - 只读、共享 │ │ - 相同层只存储一份 │ │ - 写时复制CoW │ │ │ └─────────────────────────────────────────────────────────────┘2. 镜像搜索与拉取2.1 搜索镜像# 搜索官方仓库中的镜像dockersearch nginxdockersearch--limit10nginx# 限制结果数量dockersearch--filterstars100nginx# 筛选 stars100# 搜索特定用户的镜像dockersearch username/nginx# 使用 Docker Hub API 搜索curl-XGEThttps://hub.docker.com/v2/repositories/library/nginx/tags2.2 拉取镜像# 拉取最新版本dockerpull nginx# 拉取指定版本dockerpull nginx:1.21dockerpull nginx:alpine# 拉取指定平台镜像dockerpull--platformlinux/amd64 nginx# 拉取私有仓库镜像dockerpull myregistry.com/myapp:v1# 拉取镜像并显示详细进度dockerpull--progressplain nginx# 拉取所有标签慎用dockerpull-anginx2.3 镜像标签与平台# 查看镜像支持的平台dockermanifest inspect nginx# 常用标签说明# - latest: 最新稳定版# - alpine: 基于 Alpine Linux体积小# - slim: 精简版# - 具体版本号: 如 1.21、1.22.03. 镜像查看与管理3.1 列出镜像# 列出所有镜像dockerimagesdockerimagels# 列出特定镜像dockerimages nginx# 列出镜像 ID只显示 IDdockerimages-q# 列出所有镜像包含中间层dockerimages-a# 格式化输出dockerimages--formattable {{.Repository}}\t{{.Tag}}\t{{.Size}}# 按大小排序dockerimages--format{{.Size}}\t{{.Repository}}:{{.Tag}}|sort-h# 查看镜像详情dockerinspect nginx:latestdockerinspect--format{{.Architecture}}nginx# 查看镜像构建历史dockerhistorynginx:latestdockerhistory--no-trunc nginx# 查看镜像占用空间dockersystemdfdockersystemdf-v3.2 镜像过滤# 过滤悬挂镜像无标签镜像dockerimages--filterdanglingtrue# 过滤指定标签前的镜像dockerimages--filterbeforenginx:1.22# 过滤指定标签后的镜像dockerimages--filtersincenginx:1.20# 过滤引用标签dockerimages--filterreferencenginx:*# 过滤特定仓库dockerimages--filterlabelmaintainernginx4. 镜像删除与清理4.1 删除镜像# 通过名称:标签删除dockerrmi nginx:1.21# 通过镜像 ID 删除dockerrmi a6bd71f48f68# 强制删除即使有容器依赖dockerrmi-fnginx# 删除多个镜像dockerrmi nginx:1.21 ubuntu:20.04# 删除所有未使用的镜像dockerimage prunedockerimage prune-a# 删除所有未使用的镜像包含无标签# 删除所有镜像# 先停止所有容器dockerstop$(dockerps-aq)# 删除所有容器dockerrm$(dockerps-aq)# 删除所有镜像dockerrmi$(dockerimages-q)4.2 清理空间# 清理所有未使用的资源镜像、容器、网络dockersystem prunedockersystem prune-a# 更彻底清理# 清理卷慎用会删除数据dockervolume prune# 查看磁盘使用情况dockersystemdfdockersystemdf-v# 自动清理cron 任务# 0 2 * * * docker system prune -f5. 镜像导入导出5.1 保存与加载保留历史记录# 保存镜像为 tar 文件dockersave-onginx.tar nginx:latestdockersave nginx:latestnginx.tar# 保存多个镜像到一个文件dockersave-oimages.tar nginx:latest ubuntu:20.04# 加载镜像dockerload-inginx.tardockerloadnginx.tar5.2 导出与导入扁平化不保留历史# 导出容器为 tar扁平化dockerexport-ocontainer.tar container_name# 导入为镜像dockerimportcontainer.tar myimage:v1# save vs export 区别# - save: 保存镜像保留层历史# - export: 导出容器丢弃历史体积更小6. 镜像标签与命名6.1 打标签# 添加标签dockertag nginx:latest mynginx:v1# 为镜像添加多个标签dockertag nginx:latest mynginx:1.21dockertag nginx:latest mynginx:stable# 标签重命名删除原标签dockertag nginx:latest nginx:newdockerrmi nginx:latest# 标签用途# - 版本管理# - 环境区分dev、test、prod# - 推送到不同仓库# 常见标签命名规范# myapp:1.0.0 # 版本号# myapp:latest # 最新版# myapp:dev # 开发环境# myapp:prod-20240101 # 生产环境日期6.2 镜像仓库管理# 登录公共仓库dockerlogindockerlogin-uusername# 登录私有仓库dockerlogin myregistry.com# 推送到仓库dockertag nginx:latest username/mynginx:v1dockerpush username/mynginx:v1# 推送到私有仓库dockertag nginx:latest myregistry.com/mynginx:v1dockerpush myregistry.com/mynginx:v1# 从私有仓库拉取dockerpull myregistry.com/mynginx:v1# 登出dockerlogoutdockerlogoutmyregistry.com7. 镜像构建准备7.1 查看镜像信息# 查看镜像详细信息dockerinspect nginx:latest# 查看镜像的入口点dockerinspect--format{{.Config.Entrypoint}}nginx# 查看镜像的 CMDdockerinspect--format{{.Config.Cmd}}nginx# 查看镜像暴露的端口dockerinspect--format{{.Config.ExposedPorts}}nginx# 查看镜像的环境变量dockerinspect--format{{.Config.Env}}nginx# 查看镜像的卷dockerinspect--format{{.Config.Volumes}}nginx# 查看镜像的工作目录dockerinspect--format{{.Config.WorkingDir}}nginx7.2 镜像大小分析# 查看镜像大小dockerimages--format{{.Repository}}:{{.Tag}}\t{{.Size}}# 分析镜像层大小需要 dive 工具dockerrun--rm-it\-v/var/run/docker.sock:/var/run/docker.sock\wagoodman/dive:latest nginx:latest# 手动分析dockerhistorynginx:latest# 优化建议# - 使用 alpine 基础镜像# - 合并 RUN 命令# - 清理缓存和临时文件# - 多阶段构建8. 实战示例8.1 完整镜像操作流程# 1. 搜索镜像dockersearch ubuntu--limit5# 2. 拉取镜像dockerpull ubuntu:20.04# 3. 查看镜像dockerimages ubuntu# 4. 查看详情dockerinspect ubuntu:20.04|grep-A5Architecture# 5. 打标签dockertag ubuntu:20.04 myubuntu:dev# 6. 查看镜像大小dockerimages|grepubuntu# 7. 导出镜像dockersave-oubuntu-20.04.tar ubuntu:20.04# 8. 删除镜像dockerrmi ubuntu:20.04# 9. 验证删除dockerimages|grepubuntu# 10. 导入镜像dockerload-iubuntu-20.04.tar# 11. 清理dockerrmi myubuntu:devrmubuntu-20.04.tar8.2 镜像版本管理# 为应用创建多个版本标签dockertag myapp:latest myapp:1.0.0dockertag myapp:latest myapp:1.0dockertag myapp:latest myapp:1# 推送到仓库dockerpush myapp:1.0.0dockerpush myapp:1.0dockerpush myapp:1dockerpush myapp:latest# 拉取指定版本dockerpull myapp:1.0.0# 删除远程标签推送空镜像dockerpush myapp:oldversion--force8.3 镜像迁移# 导出所有镜像forimgin$(dockerimages--format{{.Repository}}:{{.Tag}}|grep-vnone);dodockersave$img-o$(echo$img|tr/:_).tardone# 批量导入fortarin*.tar;dodockerload-i$tardone# 跨机器迁移dockersave nginx:alpine|sshuserremotedocker load9. 镜像优化建议9.1 体积优化策略说明效果使用 AlpineAlpine 基础镜像约 5MB减小 50-90%多阶段构建分离构建和运行环境减小 30-70%合并 RUN 命令减少层数减小 10-30%清理缓存rm -rf /var/cache/*减小 10-20%删除开发工具apt remove gcc make减小 20-50%9.2 安全优化# 使用指定版本而非 latestFROM nginx:1.21# 使用非 root 用户RUNuseradd-mappuserUSERappuser# 设置只读文件系统# --read-only 运行容器# 删除不必要的 SUID/SGIDRUNfind/-perm/6000-typef-execchmod000{}\;10. 常用命令速查操作命令搜索docker search拉取docker pull列出docker images查看详情docker inspect查看历史docker history删除docker rmi清理docker image prune保存docker save加载docker load导出docker export导入docker import打标签docker tag推送docker push11. 常见问题Q1: 如何删除所有none镜像dockerimage prunedockerrmi$(dockerimages-fdanglingtrue-q)Q2: 如何查看镜像的构建历史dockerhistory--no-trunc nginx:latestQ3: 镜像和容器的区别镜像静态文件不可变容器运行中的实例可写12. 小结掌握镜像的搜索、拉取、查看、删除学会镜像的导入导出和迁移合理使用标签管理版本定期清理无用镜像释放空间优化镜像体积提升部署效率

更多文章