Docker 镜像是通过分层文件系统(Layered File System) 构建的,这种设计是 Docker 高效运行的核心机制。以下是二者的本质关系和工作原理:
graph LR
A[Docker 镜像] --> B[分层文件系统]
B --> C[镜像层 Layer]
B --> D[容器层 R/W Layer]
C --> E[只读文件]
D --> F[运行时修改]
镜像层(Image Layers - 只读)
每个 Docker 镜像由多个只读层堆叠而成
每层对应 Dockerfile 中的一个指令:
FROM ubuntu:22.04 # 基础层 (Layer 1)
RUN apt-get update # 操作层 (Layer 2)
COPY app /opt/app # 文件层 (Layer 3)
CMD [“/opt/app/start.sh”] # 元数据层 (Layer 4)
层内容通过 SHA256 摘要唯一标识(如 sha256:8e1134...
)
容器层(Container Layer - 读写)
存储驱动机制
docker info | grep “Storage Driver”
/var/lib/docker//
文件系统结构示例(Overlay2)
/var/lib/docker/overlay2/
├── layer1-diff/ # 层内容目录
├── layer1-link/ # 硬链接优化
├── layer2-diff/
├── merged/ # 统一视图目录
└── work/ # 临时工作区
镜像构建时的分层
sequenceDiagram
Docker Daemon->>+Builder: 解析 Dockerfile
loop 每个指令
Builder->>+Cache: 检查层缓存
alt 缓存命中
Cache–>>-Builder: 返回现有层
else 缓存未命中
Builder->>+Driver: 创建新层
Driver–>>-Builder: 返回层ID
end
end
Builder->>+Registry: 生成最终镜像
容器运行时的读写
特性 | 镜像层 (只读) | 容器层 (读写) |
---|---|---|
持久性 | 永久存储 | 容器删除即销毁 |
共享性 | 跨容器/镜像共享 | 容器独占 |
修改机制 | 不可变 | 写时复制(CoW) |
存储位置 | /var/lib/docker/overlay2 | 内存 + 临时存储 |
大小影响 | 决定基础镜像大小 | 影响容器运行时磁盘占用 |
空间效率
docker system df -v
构建速度优化
网络传输优化
docker pull/push
只传输缺失层查看镜像分层
docker image inspect nginx:latest --format ‘{{json .RootFS.Layers}}’ | jq
追踪文件来源
docker run -it nginx sh -c “cat /proc/self/mountinfo | grep merged”
分析层内容
ls /var/lib/docker/overlay2//diff
大文件优化
COPY huge-file.tar /data # 每次修改都创建新层
COPY huge-file.tar /tmp
RUN tar -xf /tmp/huge-file.tar -C /data && rm /tmp/huge-file.tar
跨层删除问题
RUN apt-get install -y build-essential
RUN apt-get remove -y build-essential # 不减少镜像大小!
RUN apt-get update &&
apt-get install -y build-essential &&
apt-get remove -y build-essential &&
apt-get autoremove -y
操作 | 无分层系统 | Docker分层系统 | 提升幅度 |
---|---|---|---|
启动100个容器 | 50s | 5s | 10x |
500MB镜像更新 | 500MB | 5MB (仅改1%) | 100x |
磁盘空间占用 | 100GB | 15GB (共享) | 85%↓ |
本质结论:
Docker 镜像 = 堆叠的只读文件系统层 + 元数据描述
容器 = 镜像层只读副本 + 可写容器层
这种分层架构实现了高效存储、快速部署和资源隔离三位一体的核心价值。