1 docker 数据卷
1.1 什么是Docker Volume
Docker Volume 即数据卷,用于保持数据持久化,例如MySQL运行在Docker容器中时,一般将数据通过Docker Volume保存在主机上,这样即使删除MySQL容器,数据依然保存在主机上,有效保证了数据的安全性。
Docker Volume 就是一个目录或者文件,通俗得理解就是宿主机或者网络存储系统中的一个目录或者文件挂载在容器中用于保持数据持久化
1.2 为什么要使用数据卷volume
我们先了解一下什么是联合文件系统
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父 镜像),可以制作各种具体的应用镜像。
如果运行中的容器修改了现有的一个已经存在的文件,那该文件会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是被读写层中该文件的副本所隐藏,这是“写时复制(COW)”机制 “
但对对于磁盘io要求比较高的redis MySQL 等应用,不适合这种分层叠加写时复制文件系统
这个设计虽然使得Docker可以提高镜像构建、存储和分发的效率,节省了时间和存储空间,然而也存在如下问题。
- 容器中的文件在宿主机中 存在形式复杂,不能在宿主机上很方便的访问
- 多个容器间的数据无法共享和重用
- 当容器删除时,容器产生的数据将丢失(数据无法持久化)
为了解决这些问题docker引入了数据卷机制(docker volume,volume是存在一个或多个容器中的特定文件或文件夹,这个目录能够独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久提供一下便利。
- volume在容器创建时就初始化,在容器运行时就可以使用其中的文件
- volume能在不同的容器之间共享和重用
- 对volume中的数据的操作会马上生效
- 对volume中数据操作不会影响到镜像本身
- volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被Docker删除
1.3 如何使用数据卷
1.3.1 绑定数据卷
#volumme类型 普通数据卷
#-v 后面跟一个路径 是指把容器中的目录或文件 映射到主机/var/lib/docker/volumes
docker run -it -v /data --name testdocker /bin/bash
#bind 类型 绑定数据卷 映射到主机指定路径下
docker run -it -v /home/data:/data --name testdocker /bin/bash
#tmps 临时数据卷 只存在内存中
1.3.2 数据卷容器
数据卷容器也是一个容器 它的目的是专门提供数据卷给其他容器挂载
什么时候需要用的数据卷容器
- 多个容器需要绑定相同的多个文件夹或者文件
- 多个容器需要共享一些持续更新的数据
#创建一个容器绑定多个文件或者文件夹
docker run --name volume_docker -v /home/data1:/data1 -v home/data2/data2 -v /home/data2:/data2 centos
#--volume-from 挂载数据卷容器
docker run --volume-from volume_docker --name dbdata1 centos
docker run --volume-from volume_docker --name dbdata2 centos
注意:
使用 --volume-from 参数所挂载的数据的容器自身并不需要保持运行状态
如果删除了挂载的容器(volume_docker,dbdat1,dbdata2),数据卷并不会被删除,如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用docker rm -v 命令指定同时删除关联的容器
1.3.3 Dockerfile 添加volume
在Dockerfile 中通过 VOLUME 指令添加 数据卷
VOLUME /data
VOLUME ["data1","data2"] #添加多个数据卷
#VOLUME 指令绑定挂载的时volume类型的数据卷 等价于 -v/data 的形式
#VOLUME 不能指定宿主机上路径绑定 为了Dokcerfile的可移植性
网友评论