前言

最近都在看spring源码,好久后才想起docker存储这一块还没有全总结完,总结时,不会过多提及如何配置,着重介绍概念

 

什么是bind mounts

bind mounts允许建立docker容器中的文件与本地文件之间的映射关系,容器中的进程写入这个文件的内容会保存到映射的本地文件中,与volume不同的是,bind mounts不由docker同一管理,volume存放在docker的特定区域,而bind mounts可以位于主机的任意位置,由于bind mounts不由docker管理,也就无法像volume一样使用docker命令去管理查看相应的信息,依据主机文件系统的不同,bind mounts也具有不同的性能,bind mounts可以挂载到文件,也可以挂载到本地目录

 

创建bind mounts

有两种形式:

 

1、-mount参数

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx:latest

  语法介绍

  mount的参数都是key-value形式的,有几个具有特殊意义的key:

  1. type:挂载类型,可以是bind、volume、tmpfs,在本节中总是bind
  2. source/src:本地文件/目录的路径
  3. destination/target/dst:docker容器中的文件/目录
  4. readonly:容器是否只读本地文件/目录
  5. bind-propagation:接下来会介绍,挂载传播
  6. consistency:只对于mac有用,由于我都是在centos7上使用,所以这个参数这里不总结

 

2、-v参数

$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app \
  nginx:latest

  语法介绍

  有三个具有特殊意义的区域,三个区域之间用 ":" 分割,这三个区域代表的意义如下:

  1. 第一个区域:本地文件/目录的路径
  2. 第二个区域:docker容器中的文件/目录
  3. 第三个区域(可选):用逗号分割的选项字段,例如ro(只读)、consistent

 

两者的不同:在低于17.06版本的docker中,-v用于建立单个容器的文件/目录与本地文件/目录的映射关系,-mount用于swarm services,建立其中的文件/目录映射关系,自17.06版本以来,-mount已经可以用于建立单个容器的文件/目录与本地文件/目录的映射关系,如果用于映射的本地文件不存在,-v会自动去创建,而-mount则会报错,-v参数比-mount参数出现的早,它的功能不会随便改变(可能是考虑到兼容问题),

 

官方文档的使用例子

对于某些例子,由于没有什么总结的需要,所以会简单带过

  1. 在容器中使用bind mount:https://docs.docker.com/storage/bind-mounts/#start-a-container-with-a-bind-mount
  2. 若挂载到容器的非空目录,则非空目录中原本的内容会被隐藏,本地目录上将不会存放容器目录中的原有文件/目录,即不会存放容器目录下的旧数据,只会存放建立映射关系后写入的数据:https://docs.docker.com/storage/bind-mounts/#mounting-into-a-non-empty-directory-on-the-container
  3. 挂载到本地文件/目录,并且只允许容器中的进程读文件/目录:https://docs.docker.com/storage/bind-mounts/#use-a-read-only-bind-mount
  4. 配置传播挂载,这是一个高级特性,一般情况下并不需要配置,接下来详细介绍,配置方式请查看:https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation

传播挂载定义了挂载对象之间的关系,B(容器中的文件/目录)挂载到A(本地文件/目录),则B是挂载对象,系统用这些关系决定挂载对象中的挂载事件如何传播到其他挂载对象:

  • 如果两个挂载对象具有共享关系,那么一个挂载对象中的挂载事件会传播到另一个挂载对象,例如B、C目录均挂载到A目录,如果在B目录下创建文件b,则C目录下也可以看见文件b,反之亦然
  • 如果两个挂载对象形成从属关系,那么A挂载对象中的挂载事件(例如创建某个文件)会传播到B挂载对象(即B可以看见A创建的文件),但是反过来不行,发送挂载事件的挂载对象称为共享挂载,接收挂载事件的挂载对象称为私有挂载

docker支持的传播挂载如下:

rprivate/rslave/rshared:表示传播会扩展到共享挂载与私有挂载内部嵌套的挂载点,例如传播模式为rshare,目录B、C挂载到本地目录A,在目录B中创建目录D,则C中可见目录D,在B/D中创建temp文件,则也会在C也可以看见D目录下新建的temp文件

在使用过传播挂载后,会回来补充

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐