打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
容器(六)docker managed volume【35】

(三)docker managed volume

​ docker managed volume 与 bind mount 在使用上的最大区别是不需要指定 mount 源,指明 mount point 就行了。还是以 httpd 容器为例:

root@cuiyongchao:~# docker run -d -p 84:80 -v /usr/local/apache2/htdocs/ httpd
ddc068dfa02cf824ab67ad9abbedc71addbbc7563ec548917c46003fa961abb8

我们通过 -v 告诉 docker 需要一个 data volume,并将其 mount 到 /usr/local/apache2/htdocs。那么这个 data volume 具体在哪儿呢?

这个答案可以在容器的配置信息中找到,执行 docker inspect 命令:

root@cuiyongchao:~# docker exec -it ddc068dfa02c /bin/bash
root@ddc068dfa02c:/usr/local/apache2# cat htdocs/index.html 
<html><body><h1>It works!</h1></body></html>
root@ddc068dfa02c:/usr/local/apache2# exit
exit
root@cuiyongchao:~# docker inspect ddc068dfa02c

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

docker inspect 的输出很多,我们感兴趣的是 Mounts 这部分,这里会显示容器当前使用的所有 data volume,包括 bind mount 和 docker managed volume。

Source 就是该 volume 在 host 上的目录。

原来,每当容器申请 mount docker manged volume 时,docker 都会在/var/lib/docker/volumes 下生成一个目录(例子中是 "/var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data),这个目录就是 mount 源。

下面继续研究这个 volume,看看里面有些什么东西:

root@cuiyongchao:~# cat /var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data/index.html <html><body><h1>It works!</h1></body></html>
root@cuiyongchao:~# 

volume 的内容跟容器原有 /usr/local/apache2/htdocs 完全一样,这是怎么回事呢?这是因为:如果 mount point 指向的是已有目录,原有数据会被复制到 volume 中。

但要明确一点:此时的 /usr/local/apache2/htdocs 已经不再是由 storage driver 管理的层数据了,它已经是一个 data volume。我们可以像 bind mount 一样对数据进行操作,例如更新数据:

root@cuiyongchao:~# echo "update volume from host">/var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data/index.html
root@cuiyongchao:~# curl 10.0.0.20:84
update volume from host
root@cuiyongchao:~# 

简单回顾一下 docker managed volume 的创建过程:

  1. 容器启动时,简单的告诉 docker "我需要一个 volume 存放数据,帮我 mount 到目录 /abc"。
  2. docker 在 /var/lib/docker/volumes 中生成一个随机目录作为 mount 源。
  3. 如果 /abc 已经存在,则将数据复制到 mount 源,
  4. 将 volume mount 到 /abc

除了通过 docker inspect 查看 volume,我们也可以用 docker volume 命令:

root@cuiyongchao:~# docker volume ls
DRIVER              VOLUME NAME
local               c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7
root@cuiyongchao:~# docker volume inspect c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7
[
    {
        "CreatedAt": "2020-11-02T04:00:43Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data",
        "Name": "c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7",
        "Options": null,
        "Scope": "local"
    }
]
root@cuiyongchao:~# 

​ 目前,docker volume 只能查看 docker managed volume,还看不到 bind mount;同时也无法知道 volume 对应的容器,这些信息还得靠docker inspect

我们已经学习了两种 data volume 的原理和基本使用方法,下面做个对比:

  1. 相同点:两者都是 host 文件系统中的某个路径。

  2. 不同点:

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

    下节讨论如何通过 data volume 实现容器与 host,容器与容器共享数据。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
容器(六)如何共享数据?【36】
容器(六)Data Volume 之 bind mount【34】
容器(六)用 volume container 共享数据【37】
容器(六)data-packed volume container【38】
Docker 持久存储介绍(十三)
docker容器与宿主机的数据交互
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服