数据卷的特性
- Docker 镜像由多个只读层叠加而成,启动容器时,Docker 会加载只读镜像层并在镜像栈顶部添加一个读写层
- 如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,次即“写时复制”机制,读写层的修改不影响只读层文件的性质。
数据卷的意义
关闭并重启容器,其数据不受影响;但删除Docker 容器,则其改变将会全部丢失
存在的问题
- 存在于联合文件系统中,不易于宿主机访问
- 容器间数据共享不便
- 删除容器其数据会丢失
解决方案
“卷”是容器上的一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机上的某目录“绑定“,当我访问卷上的目录就可以连接到宿主机目录。当我们有一天删除可写层的时候,我们的数据因为保存在卷中,所以并没有被删除,就有利于数据的永久保存。
如图所示:数据卷和读写层分开存放,也就是读写层在删除的时候,数据卷的数据依然存在。
尝试使用数据卷存储数据(绑定挂载)
首先我们进入位于/usr/local/volumes
的volumes目录下,新建一个/data/目录用于存放我们的一会要绑定的容器的数据。
首先我们通过运行一下代码实现绑定,前面是HOSTDIR,后面是VolumeDIR
docker run --name tomcat01 -v /data:/data -d tomcat
挂载成功后,我们在该宿主机的data目录下touch一个文件,名为dmoann,我们进入容器交互之后,发现在/data下也有一个相同的dmoann,也就是说,在两端操作都会使另外一边产生相对应的改变,这就是数据卷绑定挂载的功能体现。
docker存储驱动
Docker 存储驱动( storage driver ) 是Docker 的核心组件,它是Docker 实现分成镜像的基础
- device mapper ( DM ):性能和稳定性存在问题,不推荐生产环境使用,这是一种比较老的存储驱动,如果内核版本低于3.18,overlaysfs未进入主线,因此,docker会使用DM的存储驱动。
- btrfs:社区实现了btrfsdriver,稳定性和性能存在问题
- overlayfs:内核3.18 overlayfs 进入主线,性能和稳定性优异,第一选择
overlayfs
主要分为三个层级,左边对应的是docker结构的,最下面是镜像层,中间是容器层,最上面是用户所能看到的层,对应右边ovwelayfs的三个层级。用户看到的是自上而下看的第一个file所组成的集合,例如下图中的file2,upperdir的file2覆盖了lowerdir的file2 ,也就是之前我们说的写时复制。