docker 存储挂载比较

2023-09-13 22:56:26

docker存储概述

接触 docker 的朋友都知道,docker 镜像是以 layer 概念存在的,一层一层的叠加,最终成为我们需要的镜像。但该镜像的每一层都是 ReadOnly 只读的。只有在我们运行容器的时候才会创建读写层。文件系统的隔离使得:

  • 容器不再运行时,数据将不会持续存在,数据很难从容器中取出。
  • 无法在不同主机之间很好的进行数据迁移。
  • 数据写入容器的读写层需要内核提供联合文件系统,这会额外的降低性能。

docker提供了三种不同的方式将数据挂载到容器中,volume、bind mount(-v映射)、tmpfs

volume方式

volume方式是docker中数据持久化的最佳方式

  • docker默认在主机上会有一个特定的区域(Linux系统:/var/lib/docker/volumes/),该目录下用来存放volume
  • 非docker进程不应该去修改该目录下的文件
  • volume 可以通过docker volume进行管理,如创建、删除等操作
  • volume 如果在生成的时候如果不指定名称,便会随机生成
[root@localhost ~]# ls /var/lib/docker/volumes/
ea73bac7843b4d05c08dc758ef15a5b3fc1070f3de8b3361dd40c3c58247c98f 
ffa4846b581c1a50a01e7a12a6342ad2aaa442701a35ae56ef2f0e5d7888b22c
  • volume 在容器停止或删除的时候也会继续存在,如需删除需要显示声明
相关用例
  • 多个容器之间共享数据,volume在容器停止或删除的时候依然存在,多个容器之间可以加载相同的volume(卷)
  • 当主机不能保证有一个指定的目录或文件结构时
  • 当需要备份、还原或主机间的数据迁移时,停止容器,备份卷的目录
使用方式

volume在docker中被推荐为首选方式,它与bind mount(-v)相比,有以下优点:

  • 与 bind mount 相比,volume 更容易备份或迁移
  • 可以使用 Docker CLI(命令行界面) 命令或 Docker API(接口) 来管理
  • volume 在 Linux 和 Windows 容器上都能工作
  • volume 可以在多个容器之间更安全的共享
  • volume 驱动程序允许你在远程主机或云上提供存储、加密或其他功能
  • 新 volume 的内容可以由容器预填充
创建管理 volume
[root@localhost ~]# docker volume create my-vol   创建卷
my-vol
[root@localhost ~]# docker volume ls   查看卷列表
DRIVER              VOLUME NAME
local               1ad4af809485ff974988b79fdc3ada634c0b14b1324d9581369fd3b161632115
local               my-vol
local               portainer_data
[root@localhost ~]# docker volume inspect my-vol     查看卷信息
[
    {
        "CreatedAt": "2019-03-01T19:40:26+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]
[root@localhost ~]# docker volume rm my-vol       删除卷
my-vol
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               1ad4af809485ff974988b79fdc3ada634c0b14b1324d9581369fd3b161632115
local               portainer_data
使用卷启动容器

如下:

[root@localhost ~]# docker volume create my-vol2
my-vol2


方法一:
[root@localhost ~]# docker run -d -it --name storage-test -p 80:80 --mount source=my-vol2,target=/app nginx:latest
77d559ebcdb47e9b54b7023bbb6b7bf0a7135dc7458bb68c49311e1140251901


方法二   
[root@localhost ~]# docker run -d -it --name storage-test -p 80:80 -v myvol2:/app nginx:latest


[root@localhost ~]# docker inspect storage-test
 "Mounts": [
            {
                "Type": "volume",      
                "Name": "my-vol2",     
                "Source": "/var/lib/docker/volumes/my-vol2/_data",
                "Destination": "/app",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }

注:该卷有正确的 Source 和 Destination,可读写。

停止容器和清理卷
[root@localhost ~]# docker stop storage-test  #停止容器
storage-test
[root@localhost ~]# docker rm storage-test  #删除容器
storage-test
[root@localhost ~]# docker volume rm my-vol2   #删除卷
my-vol2

学习链接
当启动 service 的时候,如果 Driver 是 local 的时候,则任何容器都不能共享此数据。另外 service 只能使用 --mount 标志。

使用 volume driver
当使用 docker volume create 创建卷或启动尚未创建卷的容器的时候,可以指定卷驱动程序。
下面这个例子,首先创建独立卷时使用 volume driver,然后在启动创建新卷的容器时使用 volume driver。
初始设置
这个例子假定你有 2 个节点,第一个是 docker 主机,可以使用 SSH 连接到第二个节点。
在 docker 主机上安装 vieux/sshfx 插件:

$ docker plugin install --grant-all-permissions vieux/sshfs

使用 volume driver 创建卷
下面指定了一个 SSH 密码,但如果 2 台主机共享密钥已配置,则可以省略密码。每个 volume driver 可以有多个配置选项,使用 -o 标志指定。

$ docker volume create --driver vieux/sshfs \
  -o sshcmd=test@node2:/home/test \
  -o password=testpassword \
  sshvolume

创建容器时使用 volume driver
这里需要注意的是,如果需要在命令中使用选项,则必须使用 --mount,而不是 -v。

$ docker run -d \
  -it \
  --name sshfs-container \
  --volume-driver vieux/sshfs \
  --mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
  nginx:latest

bind mount 方式

通过 bind mount 方式,你可以将你主机上的任何文件或目录(绝对路径)挂载到容器中。

  • 挂载的文件或目录可以被任何进程修改,因此有时候容器中修改了该文件或目录将会影响其他进程

  • 如果挂载主机的文件或目录不存在将会自动创建。

  • 使用该方式不能通过 命令:docker volume 管理

相关用例:

bind mounts,一般情况在如下方式使用:

  • 被挂载的是一个文件,因为只有bind mount 方式可挂载文件

  • 从主机共享配置文件到容器。默认情况,docker 会绑定类似 /etc/resolv.conf 的文件用于 DNS 的解析。

  • 主机与容器共享源代码或构建工具。如,你可以将 Maven target/ 挂载到容器中,并且每次主机上构建 Maven 项目时,容器都可以访问重建的构件。

  • 主机的文件或目录结构与容器所需的一致时。

如果将空文件或目录挂载到容器,容器中的该目录又有文件,那么,这些文件将会被复制到主机上的目录中。如果将非空的文件或目录挂载到容器,容器中的该目录也有文件,那么,容器中的文件将会被隐藏。

volume与-V 两种方式对比

volume即volume挂载卷,-v即bind mount

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

tmpfs 方式

tmpfs,仅存储在主机系统的内存中,不会写入主机的文件系统。

相关用例:

tmpfs,使用它的情况一般是,对安全比较重视以及不需要持久化数据。

使用方式:

–tmpfs 和 --mount 的关系与前面两种方式的关系不用多说。那它们之间的差异是:

  • –tmpfs 不允许指定任何可配置选项
  • –tmpfs 不能用语 swarm service,你必须使用 --mount

容器中使用tmps

更多推荐

【ES实战】ES中关于segment的小结

文章目录ES中关于segment的小结ES中segment相关的原理在Lucene中的产生segment的过程。(Lucenecommit过程)ES为了实现近实时可查询做了哪些缩短数据可被搜索的等待时长增加数据的可靠性优化segment的数量段合并自动合并强制合并相关配置translog合并策略相关合并调度相关相关AP

王道408计组汇编语言部分学习总结

x86汇编语言指令基础x86处理器中程序计数器PC通常被称为IP高级语言—>汇编语言—>机器语言x86架构CPU,有哪些寄存器EAX通用寄存器EBXECXEDXESI变址寄存器变址寄存器可用于线性表、字符串的处理EDIEBP堆栈基指针堆栈寄存器用于实现函数调用ESP堆栈顶指针moveax,ebx#寄存器—>寄存器mov

WebGPU学习(10)---如何利用 WebGPU 实现高性能

虽然是WebGPU,但是速度很慢!?我们将解释如何充分利用WebGPU性能。这次我们以绘制大量物体为例,根据“使用纹理”中的代码进行一些更改并绘制900个立方体。要均匀分布立方体,可以按如下方式更新worldMatrix:for(leti=0;i<30*30;i++){draw({context,pipeline,ve

Git学习

什么是Git?Git是一个分布式版本控制系统,用于追踪文件和项目的变化。它可以帮助开发者或团队有效地协同工作,并提供版本管理、分支管理、代码合并等功能。Git的设计目标是速度快、简单易用。Git的基本概念仓库(Repository):Git仓库是存储代码和历史记录的地方。它可以位于本地计算机或远程服务器上。每个仓库都有

java自定义异常

首先跟前端商量好,用errMessage作为异常信息传输的关键字。1.创建一个公共异常类如果要获取"非法参数"的错误消息,可以使用CommonError.PARAMS_ERROR.getErrMessage()方法来获取。这种方式使得代码更具可读性和维护性。publicenumCommonError{//Java的枚举

Java中stream是什么?有什么作用?如何使用?

Java中stream是什么?有什么作用?如何使用?在Java中,Stream(流)是一种用于操作集合(Collection)、数组等数据源的API。它提供了一种功能强大且表达力高的编程模型,可以用更简洁、更具可读性的方式处理数据。Stream的主要作用是进行数据的转换、筛选、聚合等操作,可以极大地简化对数据的处理。使

基于Android系统英语学习助手APP设计开发

一、设计思路1.1设计目标1.2设计思路1.3设计内容1.3.1界面设计1.3.2功能模块设计1.3.3功能流程图1.3.4数据库设计(如果没有数据库这部分删除)1.4工具设备要求1.5技术方案二、设计过程与说明2.1技术路线2.2实现方案2.3实现原理2.3.1欢迎页面功能2.3.2首页功能2.3.3搜索2.3.4单

【小沐学CAD】虚拟仿真开发工具:GL Studio

文章目录1、简介2、软件功能3、应用行业3.1航空3.2汽车3.3防御3.4工业3.5电力与能源3.6医疗3.7空间3.8科技结语1、简介https://disti.com/gl-studio/https://ww2.mathworks.cn/products/connections/product_detail/gl

C语言——贪吃蛇小游戏

目录一、ncurse1.1为什么需要用ncurse:1.2ncurse的输入输出:1.2.1如何使用ncurse:1.2.2编译ncurse的程序:1.2.3测试输入一个按键ncurse的响应速度:1.3ncurse上下左右键获取:1.3.1如何查看宏定义的.h文件:1.3.2ncurse上下左右键获取:二、地图规划2

github一些有趣的使用场景和基本使用方法

文章目录github的使用入门安装Git创建GitHub帐户在本地设置Git克隆仓库进行修改和提交推送更改拉取更新删除Github上废弃的仓库注意github更多有趣的使用场景协作和社交编程文档和知识库学习和教育自动化工作流程数据科学和可视化用来写blogGitHubPagesJekyllHexo第三方集成开发者简历插

eNSP网络学习

一、eNSP1.什么是eNSPeNSP(EnterpriseNetworkSimulationPlatform)是一款由华为提供的免费的、可扩展的、图形化操作的网络仿真工具平台,主要对企业网络路由器、交换机进行软件仿真,完美呈现真实设备实景,支持大型网络模拟,让广大用户有机会在没有真实设备的情况下能够模拟演练,学习网络

热文推荐