第04章:Docker 镜像管理

第04章:Docker 镜像管理

第04章:Docker 镜像管理

本章目标:全面掌握 Docker 镜像的搜索、拉取、查看、构建、推送等操作,理解镜像标签和分层的管理策略。


4.1 镜像的命名规范

4.1.1 镜像名称的组成

[registry-host[:port]/][namespace/]repository[:tag|@digest] 完整格式示例: docker.io/library/nginx:latest registry.cn-hangzhou.aliyuncs.com/myproject/myapp:v1.0 ghcr.io/owner/repo:sha-abc123
组成部分说明默认值
registry-host镜像仓库地址docker.io(Docker Hub)
namespace命名空间/组织library(官方镜像)
repository镜像名称必填
tag标签(版本号)latest
digest内容哈希

4.1.2 官方镜像 vs 第三方镜像

# 官方镜像(省略 namespace 和 registry)dockerpull nginx# 等价于 docker.io/library/nginx:latest# 第三方镜像(需要指定 namespace)dockerpull bitnami/nginx# docker.io/bitnami/nginx:latest# 私有仓库镜像(需要指定 registry 地址)dockerpull registry.example.com:5000/myproject/myapp:v1.0

4.2 镜像的基本操作

4.2.1 搜索镜像

# 从 Docker Hub 搜索dockersearch nginx# 指定仓库搜索dockersearch bitnami/nginx# 按星标数过滤dockersearch--filter=stars=100nginx# 限制输出数量dockersearch--limit5nginx

4.2.2 拉取镜像

# 拉取最新版本(默认)dockerpull nginx# 拉取指定版本标签dockerpull nginx:1.25dockerpull nginx:1.25-alpine# 拉取指定平台的镜像dockerpull--platformlinux/amd64 nginx:latest# 通过 digest 拉取(精确版本)dockerpull nginx@sha256:abc123def456...# 从指定仓库拉取dockerpull registry.cn-hangzhou.aliyuncs.com/library/nginx:latest

4.2.3 查看本地镜像

# 列出所有本地镜像dockerimagesdockerimagels# 以表格形式显示更多信息dockerimages--format"table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedSince}}"# 输出示例:# REPOSITORY TAG SIZE CREATEDSINCE# nginx 1.25 187MB 2 weeks ago# nginx 1.25-alpine 41MB 2 weeks ago# python 3.11 912MB 3 weeks ago# ubuntu 22.04 77.8MB 1 month ago# 过滤镜像dockerimages--filter"dangling=true"# 悬空镜像(无标签)dockerimages--filter"reference=nginx:*"# 指定仓库的镜像dockerimages--filter"before=ubuntu:22.04"# 在某个镜像之前创建的dockerimages--filter"since=ubuntu:22.04"# 在某个镜像之后创建的# 显示镜像 IDdockerimages-q

4.2.4 查看镜像详情

# 查看镜像完整元数据(JSON 格式)dockerimage inspect nginx:latest# 查看镜像的层信息dockerhistorynginx:latest# 查看镜像大小dockerimage inspect nginx:latest--format'{{.Size}}'# 输出: 187425608 (字节)# 转换为可读格式dockersystemdf-v# 查看所有镜像的详细大小

4.2.5 删除镜像

# 删除指定镜像dockerrmi nginx:latestdockerimagermnginx:latest# 批量删除dockerrmi$(dockerimages-q)# 删除所有镜像dockerrmi$(dockerimages--filter"dangling=true"-q)# 删除悬空镜像dockerimages-q--filter"reference=nginx*"|xargsdockerrmi# 删除 nginx 相关镜像# 强制删除(即使有容器在使用)dockerrmi-fnginx:latest

4.3 镜像标签管理

4.3.1 什么是镜像标签

标签(Tag)是给镜像起的"别名",用于标识不同版本:

nginx:1.25 ← 精确版本 nginx:1.25-alpine ← 精确版本 + 变体 nginx:latest ← 最新版本(不推荐生产使用) nginx ← 等价于 nginx:latest

4.3.2 为镜像打标签

# 给已有镜像打标签(相当于创建了一个新引用)dockertag nginx:latest myregistry.com/nginx:v1.0dockertag nginx:latest myregistry.com/nginx:production# 标签不影响镜像内容,只是额外的引用dockerimages myregistry.com/nginx# REPOSITORY TAG SIZE# myregistry.com/nginx v1.0 187MB# myregistry.com/nginx production 187MB# nginx latest 187MB ← 原始标签仍在

4.3.3 标签策略最佳实践

策略示例适用场景
语义化版本v1.2.3正式发布
Git SHAcommit-a1b2c3d开发版本
日期标签2024.06.15定期构建
环境标签stagingproduction环境区分
多标签同时打v1.2.3latest灵活引用
# 推荐:为同一镜像打多个标签dockertag myapp:build-123 myregistry.com/myapp:v1.2.3dockertag myapp:build-123 myregistry.com/myapp:latest

4.4 镜像的导入与导出

4.4.1 导出为 tar 文件

# 将镜像导出为 tar 文件dockersave-onginx-backup.tar nginx:latestdockersave nginx:latest>nginx-backup.tar# 导出多个镜像dockersave-oimages-backup.tar nginx:latest python:3.11 ubuntu:22.04# 导出所有镜像dockersave-oall-images.tar$(dockerimages-q)

4.4.2 从 tar 文件导入

# 从 tar 文件导入镜像dockerload-inginx-backup.tardockerload<nginx-backup.tar# 导入后查看dockerimages|grepnginx

4.4.3 容器导出为镜像

# 将运行中的容器状态导出为新镜像# Step 1: 启动容器并做一些修改dockerrun-itubuntu:22.04 /bin/bash# 在容器内安装一些软件...apt-getupdate&&apt-getinstall-yvimcurlexit# Step 2: 导出容器为 tardockerexport<container-id>>my-ubuntu.tar# Step 3: 将 tar 导入为新镜像dockerimportmy-ubuntu.tar my-ubuntu:v1.0# 注意:export 会丢失镜像的元数据(如 CMD、ENV 等)# 建议优先使用 docker commit

4.4.4 save vs export 对比

特性docker savedocker export
输入镜像(image)容器(container)
输出保留所有层和元数据合并为单层,丢失元数据
导入命令docker loaddocker import
适用场景备份、迁移镜像创建简单的文件系统快照

4.5 镜像构建:commit 方式

4.5.1 docker commit 原理

# 基于容器的修改创建新镜像dockercommit[OPTIONS]CONTAINER[REPOSITORY[:TAG]]# 示例:# Step 1: 启动一个容器dockerrun-itubuntu:22.04 /bin/bash# Step 2: 在容器中安装软件apt-getupdateapt-getinstall-ypython3 python3--version# Step 3: 退出容器exit# Step 4: 基于容器创建镜像dockercommit<container-id>my-ubuntu-python:v1.0# Step 5: 验证dockerrun-itmy-ubuntu-python:v1.0 python3--version# Python 3.10.12

4.5.2 commit 的局限性

问题说明
不可追溯无法知道镜像经历了哪些变更
不可重复手动操作难以精确复现
体积膨胀无法利用缓存机制优化
不符合最佳实践应该使用 Dockerfile 构建

⚠️企业级规范:生产环境应使用 Dockerfile 构建镜像,docker commit 仅用于临时调试。


4.6 清理无用镜像

4.6.1 悬空镜像(Dangling Images)

# 悬空镜像:没有标签指向的镜像层# 通常在重新构建镜像后产生# 查看悬空镜像dockerimages-f"dangling=true"# 删除所有悬空镜像dockerimage prune# 同时删除未被容器使用的镜像dockerimage prune-a

4.6.2 一键清理

# 清理所有未使用的资源(镜像、容器、网络、构建缓存)dockersystem prune# 更激进的清理(包括所有未使用的卷)dockersystem prune-a--volumes# 查看 Docker 磁盘使用情况dockersystemdfdockersystemdf-v# 详细信息

4.6.3 磁盘使用分析

# 查看各类型资源占用dockersystemdf# TYPE TOTAL ACTIVE SIZE RECLAIMABLE# Images 15 5 2.8GB 1.9GB (67%)# Containers 8 3 150MB 120MB (80%)# Local Volumes 10 4 2.1GB 1.5GB (71%)# Build Cache 50 0 3.2GB 3.2GB (100%)# 按大小排序查看镜像dockerimages--format"{{.Repository}}:{{.Tag}}\t{{.Size}}"|sort-t$'\t'-k2-h-r

4.7 镜像安全扫描

4.7.1 使用 Docker Scout

# Docker Scout 是 Docker 官方的镜像安全扫描工具dockerscout cves nginx:latestdockerscout recommendations nginx:latest

4.7.2 使用 Trivy(开源工具)

# 安装 Trivy# macOSbrewinstalltrivy# Linuxsudoapt-getinstalltrivy# 扫描镜像漏洞trivy image nginx:latest trivy image--severityHIGH,CRITICAL nginx:latest# 输出 JSON 格式报告trivy image-fjson-oreport.json nginx:latest

4.8 动手实验

实验 4.1:镜像的基本操作

# 1. 搜索并拉取镜像dockersearch pythondockerpull python:3.11-slim# 2. 查看本地镜像dockerimages python# 3. 查看镜像历史dockerhistorypython:3.11-slim# 4. 导出镜像dockersave python:3.11-slim>python-backup.tarls-lhpython-backup.tar# 5. 删除镜像dockerrmi python:3.11-slimdockerimages|greppython# 确认已删除# 6. 从备份恢复dockerload<python-backup.tardockerimages python

实验 4.2:使用 commit 构建自定义镜像

# 1. 启动基础容器dockerrun-it--namemy-custom ubuntu:22.04 /bin/bash# 2. 在容器内安装软件apt-getupdateapt-getinstall-ycurlvimgitmkdir-p/appecho"Hello Custom Image">/app/hello.txt# 3. 退出容器exit# 4. 基于容器创建镜像dockercommit-m"Added curl vim git"my-custom my-ubuntu-custom:v1.0# 5. 验证新镜像dockerrun--rmmy-ubuntu-custom:v1.0cat/app/hello.txt# Hello Custom Imagedockerrun--rmmy-ubuntu-custom:v1.0curl--version# 6. 清理dockerrmmy-custom

实验 4.3:磁盘清理

# 1. 查看磁盘使用dockersystemdf# 2. 创建一些悬空镜像foriin{1..5};dodockerbuild-ttest-$i-<<EOF FROM alpine:latest RUN echo "test$i" EOFdone# 3. 查看悬空镜像dockerimages-f"dangling=true"# 4. 清理悬空镜像dockerimage prune-f# 5. 最终清理dockersystem prune-f

4.9 本章小结

操作命令说明
搜索docker search在仓库中搜索镜像
拉取docker pull下载镜像到本地
列表docker images查看本地镜像
详情docker inspect查看镜像完整元数据
历史docker history查看镜像的构建历史
标签docker tag为镜像添加标签
导出docker save导出为 tar 文件
导入docker load从 tar 文件导入
提交docker commit基于容器创建镜像
删除docker rmi删除镜像
清理docker image prune清理无用镜像

4.10 课后练习

  1. 基础题:拉取 3 个不同镜像(nginx、python、redis),查看它们的层结构和大小。
  2. 操作题:使用 docker save/load 完成镜像的备份和恢复流程。
  3. 进阶题:使用 Trivy 扫描 nginx:latest 镜像,分析其安全漏洞情况。

📖 下一章:Dockerfile 深度解析 —— 掌握企业级 Dockerfile 编写技能