什么是容器数据卷
如果数据都在容器中,只要容器被删除,数据就会丢失。删除数据,类似于删库跑路。所以就有了一个新的需求,可以把容器中产生的数据同步到宿主机吗?
Docker容器产生的数据,同步到宿主机,这就是所谓的卷技术,目录的挂载,将我们容器内的目录,挂载到宿主机上。
将容器数据持久化到本地
docker run -v 宿主机目录:容器内目录
把centos镜像的home目录挂载到宿主机的D:/temp/test目录下。
docker run -it -v D:/temp/test:/home centos /bin/bash
这种效果有点类似于双向绑定。但是删除容器后,数据依然被保留在宿主机。
如果容器中目录存在,原有数据会被隐藏起来,取而代之的是宿主机上的数据。
上面的操作方式是制定目录挂载,除此之外,还有匿名挂载和具名挂载,但是实际使用中,不推荐使用后面这两种挂载方式。
拓展
有时候我们会看到容器目录后面还有另外几个字符,如下:
docker run -it -v D:/temp/test:/home:ro centos /bin/bash
这其实是在设置容器的可读可写权限。
ro:readonly,只读。只能通过宿主机操作文件。
rw: readwrite,可读可写。
容器之间数据共享
简单来说就是A容器对数据的修改会同步到B容器,B容器对数据的修改也会影响到A容器。
当然,这样的行为发生前提是B容器继承A容器的挂载规则。
继承挂载语法如下:
docker run -it --name=B容器名称 --volumes-from A容器名称 镜像名
测试
首先选择一个基础镜像centos,并创建一个容器,命名为centos01。
docker run -it --name=centos01 -v D:/temp/volume:/home/volume
将容器 /home/volume 目录挂载到本地 D:/temp/volume 目录。
用 docker inspect 查看该容器的挂载情况:
"Mounts": [{"Type": "bind","Source": "D:/temp/volume","Destination": "/home/volume","Mode": "","RW": true,"Propagation": "rprivate"}]
挂载情况一切正常。
然后再创建一个容器,继承刚刚的容器挂载规则,容器命名为centos02。
docker run -it --name=centos02 --volumes-from centos01 centos
这时,我们在centos02容器的/home/volume 内对文件新增修改会同步影响到centos01容器,反之亦然。
接着我们查询一下centos02容器的挂载情况:
"Mounts": [{"Type": "bind","Source": "/run/desktop/mnt/host/d/temp/volume","Destination": "/home/volume","Mode": "","RW": true,"Propagation": "rprivate"}]
它挂载的Source有点奇怪,很像宿主机的目录,但又不完全是。暂时想不明白为什么会是这样子。
