08、Docker 数据卷管理

08、Docker 数据卷管理

什么是数据卷?

​ 简单来说:就是对docker的容器与主机同步数据,实现容器的数据持久化操作。

​ 数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或者多个容器提供访问,数据卷设计的目的,在于数据的永久存储,它完全独立于容器的生存周期,因此,docker 不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理,同一个数据卷可以只支持多个容器的访问。

数据卷的特点:

  1. 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会被拷贝到新初始化的数据卷中
  2. 数据卷可以在容器之间共享和重用
  3. 可以对数据卷里的内容直接进行修改
  4. 数据卷的变化不会影响镜像的更新
  5. 卷会一直存在,即使挂载数据卷的容器已经被删除

0、创建数据卷

docker提供volume子命令来管理数据卷,如下命令可以快速的在本地创建一个数据卷:

1
docker volume create -d local test

此时/var/lib/docker/volumes下会发现所创建的数据卷位置

除了create命令,还有inspect(查看详细信息)、ls(列出已有数据卷)、prune(清理无用数据卷)、rm(删除数据卷)等。

1、为容器绑定数据卷

在使用docker run命令时,可以使用-mount选项来使用数据卷。

-mount选项支持三种类型的数据卷:

  • volume:普通数据卷,映射到主句/var/lib/docker/volumes路径下
  • bind:绑定数据卷,映射到主机指定路径下
  • tmpfs:临时数据卷,只存在于内存中
1
docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/wenapp training/webapp python app.py

上述命令等同于使用旧的-v标记可以再容器内创建一个数据卷:

1
2
docker run -v /datavolume:/data -it centos /bin/bash
# 注:~/datavolume 为宿主机目录,/data 为 docker 启动的 volume 容器的里的目录,这样在宿主机的/datavolume 目录下创建的数据就会同步到容器的/data 目录下

注意:本地的路径必须是绝对路径,容器内的路径可以为相对路径。如果目录不存在,docker会自动创建。

docker挂载数据卷的默认权限为读写(rw),用户也可以通过ro指定为只读:

1
docker run -d -P --name web -v /webapp:/opt/webapp:ro training/webapp python app.py

加了ro之后,容器内对所挂载数据卷内的数据就无法修改了。

​ 注意:如果直接挂载一个文件,在使用文件编辑工具(vi,sed等)之后,可能会造成文件inode的改变。从docker1.1.0起,这会导致报错误信息,所以推荐直接挂载文件所在的目录到容器内。

2、Docker 的数据卷容器共享

什么是数据卷容器: 命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器

1
2
3
4
5
6
7
# 挂载数据卷容器的方法 
docker run --volumes-from [container name]
例: 这个--volumes-from后面跟的是容器的名称。
docker run --name data-volume -itd volume(volume 这个镜像是上面创建的带两个数据卷
/datavolume3/ddatavolume6 的镜像)

docker run --name data-volume2 --volumes-from data-volume -itd centos /bin/bash

注意:使用–volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态

​ 如果删除了挂载的容器(dbdata、db1、db2),数据卷并不会被自动删除。要删除它,必须在删除最后一个挂载着他的容器时显示使用docker rm -v命令来指定删除关联的容器。

使用数据卷容器可以让用户在容器之间自由的升级和移动数据卷。

3、docker 数据卷的备份和还原

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 数据备份方法:
docker run --volumes-from [镜像--name名字] -v $(pwd):/backup [镜像名称] tar czvf /backup/[包名称].tar [container data volume]

例子:
docker run --volumes-from data-volume2 -v /root/backup:/backup --name datavolume-copy centos tar zcvf /backup/data-volume2.tar.gz /datavolume6

docker run -tid --rm --volumes-from appname-minio4-1 -v $(pwd):/backup minio/minio:latest tar cvf /backup/backup.tar /data/minio/data4


# 数据还原方法:
docker run --volumes-from [container name] -v $(pwd):/backup centos tar xzvf /backup/backup.tar.gz [container data volume]

例:
docker exec -it data-volume2 /bin/bash
cd /datavolume6
rm -rf lucky.txt

docker run --volumes-from data-volume2 -v /root/backup/:/backup centos tar zxvf
/backup/data-volume2.tar.gz -C /datavolume6

docker exec -it data-volum2 /bin/bash
cd /datavolum6
# 可以看到还原后的数据

4、总结

​ 数据是宝贵的。即使容器出现问题,我们也可以通过数据卷和数据卷容器对容器内的数据进行共享、迁移、备份等,快速地恢复项目或程序的运行。

​ 另外,在生产环境中,除了使用数据卷和数据卷容器之外,还可以定期对主机数据进行备份,或使用支持容错的存储系统,包括raid或分布式文件系统,如ceph,gpfs,hdfs等。

如果不希望将数据保存在宿主机或容器当中,还可以使用tmpfs类型的数据卷,其中数据只存在于内存中,容器退出后自动删除。


08、Docker 数据卷管理
http://blog.kjiang.vip/posts/1950070037.html
作者
发布于
2025年7月25日
许可协议