• 容器(六)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,容器与容器共享数据。

  • 相关阅读:
    calendar.getTimeInMillis() 和 System.currentTimeMillis() 的区别
    微信小程序中使用 <web-view> 内嵌 H5 时,登录问题的处理方法
    小程序 TabBar 定制
    webpack 代码优化压缩方法
    react-router v4 按需加载的配置方法
    axios发送post请求,如何提交表单数据?
    react中键盘enter事件处理
    常用证件正则表达式
    react中input自动聚焦问题
    React Router v4 页面传值的三种方法
  • 原文地址:https://www.cnblogs.com/cuiyongchao007/p/14040429.html
Copyright © 2020-2023  润新知