Docker 存储核心:Data Volume 类型详解、数据共享方案与生命周期管理
·
一、Docker的两类存储资源
Docker为容器提供两种存放数据的资源:
1. Storage Driver(存储驱动)
- 管理对象:镜像层和容器层
- 核心特性:Copy-on-Write(写时复制)
- 新数据直接存放在容器层
- 修改现有数据时,先从镜像层复制到容器层,再修改
- 多个层有同名文件时,用户只能看到最上层
- 常用驱动:overlay2(CentOS默认)、AUFS、DeviceMapper、Btrfs等
- 数据位置:
/var/lib/docker - 适用场景:无状态应用(如busybox工具箱)
2. Data Volume(数据卷)
- 本质:Docker Host文件系统中的目录或文件
- 特点:
- 可直接mount到容器文件系统
- 容器可读写volume中的数据
- 数据可永久保存,即使容器销毁
- 容量:取决于文件系统未使用空间,无法单独设置限额
- 适用场景:有状态应用,需要持久化数据(如数据库)
二、Data Volume的两种类型
| 特性 | bind mount | docker managed volume |
|---|---|---|
| volume位置 | 可任意指定 | /var/lib/docker/volumes/... |
| 对已有mount point影响 | 隐藏并替换原数据 | 原数据复制到volume中 |
| 是否支持单个文件 | 支持 | 不支持,只能是目录 |
| 权限控制 | 可设置为只读(ro),默认可读写 | 无控制,均为读写权限 |
| 移植性 | 弱,与host path绑定 | 强,无需指定host目录 |
bind mount 示例
# 挂载目录
docker run -d -p 80:80 -v ~/htdocs:/usr/local/apache2/htdocs httpd
# 只读挂载
docker run -d -p 80:80 -v ~/htdocs:/usr/local/apache2/htdocs:ro httpd
# 挂载单个文件
docker run -d -p 80:80 -v ~/htdocs/index.html:/usr/local/apache2/htdocs/new_index.html httpd
docker managed volume 示例
# 不指定host路径,Docker自动创建volume
docker run -d -p 80:80 -v /usr/local/apache2/htdocs httpd
三、数据共享方式
1. 容器与Host共享数据
- bind mount:直接挂载要共享的目录
- docker managed volume:使用
docker cp命令拷贝数据
# 从host拷贝到容器
docker cp ~/htdocs/index.html 容器ID:/usr/local/apache2/htdocs/
2. 容器之间共享数据
方式一:bind mount(多个容器挂载同一host目录)
docker run --name web1 -d -p 80 -v ~/htdocs:/usr/local/apache2/htdocs httpd
docker run --name web2 -d -p 80 -v ~/htdocs:/usr/local/apache2/htdocs httpd
方式二:Volume Container
创建一个专门用于提供volume的容器,其他容器通过--volumes-from使用
# 创建volume container
docker create --name vc_data -v ~/htdocs:/usr/local/apache2/htdocs -v /other/tools busybox
# 其他容器使用
docker run --name web1 -d -p 80 --volumes-from vc_data httpd
方式三:Data-Packed Volume Container
将数据打包到镜像中,自包含,移植性强
FROM busybox:latest
ADD htdocs /usr/local/apache2/htdocs
VOLUME /usr/local/apache2/htdocs
# 创建data-packed volume container
docker create --name vc_data datapacked
# 其他容器使用
docker run -d -p 80:80 --volumes-from vc_data httpd
四、Volume生命周期管理
备份
Volume本质是host文件系统目录,直接备份对应目录即可
# 示例:备份registry数据
tar -czf registry_backup.tar.gz /myregistry
恢复
# 将备份数据恢复到目录
tar -xzf registry_backup.tar.gz -C /
迁移
- 停止使用volume的容器
- 启动新容器并mount原有volume
销毁
| 类型 | 销毁方式 |
|---|---|
| bind mount | 由host负责手动删除 |
| docker managed volume | docker rm -v 容器名(删除容器时带-v)docker volume rm 卷名docker volume prune(批量删除孤儿volume) |
# 查看所有volume
docker volume ls
# 删除孤儿volume
docker volume rm $(docker volume ls -q)
docker volume prune
五、核心要点总结
- Storage Driver:管理镜像层和容器层,适合无状态应用,具有Copy-on-Write特性
- Data Volume:持久化数据存储,适合有状态应用
- bind mount:灵活但移植性差,可挂载单个文件
- docker managed volume:移植性好,由Docker自动管理
- volume container:解耦容器与host路径,便于标准化配置
- data-packed volume container:自包含,最适合分发静态数据
- volume管理:备份/恢复本质是文件操作,销毁需注意孤儿volume清理
更多推荐



所有评论(0)