
前言Docker镜像是容器技术的基石一切容器都是基于镜像运行。掌握镜像管理是使用Docker的必备能力。本文从镜像核心概念、常用命令操作、镜像优化、存储原理、版本标签几个维度完整梳理镜像管理知识适合入门学习和复习查阅。一、Docker镜像核心概念Docker镜像Image是只读的模板它包含运行应用程序所需要的代码、运行时、库、环境变量、配置文件。镜像本身不能直接运行镜像实例化之后就是容器容器是读写层。镜像采用分层存储机制每一次对镜像修改都会生成新层多层叠加构成完整镜像层可以复用多个镜像可以共享底层节省磁盘空间。镜像只读启动容器时Docker会在镜像最上层增加一层可读写容器层所有修改都发生在容器层不会改动底层镜像。简单理解镜像安装包容器运行起来的软件实例。同一个镜像可以启动无数个容器。二、镜像常用操作命令1. 查看本地镜像# 列出本地所有镜像dockerimages# 显示完整镜像IDdockerimages --no-trunc# 过滤查询镜像dockerimages|grepnginx2. 拉取镜像从Docker Hub镜像仓库下载镜像到本地# 拉取最新版本标签latestdockerpull nginx# 指定版本拉取强烈建议不要直接用latest版本不可控dockerpull nginx:1.25.33. 搜索镜像dockersearch nginx4. 删除镜像注意有容器在使用该镜像时镜像无法直接删除需要先删除容器# 通过镜像ID删除镜像dockerrmi 镜像ID# 强制删除dockerrmi-f镜像ID# 清理没有被使用的悬空镜像nonedockerimage prune5. 导出与导入镜像镜像迁移离线环境部署使用# 导出镜像为tar包dockersave-onginx.tar nginx:1.25.3# 导入本地tar镜像包dockerload-inginx.tar6. 根据容器生成镜像commit把正在运行的容器改动打包生成新镜像dockercommit 容器ID mynginx:v1⚠️不推荐生产大量使用commit优先使用Dockerfile构建镜像commit镜像属于黑盒镜像无法复现构建过程。7. 构建镜像Dockerfile# -t 指定镜像名字和标签 .代表Dockerfile在当前目录dockerbuild-tmyapp:v1.8. 镜像打标签、推送仓库# 给镜像打新标签dockertag myapp:v1 registry.example.com/myapp:v1# 推送到私有/公共镜像仓库dockerpush registry.example.com/myapp:v1三、Docker镜像优化镜像优化核心目标缩小镜像体积、减少漏洞、加快构建、提升部署分发速度。选择轻量化基础镜像优先选用alpine版本体积很小。例如nginx:alpine而不是完整版nginx。alpine基于musl libc注意部分程序兼容性。# 不好 FROM centos:7 # 推荐 FROM nginx:alpine合并RUN指令减少镜像层数每一个RUN会新增一层镜像尽量使用合并命令同时清理安装缓存。# 不推荐产生多层 RUN yum install -y gcc RUN yum install -y make # 推荐合并安装完清理缓存 RUN yum install -y gcc make yum clean all不要把编译工具留在最终镜像多阶段构建Multi‑stage编译阶段和运行阶段分开最终镜像只保留运行程序丢弃编译器、依赖工具极大缩小镜像。# 编译阶段 FROM golang:1.22 as builder WORKDIR /app COPY . . RUN go build -o myapp main.go # 最终运行镜像只拷贝编译产物 FROM alpine COPY --frombuilder /app/myapp /usr/local/bin/ CMD [/usr/local/bin/myapp]合理使用.dockerignore类似.gitignore构建时排除不需要的文件日志、git目录、本地编译产物、文档避免大文件打包进镜像。# .dockerignore示例 .git *.log node_modules target避免安装调试工具在生产镜像不要把gcc、git、vim等工具打包进线上镜像增大体积同时增加安全攻击面。慎用latest标签latest是动态标签实际版本随仓库变化环境会不可控生产环境必须指定明确版本号。四、镜像存储原理Docker镜像分层存储所有层保存在Docker的数据目录默认路径CentOS/RHEL/var/lib/docker/目录结构简单说明layers镜像分层数据image镜像元数据记录层之间关系containers容器读写层数据overlay2默认存储驱动存储镜像各层真实文件分层共享机制多个镜像如果有相同底层磁盘只会存一份极大节省存储空间。当删除镜像时只有没有任何镜像引用该层层才会真正释放。悬空镜像none:none构建镜像时旧镜像失去标签残留使用docker image prune清理。注意docker system prune会清理悬空镜像、停止的容器、无用网络加上-a会清理所有未被使用镜像谨慎操作。五、镜像版本与标签管理标签Tag作用一个镜像ID可以对应多个tagtag只是别名不是镜像唯一标识真正唯一标识是镜像ID。nginx:1.25主版本次版本nginx:1.25.3精确补丁版本生产首选nginx:alpine变体标签表示alpine基础系统latest镜像仓库最新上传的标签不保证稳定版本管理最佳实践✅生产环境使用完整精确版本号例如myapp:v1.2.0✅业务迭代语义化版本 v主.次.补丁测试镜像可以增加tagmyapp:v1.2.0-test✅私有仓库镜像带上仓库地址shturl.cc/C2k7yrE7p4eV7MJAX❌禁止生产环境直接依赖latest标签更新会出现版本漂移问题镜像版本生命周期开发构建打tag → push镜像仓库 → CI拉取镜像部署版本迭代出新tag旧版本镜像保留用于回滚废弃版本定期清理。六、总结Docker镜像是只读分层模板实例化为容器分层复用节省存储。日常镜像操作pull、images、rmi、save/load、build、tag、push。镜像优化核心轻量基础镜像、合并RUN、多阶段构建、.dockerignore、避免latest。存储采用overlay2驱动分层存储悬空镜像及时清理。版本标签只是别名生产环境强制指定确定版本不要依赖latest。镜像管理是Docker运维的重中之重镜像质量直接影响项目部署大小、安全、稳定性实际项目中优先Dockerfile构建镜像尽量规避docker commit黑盒镜像。