05-Docker挂载

作者: 紫荆秋雪_文 | 来源:发表于2021-10-14 11:21 被阅读0次

    一、挂载类型

    无论是使用那种类型的挂载,容器内的数据看起来都是一样的。它作为目录或容器文件系统中的单个文件。卷挂载(volumes)、绑定挂载(bind mounts)和tmpfs mounts挂载之间的区别就在于数据在 Docker 主机上的位置

    image.png

    卷挂载(volumes)

    • 存储在由 Docker (/var/lib/docker/volumes/ 在Linux上)管理的主机文件系统中的一部分

    绑定挂载(bind mounts)

    • 可以存储在主机系统的任何位置。甚至可能是重要的系统文件或目录
    • Docker 主机 或 Docker 容器上的非 Docker 进程可以随时修改它们

    tmpfs mounts挂载

    • 存储在主机系统的内从中,永远不会写入主机系统的文件系统中

    二、卷挂载(volumes):推荐使用

    卷挂载.png
    • 有Docker创建和管理
    • 使用 docker volume create 命令显示创建卷,或者 Docker 可以在容器或服务创建期间创建卷
    docker volume create
    
    • 卷由 Docker 管理并且与主机的核心功能隔离
    • 卷支持使用卷驱动程序,允许将数据存储在远程主机或提供商上
    • 此外,与在容器的可写层中持久化数据相比,卷通常是更好的选择,因为卷不会增加使用它的容器的大小,并且卷的内容存在于给定容器的生命周期之外
    • 如果容器生成非持久状态数据,请考虑使用 tmpfs挂载以避免将数据永久存储在任何地方,并通过避免写入容器的可写层来提高容器的性能
    • 卷使用 rprivate 绑定传播,并且无法为卷配置绑定传播

    1、卷比绑定的优势

    • 卷比绑定安装更容易备份或迁移
    • 可以使用 Docker CLI 命令或 Docker API 管理卷
    • 卷适用于 Linux 和 Windows 容器
    • 卷可以在多个容器之间更安全地共享
    • 卷驱动程序运行将卷存储在远程主机或云提供商上,以加密卷的内容或添加其他功能
    • 新卷的内容可以由容器预先填充
    • Docker 桌面上的卷比 Mac 和 Windows 主机上的绑定挂载具有更高的性能

    2、-v 或 --mount

    • --mount 更明确和详细
    • -v 语法将所有选项组合在一个字段中
    • 如果需要指定卷驱动程序选项,则必须使用 --mount
    • -v--mount由三个字段组成,以冒号符(:)分割。字段必须按正确的顺序排列,每个字段的含义不是很明显
      • 在有明确的卷的情况下,第一个字段时卷的名称,并且在给定的主机上是唯一的。对于匿名卷,第一个字段被省略
      • 第二个字段是容器中的文件或文件夹路径
      • 第三个字段时可选的,是以逗号分隔的选项列表,如ro

    3、创建和管理卷

    • 创建卷
    docker volume create ravenVolume
    
    • 显示卷
    docker volume ls
    
    DRIVER    VOLUME NAME
    local     9350882ceed3c7b76f6b691d1a3293b5b2e462e3cc5682febba8c39cda0b5025
    local     ravenVolume
    
    • 显示卷信息
    docker volume inspect ravenVolume
    
    [
        {
            "CreatedAt": "2021-10-13T10:11:23+08:00",
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/ravenVolume/_data",
            "Name": "ravenVolume",
            "Options": {},
            "Scope": "local"
        }
    ]
    
    • 删除卷
    docker volume rm ravenVolume
    

    4、启动容器时并挂载卷

    4.1、匿名卷启动容器,挂载Nginx html静态界面

    docker run -d -p 80:80 -v /usr/share/nginx/html nginx
    
    • 4.1.1:查看Docker会创建一个随机码唯一的 卷
    local     fe86f2ed452fe28b6ddd95cb4b4a4d9c624b2aea5a358225aa8eaa457b3a2fd5
    
    • 4.1.2:查看Nginx容器信息
    docker inspect 93
    
    "Mounts": [
                {
                    "Type": "volume",
                    "Name": "fe86f2ed452fe28b6ddd95cb4b4a4d9c624b2aea5a358225aa8eaa457b3a2fd5",
                    "Source": "/var/lib/docker/volumes/fe86f2ed452fe28b6ddd95cb4b4a4d9c624b2aea5a358225aa8eaa457b3a2fd5/_data",
                    "Destination": "/usr/share/nginx/html",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ]
    
    • 4.1.3:访问正常 image.png
    • 4.1.4:修改挂载卷

    cd /var/lib/docker/volumes/fe86f2ed452fe28b6ddd95cb4b4a4d9c624b2aea5a358225aa8eaa457b3a2fd5/_data
    50x.html  index.html
    
    • 修改index.html 文件后 image.png

    4.2、启动容器时挂载具名卷,Docker会为您创建该卷

    docker run -d -p 80:80 -v mynginx:/usr/share/nginx/html nginx:latest
    
    • 查看Docker是否会自动创建 mynginx 卷
    DRIVER    VOLUME NAME
    local     mynginx
    
    • 通过docker inspect mynginx 查看详情
      • 正确显示挂载一个卷,显示了正确的源和目标,并且挂载是读写的
    "Mounts": [
                {
                    "Type": "volume",
                    "Name": "mynginx",
                    "Source": "/var/lib/docker/volumes/mynginx/_data",
                    "Destination": "/usr/share/nginx/html",
                    "Driver": "local",
                    "Mode": "z",
                    "RW": true,
                    "Propagation": ""
                }
            ]
    
    • 正常显示


      image.png
    • 修改配置文件

    cd /var/lib/docker/volumes/mynginx/_data
    
    -rw-r--r-- 1 root root 497 Sep  7 23:21 50x.html
    -rw-r--r-- 1 root root 615 Sep  7 23:21 index.html
    
    • 修改 index.html 文件后显示 image.png

    三、绑定挂载(bind mounts) 图片来自官网.png

    • 与卷挂载相比,绑定挂载的功能有限
    • 主机上的文件或目录会挂载到容器中,文件或目录由其在主机上的完整路径引用
    • 绑定挂载允许访问敏感文件
      • 使用绑定挂载的一个副作用,无论好坏,都可以通过容器中运行的进程更改主机文件系统,包括创建、修改或删除重要的系统文件或目录。这是一种强大的能力,可能会产生安全隐患,包括影响主机系统上的非Docker进程

    1、绑定操作造成空挂载

    • 启动容器
    docker run -d -p 80:80 -v "$(pwd)"/html:/usr/share/nginx/html nginx:latest
    
    • 查看本地,html文件创建成功,但是html内容为空
    • 无法正常显示结果 image.png
    • 进入容器查看html中内容也为空

    小结

    • 造成了空挂载
    • 使用绑定的挂载原理是,把宿主机中挂载路径中的文件挂载到容器中,这也就是造成空挂在的根源所在。卷挂载原理正好相反
    • 在宿主机的html中创建index.html就可以正常显示 image.png

    四、tmpfs mounts挂载

    • tmpfs挂载不会持久保存在磁盘上,无论是在 Docker 主机上还是在容器内。在容器的生命周期内,容器可以使用它来存储非持久状态或敏感

    五、OverlayFS 存储驱动程序

    image.png

    1、overlay工作原理

    OverlayFS 在单个Linux主机上分为两个目录,并将它们呈现为单个目录。这些目录称为,统一过程称为联合挂载。OverlayFS指的是下层目录(lowerdir)和上层目录(upperdir)。统一视图称为merged

    2、Docker镜像和Docker容器是如何分层的

    • 镜像层是lowerdir
    • 容器层是upperdir
    • 统一视图通过一个名为 merged的公开目录,实际上是容器的安装点
    • 在镜像层和容器层包含相同文件的情况下(写时复制),优先使用容器中文件

    相关文章

      网友评论

        本文标题:05-Docker挂载

        本文链接:https://www.haomeiwen.com/subject/kqfjoltx.html