黑帽联盟

 找回密码
 会员注册
查看: 155|回复: 0
打印 上一主题 下一主题

[资源教程] 详解docker进行数据挂载的三种模式

[复制链接]

895

主题

38

听众

3329

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    难过
    昨天 22:31
  • 签到天数: 1652 天

    [LV.Master]伴坛终老

    docker 提供了三种方式将数据从宿主机挂载到 Docker容器中: volumes、bind mounts、tmpfs


    Volumes是在宿主机文件系统的一个路径,默认情况下统一的父路径是 /var/lib/docker/volumes/,非 Docker 进程不能修改这个路径下面的文件,所以说 Volumes 是容器数据持久存储数据最安全的一种方式。Bind mounts 可以将文件存储在宿主机文件系统的任何路径,所以非 Docker进程也可以对其进行修改,存在潜在的安全风险。Tmpfs 只存储在宿主机的内存中,不会写入到宿主机文件系统中,不会持久化存储。


    本文我们先来介绍其中的两种:Bind mounts与Tmpfs。Volumes 由于相对重要,会单独起一个文章进行说明。




    一、Tmpfs挂载
    需要再次强调的是tmpfs 挂载是临时的,只存留在容器宿主机的内存中。当容器停止时,tmpfs 挂载文件路径将被删除,在那里写入的文件不会被持久化。
    docker run -d \
    -p 8888:8888 \
    --tmpfs /tmp \
    --name spboot  zimug/docker-test:1
    学过SpringBoot的同学可能都知道,SpringBoot项目启动之后会在/tmp目录下面解压出tomcat容器,提供web服务。
    1.png

    所以将/tmp目录使用tmpfs方式挂载到宿主机的内存中,不仅场景合适,也会提升springboot项目的运行效率(内存操作)。

    二、Bind mounts
    其实Bind Mounts挂载数据卷的方式也是大家最常见的一种方式,比如使用-v参数绑定数据卷,其中/root/nginx/html是我们任意指定的一个宿主机磁盘文件目录,这种情况下就是Bind mounts方式挂载数据卷。
    -v /root/nginx/html:/usr/share/nginx/html/
    除了使用-v参数绑定的方式,还可以使用--mount参数绑定的方式实现Bind mounts数据卷挂载。在--mount参数绑定的方式之前,我们先创建一个宿主机文件路径mkdir -p /root/nginx/html用于做实验 。
    docker run -d --name bind-mount-nginx \
      -p 80:80 \
      --mount type=bind,source=/root/nginx/html,target=/usr/share/nginx/html/,readonly \
      nginx:latest
    --mount 以键值对的方式传参,比-v提供了更多的选项
    • type=bind表示以Bind mounts方式挂载数据卷
    • source=/root/nginx/html表示宿主机的文件路径
    • target=/usr/share/nginx/html/表示容器的文件路径,宿主机source文件路径挂载到容器的target路径readonly配置参数,表示文件路径采用只读的方式挂载



    三、Bind mounts-测试是否正确挂载数据卷
    在宿主机 /root/nginx/html目录下新建一个index.html,文件内容如下
    <!DOCTYPE html>
    <html>
    <body>
        <h1>Bind mounts</h1>
    </body>
    </html>
    访问容器宿主机服务器80端口得到如下的响应结果,证明数据卷挂载成功了。
    2.png


    四、Bind mounts-验证只读挂载
    在--mount中加入一个readonly配置参数,表示文件路径采用只读的方式挂载。即:该路径下的文件可以在宿主机上进行修改,但是容器内的应用程序不能修改该文件。
    --mount type=bind,source=/root/nginx/html,target=/usr/share/nginx/html/,readonly
    可以通过docker inspect <容器ID或容器名称> 查看数据卷的挂载结果,如下


    "Mounts": [
        {
            "Type": "bind",
            "Source": "/root/nginx/html",
            "Destination": "/usr/share/nginx/html",
            "Mode": "",
            "RW": false,
            "Propagation": "rprivate"
        }
    ],


    • 数据卷挂载类型是bind(mount bind)
    • 宿主机源路径/root/nginx/html,容器挂载目标路径/usr/share/nginx/html
    • "RW": false表示只读模式,路径内文件不能被容器内程序修改



    大家可以通过docker exec -it <容器ID或容器名称> /bin/bash 进入容器内部尝试修改/usr/share/nginx/html路径下的文件,看看能不能修改,相信经过你的验证答案一定是否定的。

    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部