是什么

  • Docker运行的容器产生的数据,如果不将内部的数据持久化,那么当容器被删除之后,其内部的数据自然也就被删除了。因此我们希望数据可以持久化到宿主机的磁盘上,就可以使用数据卷。
  • 卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
  • 简单来说,就是将Docker容器中的数据持久化到宿主机的磁盘中

如何使用

  • -v参数:也即volume,使用案例如下,docker run -it --privileged=true -v /宿主机绝对路径:/容器内目录 镜像名
  • 上面的的--privileged=true是为了避免Docker挂载主机目录访问如果出现cannot open directory .: Permission denied权限问题

特点

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接实时生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

数据卷双向同步

  • 将CentOS容器中的数据映射到宿主机上

    运行Docker容器,对于挂载的路径,宿主机和容器内不存在对应路径的话,会自动创建

docker run -it -v /tmp/host_data:/tmp/container_data centos

Docker容器数据卷 - 图1

  • 在容器内数据卷中创建文件,同时在宿主机对应目录中文件会实时同步

    Docker容器数据卷 - 图2

  • 同样,在宿主机挂载目录创建文件,容器内数据卷中也会实时同步

    Docker容器数据卷 - 图3

  • 容器停止,宿主机挂载目录下创建文件,容器重启后,数据也会同步

    Docker容器数据卷 - 图4

  • 查看挂载信息:docker inspect 容器ID

    其中的Mounts也就是挂载信息

Docker容器数据卷 - 图5

容器内读写规则

  • 默认情况下,容器内的数据卷是可读写的,默认权限是rw,上面的命令也即docker run -it -v /tmp/host_data:/tmp/container_data:rw centos

  • 在有些时候,容器内的数据可能需要设置权限为只读权限(ro),此时容器内不能创建也不能修改文件

    Docker容器数据卷 - 图6

卷的继承和共享

  • 参数,--volumes-from 父容器,注意,这里继承的是父容器的规则,即使父容器停止了也不影响。

    CentOS2继承CentOS1的规则docker run -it --volumes-from centos1 --name centos2 centos

可以看到在CentOS2中存在宿主机挂载目录下的所有文件

Docker容器数据卷 - 图7

在CentOS1创建文件后,在CentOS2和宿主机都可以看到文件

同时,CentOS2创建的文件,CentOS1和宿主机也都可以看到

Docker容器数据卷 - 图8

即使CentOS1停止运行了,CentOS2和宿主机也是可以进行同步的。

同时,当CentOS1重启之后,也会进行同步所有数据。

Docker容器数据卷 - 图9

总结

  • 宿主机挂载的目录和数据卷之间是同步的,即使容器停止了,当容器重启之后,还是会进行数据的同步
  • 即使继承的数据卷,当父容器停止之后,并不会影响到自己和宿主机之间的数据同步