操作系统与存储

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

Docker 中的三种挂载方式

  1. Bind

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

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

来验证一下

$ curl localhost:81
<html>
<title>Hi, Docker</title>
<h1>You mount me by Bind mode</h1>V
</html>

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

  1. Volume

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

# 创建 volume
$ docker volume create nginx-volume
nginx-volume
$ 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 命令可以看到:

$ docker inspect nginx_volume
{...
"Mounts": [
{
"Type": "volume",
"Name": "nginx-volume",
"Source": "/var/lib/docker/volumes/nginx-volume/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
...}

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

$ docker exec -it nginx_volume bash
root@d0df9a0eb3e5:/# echo "<html>
<title>Hi, Docker</title>
<h1> You mount me by Volume mode</h1>
</html>" > /usr/share/nginx/html/index.html
root@d0df9a0eb3e5:/# exit
exit
# 在宿主机中验证
$ curl localhost:82
<html>
<title>Hi, Docker</title>
<h1> You mount me by Volume mode</h1>
</html>

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

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

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

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

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

$ docker run --mount type=tmpfs,destination=/usr/share/nginx/html -p 83:80 -d --name nginx_tmpfs nginx:latest

$ docker inspect nginx_tmpfs
{...
"Mounts": [
{
"Type": "tmpfs",
"Source": "",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...}

进入容器 nginx_tmpfs 修改数据

$ docker exec -it nginx_tmpfs bash
root@68b03d8d3ec4:/# echo "<html>
<title>Hi, Docker</title>
<h1> You mount me by tmpfs mode</h1>
</html>" > /usr/share/nginx/html/index.html
root@68b03d8d3ec4: exit
exit # 验证
$ curl localhost:83
<html>
<title>Hi, Docker</title>
<h1> You mount me by tmpfs mode</h1>
</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. Leetcode13. 罗马数字转整数Leetcode14. 最长公共前缀Leetcode15. 三数之和Leetcode16. 最接近的三数之和Leetcode17. 电话号码的字母组合

    > 简洁易懂讲清原理,讲不清你来打我~ 输入字符串,输出对应整数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/63802fda72be45eba98d9e4 ...

  2. VM虚拟机桥接模式无法联网、NAT模式能正常联网

    桥接模式:使虚拟机客户机可以和主机在同一网段,这样,和主机同局域网内的其他主机就也可以ping到虚拟机了: 因此,虚拟机设置为桥接模式,这样以后就可以方便的使用虚拟机了: 有时,虚拟机为桥接模式上不了 ...

  3. C++第四十八篇 -- 字符串分离方法

    举例:Test_Bluetooth.exe -param_split Test_Bluetooth.cpp #include "pch.h" #include <iostre ...

  4. 基于Flask开发网站 -- 前端Ajax异步上传文件到后台

    大家好,我是辰哥~ 辰哥最近利用空闲时间在写一个在线可视化平台,过程中也觉得一些技术还是比较有意思的,所以就以模块化的形式分享出来.如:从网页界面(前端)上传文件到服务器(后端). 放一下该模块的界面 ...

  5. tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

    writedby 张艳涛,看springmvc 的源码太难了,怎么办, 这篇文章主要分析了看透springmvc的第9章结尾的 如何解析xml 命名空间标签 <?xml version=&quo ...

  6. videojs文档翻译Guides-Plugins

    Video.js Plugins Video.js的一大优势在于其插件生态系统,允许来自世界各地的作者分享他们的视频播放器定制.这包括从最简单的UI调整到新的播放技术和资源处理程序的一切! 因为我们将 ...

  7. 通过jstack日志分析和问题排查

    简介 jstack用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁.死循环 ...

  8. 除了Swagger UI,你还能选择 IGeekFan.AspNetCore.RapiDoc

    IGeekFan.AspNetCore.RapiDoc 看到博客园上的这个文章,说了下Knife4J,评论里有人推荐RapiDoc,放了几个图,看了下,还不错. 心里 便有个想法,借着上次研究 Kni ...

  9. JUC学习笔记(三)

    JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html JUC学习笔记(二)https://www.cnblogs.com/lm66/p/1511 ...

  10. Linux命令(二)之克隆虚拟机及修改网卡信息

    .subTitle { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); border- ...