Day5 · Docker存储
今日重点:理解 docker 存储驱动、Volume 管理与数据持久化方案。
一、docker 存储驱动(Storage Driver)
docker 使用存储驱动来管理镜像层与容器可写层的存储格式。
常见驱动
| 驱动 | 文件系统 | 适用场景 |
|---|---|---|
| overlay2 | overlayfs | 推荐,主流 Linux 发行版默认 |
| aufs | aufs | Ubuntu 旧版,性能一般 |
| devicemapper | device-mapper | RHEL/CentOS,thin provisioning |
| btrfs | btrfs | 快照场景 |
| zfs | zfs | 企业级存储 |
overlay2 原理(重点)
镜像层(只读) ← 共享,多个容器复用
↓
容器可写层(读写) ← 每个容器独立
↓
UpperDir ← 写操作落在这里
LowerDir ← 只读镜像层
MergedDir ← 最终挂载给容器的视图
- 写时复制(CoW):只读层不复制,写时才创建新层
- 写时分配:按需分配空间
docker info | grep "Storage Driver"
二、docker Volume 管理
为什么需要 Volume?
容器可写层随容器删除而丢失,Volume 是持久化数据的唯一可靠方式。
三种持久化方式对比
| 方式 | 生命周期 | 跨容器共享 | 备份难度 | 推荐 |
|---|---|---|---|---|
| 容器可写层 | 随容器销毁 | ❌ | 难 | 临时数据 |
| 匿名 Volume | 独立于容器 | ❌ | 中 | 少用 |
| 命名 Volume | 独立于容器 | ✅ | 易 | 推荐 |
| Bind Mount | 绑定宿主机目录 | ✅ | 易 | 配置文件 |
Volume 操作命令
docker volume create my-data
docker volume ls
docker volume inspect my-data
docker volume rm my-data
docker volume prune
使用 Volume
docker run -d --name nginx \
--mount source=my-data,target=/usr/share/nginx/html \
nginx:alpine
三、Bind Mount(绑定挂载)
把宿主机目录直接映射到容器内,开发最常用:
docker run -d -p 3000:3000 -v /home/user/myapp:/app node:20 npm start
⚠️ 会覆盖容器内目标目录原有内容!
四、tmpfs Mount
# 敏感数据只存内存,不落盘
docker run --tmpfs /run/secrets nginx:alpine
五、Volume 数据备份与恢复
# 备份
docker run --rm -v my-data:/source -v /backup:/backup alpine \
tar czf /backup/my-data.tar.gz -C /source .
# 恢复
docker run --rm -v my-data:/target -v /backup:/backup alpine \
tar xzf /backup/my-data.tar.gz -C /target
六、面试高频
| 问题 | 要点 |
|---|---|
| overlay2 原理 | CoW + 写时分配,Upper/Lower/Merged |
| Volume vs Bind Mount | Volume docker 管理;Bind Mount 直连宿主机 |
| 数据持久化选型 | 生产用 Named Volume;开发用 Bind Mount |
| Volume 删除规则 | 命名 Volume 不随容器删除;-v 才删除匿名 Volume |