第四篇:《Docker 镜像:分层结构、拉取与推送》

第四篇:《Docker 镜像:分层结构、拉取与推送》 镜像是 Docker 的基石。要高效使用 Docker必须理解镜像的分层文件系统、写时复制机制以及常用操作命令。本文将详细讲解镜像的存储结构、如何拉取、推送、构建镜像以及镜像的导入导出技巧。一、镜像的本质Docker 镜像是一个只读的、分层的文件系统。它包含了运行应用程序所需的所有内容代码、运行时、系统工具、库和配置文件。镜像不包含内核因为它共享宿主机的内核。二、分层存储与写时复制Copy-on-Write2.1 UnionFS联合文件系统Docker 镜像使用 UnionFS如 OverlayFS、AUFS将多个目录层“联合”挂载为一个虚拟文件系统。每一层都是只读的只有容器运行时会在最顶层增加一个可写层。举例一个 Nginx 镜像可能包含以下层Layer 1: Ubuntu 基础系统Layer 2: 安装 gcc 等编译工具Layer 3: 编译安装 nginxLayer 4: 删除编译工具虽然删除动作也是新层但最终文件系统中看不见2.2 写时复制CoW机制当容器读取文件时从上到下查找优先读取可写层如果存在修改。当容器修改文件时会将该文件从下层只读层复制到可写层然后修改。这大大节省了容器启动时间和磁盘空间。2.3 分层的好处节省磁盘空间多个容器可以共享相同的基础镜像层只需额外存储变化的层。加速构建与推送若某层未变化构建和推送时可利用缓存只传输变化的层。便于回滚镜像的历史层记录了每次变更。三、镜像命名规范镜像完整名称格式为text[registry-host]/[namespace]/[repository]:[tag]registry-host仓库服务器地址默认 docker.io。namespace命名空间用户或组织默认 library 对应官方镜像。repository仓库名。tag标签默认为 latest。示例nginx:latest → docker.io/library/nginx:latestmyregistry.example.com:5000/myteam/myapp:v1.0四、常用镜像操作命令4.1 拉取镜像pull# 拉取最新版dockerpull nginx# 拉取指定版本dockerpull alpine:3.18# 从私有仓库拉取dockerpull myregistry.com:5000/myapp:v14.2 列出本地镜像dockerimages# 或dockerimagels输出包含REPOSITORY、TAG、IMAGE ID、CREATED、SIZE。4.3 查看镜像详细信息dockerinspect nginx可以获取镜像的元数据环境变量、暴露端口、创建历史等。4.4 删除镜像dockerrmi nginx# 按名称删除dockerrmiimage_id# 按 ID 删除dockerimage prune# 清除 dangling 镜像无标签的中间层dockersystem prune-a# 清除所有未使用的镜像、容器、网络、卷危险删除镜像前需先删除使用该镜像的容器即使容器已停止也要先dockerrm。4.5 给镜像打标签tag# 为本地镜像添加新的标签dockertag nginx mynginx:v1# 准备推送到私有仓库时dockertag myapp:latest myregistry.com:5000/myteam/myapp:latest4.6 推送镜像到仓库push# 登录仓库Docker Hub 或私有仓库dockerlogin# 推送dockerpush myregistry.com:5000/myteam/myapp:latest4.7 镜像导出与导入无仓库场景# 导出镜像到 tar 文件dockersave-onginx.tar nginx:latest# 加载镜像dockerload-inginx.tardockersave 保存完整的历史层dockerexport导出容器为单层文件一般不用。五、查看镜像分层历史dockerhistorynginx:latest --no-trunc输出每一层的创建命令、大小。这有助于分析镜像为什么那么大。六、镜像大小优化为什么 Alpine 受欢迎Alpine Linux 是一个非常小的 Linux 发行版仅 5MB 左右使用 musl libc 和 busybox。与 Ubuntu 基础镜像~70MB相比Alpine 能极大减小镜像体积。示例 DockerfiledockerfileFROM alpine:3.18RUN apk add --no-cache nginx七、实战本地私有镜像仓库# 启动私有仓库容器dockerrun-d-p5000:5000--nameregistry registry:2# 打标签并推送dockertag alpine:3.18 localhost:5000/my-alpinedockerpush localhost:5000/my-alpine# 从私有仓库拉取dockerpull localhost:5000/my-alpine八、常见问题与解决九、小结本文讲解了 Docker 镜像的分层结构、写时复制原理、命名规范以及常用操作命令。掌握这些知识后你就能高效地管理本地及远程镜像。