什么是容器数据卷

如果数据都在容器中,只要容器被删除,数据就会丢失。删除数据,类似于删库跑路。所以就有了一个新的需求,可以把容器中产生的数据同步到宿主机吗?
Docker容器产生的数据,同步到宿主机,这就是所谓的卷技术,目录的挂载,将我们容器内的目录,挂载到宿主机上。
image.png

将容器数据持久化到本地

  1. docker run -v 宿主机目录:容器内目录

把centos镜像的home目录挂载到宿主机的D:/temp/test目录下。

  1. docker run -it -v D:/temp/test:/home centos /bin/bash

这种效果有点类似于双向绑定。但是删除容器后,数据依然被保留在宿主机。
如果容器中目录存在,原有数据会被隐藏起来,取而代之的是宿主机上的数据。
上面的操作方式是制定目录挂载,除此之外,还有匿名挂载和具名挂载,但是实际使用中,不推荐使用后面这两种挂载方式。

拓展

有时候我们会看到容器目录后面还有另外几个字符,如下:

  1. docker run -it -v D:/temp/test:/home:ro centos /bin/bash

这其实是在设置容器的可读可写权限。
ro:readonly,只读。只能通过宿主机操作文件。
rw: readwrite,可读可写。

容器之间数据共享

简单来说就是A容器对数据的修改会同步到B容器,B容器对数据的修改也会影响到A容器。
当然,这样的行为发生前提是B容器继承A容器的挂载规则。
继承挂载语法如下:

  1. docker run -it --name=B容器名称 --volumes-from A容器名称 镜像名

测试

首先选择一个基础镜像centos,并创建一个容器,命名为centos01。

  1. docker run -it --name=centos01 -v D:/temp/volume:/home/volume

将容器 /home/volume 目录挂载到本地 D:/temp/volume 目录。
用 docker inspect 查看该容器的挂载情况:

  1. "Mounts": [
  2. {
  3. "Type": "bind",
  4. "Source": "D:/temp/volume",
  5. "Destination": "/home/volume",
  6. "Mode": "",
  7. "RW": true,
  8. "Propagation": "rprivate"
  9. }
  10. ]

挂载情况一切正常。
然后再创建一个容器,继承刚刚的容器挂载规则,容器命名为centos02。

  1. docker run -it --name=centos02 --volumes-from centos01 centos

这时,我们在centos02容器的/home/volume 内对文件新增修改会同步影响到centos01容器,反之亦然。
接着我们查询一下centos02容器的挂载情况:

  1. "Mounts": [
  2. {
  3. "Type": "bind",
  4. "Source": "/run/desktop/mnt/host/d/temp/volume",
  5. "Destination": "/home/volume",
  6. "Mode": "",
  7. "RW": true,
  8. "Propagation": "rprivate"
  9. }
  10. ]

它挂载的Source有点奇怪,很像宿主机的目录,但又不完全是。暂时想不明白为什么会是这样子。