2.2 Docker底层原理深度剖析:UnionFS、镜像层、容器层三层架构详解
引言
Docker的镜像和容器基于Union File System(联合文件系统)实现。理解UnionFS的工作原理,特别是镜像层、容器层的三层架构,是掌握Docker的关键。本文将深入剖析Docker的底层存储机制。
一、Union File System概述
1.1 什么是UnionFS
UnionFS是一种文件系统,允许将多个目录(分支)叠加在一起,形成一个统一的文件系统视图。
1.2 UnionFS的特点
- 叠加性:多个文件系统可以叠加
- 写时复制:修改时创建新文件
- 分层存储:支持只读层和可写层
二、Docker的三层架构
2.1 架构图
┌─────────────────────────────────────┐ │ 容器层 (Container Layer) │ ← 可写层 │ (可读写,生命周期短) │ ├─────────────────────────────────────┤ │ 镜像层 (Image Layers) │ ← 只读层 │ (只读,可复用) │ │ ┌──────────┐ ┌──────────┐ │ │ │ Layer 3 │ │ Layer 2 │ │ │ └──────────┘ └──────────┘ │ │ ┌──────────┐ │ │ │ Layer 1 │ │ │ └──────────┘ │ ├─────────────────────────────────────┤ │ 基础层 (Base Layer) │ │ (操作系统基础) │ └─────────────────────────────────────┘2.2 各层说明
- 基础层:操作系统基础文件
- 镜像层:应用程序和依赖,只读
- 容器层:运行时的修改,可写
三、镜像层详解
3.1 镜像层的特点
- 只读:镜像层是只读的
- 共享:多个容器可以共享同一镜像层
- 增量:每层只包含相对于上一层的变更
3.2 查看镜像层
# 查看镜像历史dockerhistorynginx:latest# 查看镜像详细信息dockerinspect nginx:latest# 查看镜像层dockerimage inspect nginx:latest --format='{ {.RootFS.Layers}}'3.3 镜像层存储位置
# 查看存储驱动dockerinfo|grep"Storage Driver"# Overlay2存储位置(Linux)/var/lib/docker/overlay2/# 查看镜像层目录结构ls-la /var/lib/docker/overlay2/四、容器层详解
4.1 容器层的特点
- 可写:容器层是可读写的
- 临时:容器删除时,容器层也会删除
- 写时复制:修改文件时创建副本
4.2 容器层操作
# 在容器中创建文件dockerrun -it alpineshecho"test">/tmp/test.txt# 查看容器层变化dockerdiff<container_id># 提交容器层为新镜像dockercommit<container_id>myimage:latest4.3 容器层存储
# 查看容器层dockerinspect<container_id>|grep-A10"GraphDriver"# Overlay2容器层位置/var/lib/docker/overlay2/<container_id>/五、写时复制(Copy-on-Write)
5.1 CoW原理
当容器需要修改文件时:
- 检查文件是否在容器层
- 如果不在,从镜像层复制到容器层
- 在容器层进行修改
5.2 CoW示例
# 创建容器dockerrun -d --nametestalpinesleep3600# 在容器中修改文件dockerexectestsh-c"echo 'modified' > /etc/hostname"# 查看变化dockerdifftest# 输出:C /etc (Changed)# A /etc/hostname (Added)5.3 CoW性能影响
- 优点:节省存储空间,快速创建容器
- 缺点:首次写入有性能开销
六、存储驱动对比
6.1 常用存储驱动
| 存储驱动 | 特点 | 适用场景 |
|---|---|---|
| overlay2 | 性能好,支持多层 | 推荐使用 |
| aufs | 老版本使用 |