一、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 /

迁移

  1. 停止使用volume的容器
  2. 启动新容器并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

五、核心要点总结

  1. Storage Driver:管理镜像层和容器层,适合无状态应用,具有Copy-on-Write特性
  2. Data Volume:持久化数据存储,适合有状态应用
  3. bind mount:灵活但移植性差,可挂载单个文件
  4. docker managed volume:移植性好,由Docker自动管理
  5. volume container:解耦容器与host路径,便于标准化配置
  6. data-packed volume container:自包含,最适合分发静态数据
  7. volume管理:备份/恢复本质是文件操作,销毁需注意孤儿volume清理
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐