1、介绍
Docker 镜像由多个只读层叠加而成,启动容器时,Docker 会加载只读镜像层并在镜像栈顶部添加一个读写层
如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本依然存在,只是已经被读写层中该文件的副本所隐藏,此即为 “写时复制(COW)”机制
在使用Docker的时候,关闭并重启容器,其数据不受影响;但删除docker容器,则其更改将会全部丢失
存在的问题
- 存储于联合文件系统中,不易于宿主机访问
- 容器间数据共享不便
- 删除容器其数据会丢失
对于上面的问题,也是存在有解决方案的,那就是“卷(volume)”
- 卷 是容器上一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机上的某目录“绑定(关联)”
volume 在容器初始化时就会创建,由 base image 提供的卷中的数据也会在此期间完成复制
volume的初衷是独立于容器的生命周期实现数据持久化,因此删除容器之时既不会删除卷,也不会对哪怕未被引用的卷做垃圾回收操作
卷 为docker提供了独立于容器的数据管理机制
- 可以把“镜像”想象为静态文件,例如“程序”,把卷类比为动态内容,例如“数据”;于是,镜像可以重用,而卷可以共享
- 卷实现了“程序(镜像)”和“数据(卷)”分离,以及“程序(镜像)”和“制作镜像的主机”分离,用户制作镜像时无须再考虑运行的容器所在的主机的环境
2、类型
docker 有两种类型的卷,每种类型都在容器中存在一个挂载点,但其在宿主机上的位置有所不同
- 绑定挂载卷(bind mount volume):在容器和宿主机上为指定的路径进行绑定
- docker管理卷(docker-manage volume):只需要在容器中指定挂载点即可,docker会自动将其挂载到宿主机的路径下
3、使用volume
在 docker container run 命令中使用 -v 选项即可使用 volume
如果两个容器想要共享同一个目录,其实也是可以都关联宿主机上相同的目录的,这样两个容器之间目录就实现了共享
4、数据卷容器
如果一个容器已经进行了挂载卷的操作,此时另外一个容器也想要和前一个容器一样的挂载卷配置,也是可以的
我们可以启动一个容器,这个容器什么也不做,仅仅用来挂载卷,这个容器只要在就行
- 多个容器的卷使用同一个主机目录,例如
- 复制使用其他容器的卷,为docker container run 命令使用 --volume-from 选项