Docker存储(1)

存储概括

  • Storage driver
  • Data Volume(无法指定容量)
    • bind mount(挂载到容器指定host目录)
    • docker managed volume(挂载到容器不指定host目录)
  • 数据共享
    • 容器与host共享(host目录挂载到容器)
    • 容器与容器共享 (同个host目录,挂载到多个容器)
    • data-packed volume container(将数据打包到容器内)

bind mount

1、Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)
2、容器可以读写 volume 中的数据
3、volume 数据可以被永久的保存,即使使用它的容器已经销毁(所以适合持久化的数据)

注意:bind mount 时还可以指定数据的读写权限,默认是可读可写,可指定为只读


image.png

docker managed volume

docker managed volume 与 bind mount 在使用上的最大区别是不需要指定 mount 源,指明 mount point 就行了
查看挂载信息,Source 就是该 volume 在 host 上的目录,每当容器申请 mount docker manged volume 时,docker 都会在/var/lib/docker/volumes 下生成一个目录

# docker inspect 21accc2ca072
......

"Mounts": [
    {
        "Name": "f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340",
        "Source": "/var/lib/docker/volumes/f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340/_data",
        "Destination": "/usr/local/apache2/htdocs",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],
......

对比

bind mount docker managed volume
volume 位置 可任意指定 /var/lib/docker/volumes/...
对已有mount point 影响 隐藏并替换为 volume 原有数据复制到 volume
是否支持单个文件 支持 不支持,只能是目录
权限控制 可设置为只读,默认为读写权限 无控制,均为读写权限
移植性 移植性弱,与 host path 绑定 移植性强,无需指定 host 目录

data-packed volume container

volume container:专门为其他容器提供volume的容器,它提供的卷可以是 bind mount,也可以是 docker managed volume

docker create --name vc_data -v /opt:/opt -v /tmp busybox
# docker inspect vc_data
......
"Mounts": [
      {
        "Name": "1e3597380f235747ef0c9ea92db64f6783c224ea8d57754153611a4a2284dc03",
        "Source": "/var/lib/docker/volumes/1e3597380f235747ef0c9ea92db64f6783c224ea8d57754153611a4a2284dc03/_data",
        "Destination": "/tmp",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
      },
      {
        "Source": "/opt",
        "Destination": "/opt",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
      }
    ],
......

其他容器可以通过 --volumes-from 使用 vc_data 这个 volume container:


image.png

与 bind mount 相比,不必为每一个容器指定 host path,所有 path 都在 volume container 中定义好了,容器只需与 volume container 关联,实现了容器与 host 的解耦

推荐阅读更多精彩内容