08、Docker 数据卷管理
08、Docker 数据卷管理
什么是数据卷?
简单来说:就是对docker的容器与主机同步数据,实现容器的数据持久化操作。
数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或者多个容器提供访问,数据卷设计的目的,在于数据的永久存储,它完全独立于容器的生存周期,因此,docker 不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理,同一个数据卷可以只支持多个容器的访问。
数据卷的特点:
- 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会被拷贝到新初始化的数据卷中
- 数据卷可以在容器之间共享和重用
- 可以对数据卷里的内容直接进行修改
- 数据卷的变化不会影响镜像的更新
- 卷会一直存在,即使挂载数据卷的容器已经被删除
0、创建数据卷
docker提供volume子命令来管理数据卷,如下命令可以快速的在本地创建一个数据卷:
1 |
|
此时/var/lib/docker/volumes下会发现所创建的数据卷位置
除了create命令,还有inspect(查看详细信息)、ls(列出已有数据卷)、prune(清理无用数据卷)、rm(删除数据卷)等。
1、为容器绑定数据卷
在使用docker run命令时,可以使用-mount选项来使用数据卷。
-mount选项支持三种类型的数据卷:
- volume:普通数据卷,映射到主句/var/lib/docker/volumes路径下
- bind:绑定数据卷,映射到主机指定路径下
- tmpfs:临时数据卷,只存在于内存中
1 |
|
上述命令等同于使用旧的-v标记可以再容器内创建一个数据卷:
1 |
|
注意:本地的路径必须是绝对路径,容器内的路径可以为相对路径。如果目录不存在,docker会自动创建。
docker挂载数据卷的默认权限为读写(rw),用户也可以通过ro指定为只读:
1 |
|
加了ro之后,容器内对所挂载数据卷内的数据就无法修改了。
注意:如果直接挂载一个文件,在使用文件编辑工具(vi,sed等)之后,可能会造成文件inode的改变。从docker1.1.0起,这会导致报错误信息,所以推荐直接挂载文件所在的目录到容器内。
2、Docker 的数据卷容器共享
什么是数据卷容器: 命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器
1 |
|
注意:使用–volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态
如果删除了挂载的容器(dbdata、db1、db2),数据卷并不会被自动删除。要删除它,必须在删除最后一个挂载着他的容器时显示使用docker rm -v命令来指定删除关联的容器。
使用数据卷容器可以让用户在容器之间自由的升级和移动数据卷。
3、docker 数据卷的备份和还原
1 |
|
4、总结
数据是宝贵的。即使容器出现问题,我们也可以通过数据卷和数据卷容器对容器内的数据进行共享、迁移、备份等,快速地恢复项目或程序的运行。
另外,在生产环境中,除了使用数据卷和数据卷容器之外,还可以定期对主机数据进行备份,或使用支持容错的存储系统,包括raid或分布式文件系统,如ceph,gpfs,hdfs等。
如果不希望将数据保存在宿主机或容器当中,还可以使用tmpfs类型的数据卷,其中数据只存在于内存中,容器退出后自动删除。