操作系统与存储

操作系统中将存储定义为 Volume(卷) ,这是对物理存储的逻辑抽象,以达到对物理存储提供有弹性的分割方式。另外,将外部存储关联到操作系统的动作定义为 Mount(挂载)。

Docker 中的三种挂载方式

  1. Bind

把宿主机的某个目录(或文件)挂载到指容器的指定目录(后文件)下,比如下面的命令就表示通过 Bind 方式将外部的 HTML 文档挂载到 Nginx 容器的模式网站根目录下:

  1. $ docker run -v ~/zioyi/html:/usr/share/nginx/html -p 81:80 -d --name nginx_bind nginx:latest

来验证一下

  1. $ curl localhost:81
  2. <html>
  3. <title>Hi, Docker</title>
  4. <h1>You mount me by Bind mode</h1>V
  5. </html>

这种方式的缺点就是被挂载的宿主机目录(或文件)不收保护,任何容器都可以去随意修改。

  1. Volume

Volume 模式下,我们需要通过docker volume命令来创建一个 Volume。实际上,是在 Docker 的/var/lib/docker/volumes/文件夹内创建一个相同名字的文件夹来保存数据。因为这个文件夹在 Docker 管控范围里,Docker 可以根据挂载的设定来控制容器对 Volume 的读写权限。

  1. # 创建 volume
  2. $ docker volume create nginx-volume
  3. nginx-volume
  4. $ docker run --mount type=volume,source=nginx-volume,destination=/usr/share/nginx/html -p 82:80 -d --name nginx_volume nginx:latest

此时,nginx_volume 容器已经挂载了 nginx-volume 卷,通过 inpsect 命令可以看到:

  1. $ docker inspect nginx_volume
  2. {...
  3. "Mounts": [
  4. {
  5. "Type": "volume",
  6. "Name": "nginx-volume",
  7. "Source": "/var/lib/docker/volumes/nginx-volume/_data",
  8. "Destination": "/usr/share/nginx/html",
  9. "Driver": "local",
  10. "Mode": "z",
  11. "RW": true,
  12. "Propagation": ""
  13. }
  14. ],
  15. ...}

我们进入容器中修改/usr/share/nginx/html中的 HTML 文档

  1. $ docker exec -it nginx_volume bash
  2. root@d0df9a0eb3e5:/# echo "<html>
  3. <title>Hi, Docker</title>
  4. <h1> You mount me by Volume mode</h1>
  5. </html>" > /usr/share/nginx/html/index.html
  6. root@d0df9a0eb3e5:/# exit
  7. exit
  8. # 在宿主机中验证
  9. $ curl localhost:82
  10. <html>
  11. <title>Hi, Docker</title>
  12. <h1> You mount me by Volume mode</h1>
  13. </html>

当我们删除容器 nginx_volum 时,volume 也不会删除

  1. $ docker stop nginx_volume && docker rm nginx_volume
  2. $ docker run --mount type=volume,source=nginx-volume,destination=/usr/share/nginx/html -p 82:80 -d --name nginx_volume nginx:latest
  3. $ curl localhost:81
  4. <html>
  5. <title>Hi, Docker</title>
  6. <h1>You mount me by Volume mode</h1>
  7. </html>

此外,我们还可以在挂载时设定容器只能读取卷,无法进行写操作,这种方式多用于容器读取配置文件的场景:

  1. $ docker run --mount type=volume,source=nginx-volume,destination=/usr/share/nginx/html,readonly -p 82:80 -d --name nginx_volume nginx:latest
  2. $ docker exec -it nginx_volume bash
  3. root@782b11b3cc43:/#
  4. # 当我们再次修改时报错
  5. root@782b11b3cc43:/# echo "hello" > /usr/share/nginx/html/index.html
  6. bash: /usr/share/nginx/html/index.html: Read-only file system
  1. tmpfs

tmpfs 挂载是临时的,仅保留在主机内存中。当容器停止时,tmpfs 挂载被移除,写入的文件不会被持久化

  1. $ docker run --mount type=tmpfs,destination=/usr/share/nginx/html -p 83:80 -d --name nginx_tmpfs nginx:latest
  2. $ docker inspect nginx_tmpfs
  3. {...
  4. "Mounts": [
  5. {
  6. "Type": "tmpfs",
  7. "Source": "",
  8. "Destination": "/usr/share/nginx/html",
  9. "Mode": "",
  10. "RW": true,
  11. "Propagation": ""
  12. }
  13. ],
  14. ...}

进入容器 nginx_tmpfs 修改数据

  1. $ docker exec -it nginx_tmpfs bash
  2. root@68b03d8d3ec4:/# echo "<html>
  3. <title>Hi, Docker</title>
  4. <h1> You mount me by tmpfs mode</h1>
  5. </html>" > /usr/share/nginx/html/index.html
  6. root@68b03d8d3ec4: exit
  7. exit
  8. # 验证
  9. $ curl localhost:83
  10. <html>
  11. <title>Hi, Docker</title>
  12. <h1> You mount me by tmpfs mode</h1>
  13. </html>

tmpfs 无法对容器内产生的数据持久化,一般不使用。

总结

  1. 对比 Docker 三种挂载方式:
Bind Volume tmpfs
volume 位置 可指定任意位置 /var/lib/docker/volumes/... 宿主机内存中
对已有mount point 影响 隐藏并替换为 volume 原有数据复制到 volume -
是否支持单个文件 支持 不支持,只能是目录 -
权限控制 可设置为只读,默认为读写权限 可设置为只读,默认为读写权限 -
移植性 移植性弱,与 host path 绑定 移植性强,无需指定 host 目录 -
是否支持持久化 支持 支持 不支持
  1. 关于 Volume

    Volume 模式并不是 Docker 一开始就有的,Docker 最初认为 Volume 就只是一种“外部宿主机的磁盘存储到内部容器的映射关系”,但后来发现事情并没有那么简单:存储的位置并不局限于外部宿主机,存储的介质并不局限于物理磁盘,存储的管理也并不局限于映射关系。Bind 模式无法很好地解决多跨宿主机共享存储的问题、Bind 模式的管理问题等。

    提出 Volume 的最核心的目的是提升Docker对不同存储介质的支撑能力,这同时也可以减轻Docker本身的工作量。存储不仅有挂载在宿主机上的物理存储,还有网络存储,Docker 抽象出了存储启动(Sotroage Driver)来去解决对网络存储的读写问题。

Docker与数据:三种挂载方式的更多相关文章

  1. Glusterfs volume 的三种挂载方式

    在上一篇中我们介绍了Glusterfs在CentOS7上的安装,并且提到Glusterfs client端有三种:Native client,NFS,Samba, 今天我们就来一起学习下这三种方式. ...

  2. python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)

    昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...

  3. CentOS安装docker ce的三种方式

    参考文章: CentOS安装docker ce的三种方式: 1.环境 CentOS Linux release 7.6.1810 (Core) 2.卸载旧版本 sudo yum remove dock ...

  4. 大数据学习day13------第三阶段----scala01-----函数式编程。scala以及IDEA的安装,变量的定义,条件表达式,for循环(守卫模式,推导式,可变参数以及三种遍历方式),方法定义,数组以及集合(可变和非可变),数组中常用的方法

    具体见第三阶段scala-day01中的文档(scala编程基础---基础语法)  1. 函数式编程(https://www.cnblogs.com/wchukai/p/5651185.html): ...

  5. Hive metastore三种配置方式

    http://blog.csdn.net/reesun/article/details/8556078 Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适 ...

  6. Map三种遍历方式

    Map三种遍历方式 package decorator; import java.util.Collection; import java.util.HashMap; import java.util ...

  7. JSON的三种解析方式

    一.什么是JSON? JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定 ...

  8. C++的三种继承方式简述

    C++对父类(也称基类)的继承有三种方式,分别为:public继承.protected继承.private继承.三种继承方式的不同在于继承之后子类的成员函数的"可继承性质". 在说 ...

  9. Linux 双线策略路由的三种实现方式总结+端口映射

    Linux 双线策略路由的三种实现方式总结+端口映射 Linux 双线策略路由的三种实现方式总结+端口映射 网络环境 服务器(网关): eth0 为LAN口,IP为 LAN_IP = 192.168. ...

随机推荐

  1. 第九篇 -- 可以上网,连WIFI弹出网页

    最近在调试WIFI模块时,程序路径没走对,导致运行了其他的函数,修改了配置文件,之后每次连接WIFI时都会弹出网页,并且明明可以上网,下面电脑符号那儿还会出现黄标,甚是心烦.上网搜索一番,终是解决了. ...

  2. docker exec 参数详解

    Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] Run a command in a running container Options ...

  3. Kafka流处理内幕详解

    1.概述 流处理是一种用来处理无穷数据集的数据处理引擎.通常无穷数据集具有以下几个特点: 无穷数据:持续产生的数据,它们通常会被称为流数据.例如:银行信用卡交易订单.股票交易就.游戏角色移动产生的数据 ...

  4. springboot整合mybatis源码分析

    springboot整合mybatis源码分析 本文主要讲述mybatis在springboot中是如何被加载执行的,由于涉及的内容会比较多,所以这次只会对调用关系及关键代码点进行讲解,为了避免文章太 ...

  5. Python 爬取 ajax 返回的数据

    1 from urllib.request import quote, unquote 2 import random 3 import requests 4 5 #quote 将单个字符串编码转化为 ...

  6. SpringBoot自动装配-源码分析

    1. 简介 通过源码探究SpringBoot的自动装配功能. 2. 核心代码 2.1 启动类 我们都知道SpringBoot项目创建好后,会自动生成一个当前模块的启动类.如下: import org. ...

  7. Spring Boot中使用时序数据库InfluxDB

    除了最常用的关系数据库和缓存之外,之前我们已经介绍了在Spring Boot中如何配置和使用MongoDB.LDAP这些存储的案例.接下来,我们继续介绍另一种特殊的数据库:时序数据库InfluxDB在 ...

  8. spring Data Rest 远程命令执行漏洞(CVE-2017-8046)

    参考 文章https://blog.csdn.net/weixin_41438728/article/details/110425174 影响版本 Spring Framework 5.0 to 5. ...

  9. 🏆【Java技术专区】「延时队列专题」教你如何使用【精巧好用】的DelayQueue

    延时队列前提 定时关闭空闲连接:服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之. 定时清除额外缓存:缓存中的对象,超过了空闲时间,需要从缓存中移出. 实现任务超时处理:在网络协议滑动窗口请求 ...

  10. AuthorizationFailed""The client '***' with object id '***' does not have authorization to perform action 'or the scope is invalid. If access was recently granted, please refresh your credentials

    Warning  SyncLoadBalancerFailed  4m9s (x11 over 29m)   service-controller  Error syncing load balanc ...