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

镜像是 Docker 的基石。要高效使用 Docker,必须理解镜像的分层文件系统、写时复制机制以及常用操作命令。本文将详细讲解镜像的存储结构、如何拉取、推送、构建镜像,以及镜像的导入导出技巧。

一、镜像的本质

Docker 镜像是一个只读的、分层的文件系统。它包含了运行应用程序所需的所有内容:代码、运行时、系统工具、库和配置文件。镜像不包含内核,因为它共享宿主机的内核。

二、分层存储与写时复制(Copy-on-Write)

2.1 UnionFS(联合文件系统)

Docker 镜像使用 UnionFS(如 OverlayFS、AUFS)将多个目录层"联合"挂载为一个虚拟文件系统。每一层都是只读的,只有容器运行时会在最顶层增加一个可写层。

举例:一个 Nginx 镜像可能包含以下层:

Layer 1: Ubuntu 基础系统

Layer 2: 安装 gcc 等编译工具

Layer 3: 编译安装 nginx

Layer 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:latest

myregistry.example.com:5000/myteam/myapp:v1.0

四、常用镜像操作命令

4.1 拉取镜像(pull)

bash 复制代码
# 拉取最新版
docker pull nginx

# 拉取指定版本
docker pull alpine:3.18

# 从私有仓库拉取
docker pull myregistry.com:5000/myapp:v1

4.2 列出本地镜像

bash 复制代码
docker images
# 或
docker image ls

输出包含:REPOSITORY、TAG、IMAGE ID、CREATED、SIZE。

4.3 查看镜像详细信息

bash 复制代码
docker inspect nginx

可以获取镜像的元数据(环境变量、暴露端口、创建历史等)。

4.4 删除镜像

bash 复制代码
docker rmi nginx          # 按名称删除
docker rmi <image_id>     # 按 ID 删除
docker image prune         # 清除 dangling 镜像(无标签的中间层)
docker system prune -a     # 清除所有未使用的镜像、容器、网络、卷(危险!)
删除镜像前,需先删除使用该镜像的容器(即使容器已停止也要先 docker rm)。

4.5 给镜像打标签(tag)

bash 复制代码
# 为本地镜像添加新的标签
docker tag nginx mynginx:v1

# 准备推送到私有仓库时
docker tag myapp:latest myregistry.com:5000/myteam/myapp:latest

4.6 推送镜像到仓库(push)

bash 复制代码
# 登录仓库(Docker Hub 或私有仓库)
docker login

# 推送
docker push myregistry.com:5000/myteam/myapp:latest

4.7 镜像导出与导入(无仓库场景)

bash 复制代码
# 导出镜像到 tar 文件
docker save -o nginx.tar nginx:latest

# 加载镜像
docker load -i nginx.tar
docker save 保存完整的历史层;docker export 导出容器为单层文件(一般不用)。

五、查看镜像分层历史

bash 复制代码
docker history nginx:latest --no-trunc

输出每一层的创建命令、大小。这有助于分析镜像为什么那么大。

六、镜像大小优化:为什么 Alpine 受欢迎?

Alpine Linux 是一个非常小的 Linux 发行版(仅 5MB 左右),使用 musl libc 和 busybox。

与 Ubuntu 基础镜像(~70MB)相比,Alpine 能极大减小镜像体积。

示例 Dockerfile:

dockerfile

FROM alpine:3.18

RUN apk add --no-cache nginx
七、实战:本地私有镜像仓库

bash 复制代码
# 启动私有仓库容器
docker run -d -p 5000:5000 --name registry registry:2

# 打标签并推送
docker tag alpine:3.18 localhost:5000/my-alpine
docker push localhost:5000/my-alpine

# 从私有仓库拉取
docker pull localhost:5000/my-alpine

八、常见问题与解决

九、小结

本文讲解了 Docker 镜像的分层结构、写时复制原理、命名规范以及常用操作命令。掌握这些知识后,你就能高效地管理本地及远程镜像。

相关推荐
Elastic 中国社区官方博客21 分钟前
Elastic 在 Everest Group 企业搜索产品 PEAK Matrix® 评估 2026 中被评为领导者
大数据·运维·人工智能·elasticsearch·搜索引擎·ai·全文检索
程序员在囧途21 分钟前
likeadmin-api API 中转站怎么做统一报价?从 /pricing、/user/balance 到 task_id 回执的落地方法
运维·服务器·数据库·likeadmin-api·api中转站·token计费
想你依然心痛1 小时前
Linux用户空间与内核空间通信:netlink、ioctl、mmap 零拷贝与性能对比
linux·运维·服务器
沉静的小伙1 小时前
在微服务中使用领域事件
java·运维·微服务
满意的星月2 小时前
基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)
docker·微服务·架构
wenzhangli72 小时前
oodAgent 4.0 Skills分布式调度 — 从Code Agent实战看自主维护的Agent网络
运维·网络·人工智能·自动化
做个文艺程序员2 小时前
Linux第12篇:性能监控与瓶颈分析——CPU/内存/IO/网络全维度
linux·运维·网络
K姐研究社3 小时前
OiiOii 2.0 实测 – 智能画布实现 AI 视频创作自动化
运维·人工智能·自动化
HAPPY酷3 小时前
【ROS2】 Conda 环境搭建(命令行版)
linux·运维·python·ubuntu·机器人·conda
bukeyiwanshui3 小时前
20260624 k8s pod命令
云原生·容器·kubernetes