docker 挂载目录_Docker容器数据管理

在Docker容器内部创建的文件默认存储在可写的容器层,容易产生几个问题:

  • 当容器不存在时,数据文件不能持久化,同时这些数据文件不方便在容器之外被其他进程使用。
  • 当容器运行的时候容器可写层严重依赖宿主机,不能轻易移动这些数据文件到其他地方。
  • 在容器层写数据文件需要存储驱动(storage driver)来管理文件系统,存储驱动使用Linux内核提供的联合文件系统, 与data volumes直接将文件写到宿主机文件系统相比,性能降低。

Docker为容器提供了两种方式将数据文件存储到宿主机上,即使容器停止运行或者被删除数据文件都可以持久化,这两种方式分别为 volumes与bind mounts,当然如果Docker容器在Linux运行,也可以使用tmpfs mounts。不管使用哪种mount方式,数据文件在Docker容器内部文件系统中是相同的, 要么是一个文件夹,或者一个独立的文件。

4e3c0b59450c301ffddf34930e456e8a.png
  • volumes 存储在Docker安装目录下,在Linux上默认指的是/var/lib/docker/volumes,Docker会自动管理,非Docker进程不应该修改这些文件系统,volumes是在Docker中是最好的数据持久化方式。
  • bind mount 存储在宿主机文件系统的任何地方,宿主机上的非Docker进程或者Docker容器都可以在任何时候修改它。
  • tmpfs mount 始终存储在宿主机系统内存中,不会被写到宿主机的文件系统中。

详细介绍

  • volumes

Docker会自动创建并管理volumes,当然可以通过命令docker volumes create明确的创建一个volume,当成功创建了一个volume时,它存储在宿主机的某个目录下, 当把这个volume挂载到一个Docker容器时,这个目录自然会挂载到容器内部,volumes与bind mount工作方式类似,除了volumes是被Docker自动管理以及隔离性, 两者没什么区别。

[root@ins ~]# docker volume create mmmm[root@ins ~]# docker volume createcc0613fe5a32273134a76e5670f166f6e248634e909d64cf00061130086f5ae5[root@ins ~]# docker volume lsDRIVER VOLUME NAMElocal cc0613fe5a32273134a76e5670f166f6e248634e909d64cf00061130086f5ae5local mm[root@ins ~]# 

一个volume可以同时挂载到多个Docker容器,当没有任何Running状态的容器使用这个volume,这个volume仍然有效并且不会被自动删除,除非通过执行命令 docker volume prune进行删除。当挂载一个volume时,这个volume可能匿名或者有一个名字,当它首次挂载到容器中的时候如果Docker发现该volume没有一个明确的名字, 则会给它分配一个随机的名字,这个名字在Docker宿主机上是唯一的。

volumes支持volume driver,允许通过driver将数据存储到远程机器或者云厂商等。

  • bind mounts

这种方式与volumes相比,有一些功能限制。当使用bind mounts时,宿主机上的一个文件或者目录被挂载到Docker容器中,这个文件或者目录通过它在 宿主机上的完整路径名被引用,他们在宿主机上不是必须存在的,在需要的时候Docker会自动创建它。bind mounts非常高效,但是他们依赖于宿主机文件系统明确的目录结构, 同时通过Docker CLI命令无法直接管理这些bind mounts。

注意:正在运行的容器中进程可以直接改变宿主机上的文件系统,包括创建、修改以及删除重要的文件或者目录,会引发安全风险问题,影响宿主机上运行的其它非Docker进程,请注意控制权限。

  • tmpfs mounts

这种方式不能将数据持久化到磁盘,一个tmpfs可以被一个容器在整个生命周期内使用,用于存储一些非持久状态或者敏感数据,比如swarm services使用tmpfs将secrets 挂载到service的容器中。

volumes与bind mounts都能通过-v 或者 --volume flag参数挂载到容器中,对于 tmpfs mount,可以使用--tmpfs flag参数,在Docker17.06以及更高版本中, 推荐使用--mount,对于这三种方式--mount语法更明确。


三种方式优点

volumes可以在多个运行的容器之间共享,解耦Docker容器与宿主机文件系统,支持存储远程以及云厂商,方便在不同的Docker机器上迁移数据。

bind mounts可以让多个容器共享宿主机文件,比如Docker就是通过将/etc/resolv.conf挂载到每个容器方式实现DNS解决方案,开发的时候可以共享项目源代码,在容器内编译运行。

tmpfs保存敏感数据,非持久化数据,由于保存在内存中,相比文件系统性能更高。

默认规则:

  • 如果将一个空的volumes挂载到容器内的某个目录,如果该目录中已经有一些文件或者目录,那么这些文件或者目录会直接复制到volumes中。
  • 如果将一个bind mount或者非空volume挂载到容器的某个目录,这个目录中已经存在文件或者目录,那么这个目录中的文件或者目录会被mount覆盖,被覆盖的文件或者目录只是暂时被隐藏,当移除挂载时即可恢复。

使用介绍

早期,Docker都是通过flag -v或者--volume给单机容器实现挂载,而swarm service则是通过 flag --mount实现,在Docker 17.06版本开始,--mount也适用于单机容器挂载,该命令的 语法更灵活明确,在使用-v或者--volume时尽量使用--mount代替。

-v or –volume

-v db:/var/lib/mysql,通过英文冒号分隔,如果volume有名字,冒号之前的是volume,如果volume匿名,则直接 -v /var/lib/mysql,如果需要控制容器读写volume权限,可以 -v db:/var/lib/mysql:ro

–mount

--mount包含许多以英文逗号分隔的key-value键值对,它的语法比-v以及--volume更详细,key的顺序无关紧要,主要包含以下key(只列举部分)

  • type 它的值可以为 volume、bind或者tmpfs
  • source 对于已命名的volume,source即为volume名字,volume匿名,则该值为空,source也可定义为src
  • destination 指定挂载到容器中的path路径,可以定义为dst、destination或者target
  • readonly 如果存在,则被挂载的volume在容器中只能读
  • volume-opt 可选参数,可以定义多次,key-value形式

基础使用

创建一个volume

docker volume create sunjinfu

查看volume

docker inspect sunjinfu[ { "CreatedAt": "2019-04-20T15:00:12+08:00

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 获取应用列表,获取全部应用列表

有时需对已安装的应用进行管理 , 这里我简单的写了获取应用程序列表。代码如下:package com.lml.applicationtest;import java.util.List;import android.app.Activity;import android.content.Context;import android.content.pm.PackageInfo;import an…

IndexNotReadyException: Please change caller according to com.intellij.openapi.project.IndexNotReady

打开AS有时会报这个错,之前没怎么在意,因为完全没影响,但是看起来标红就很难受,总觉得认真有强迫症的程序员才是好的程序员,所以特意查了解决办法,也很简单,就点击Files----->Invalidate and…

java数组有跨类建立对象_必会的 55 个 Java 性能优化细节!一网打尽!

程序员的成长之路互联网/程序员/成长/职场 关注阅读本文大概需要 10 分钟。来源:https://yq.aliyun.com/articles/662001在 Java 程序中,性能问题的大部分原因并不在于 Java 语言,而是程序本身。养成良好的编码习惯非常重要,能够显…

android平板截屏方法,Android 各种截屏方法

1 应用内截屏(无SurfaceView, TextureView)boolean cacheEnable captureView.isDrawingCacheEnabled();captureView.setDrawingCacheEnabled(true);captureView.buildDrawingCache();Bitmap bitmap captureView.getDrawingCache();cache[0] Bitmap.createBitmap(bitmap);cap…

android string 去掉斜杠,Android – PATH中的改装和斜杠字符

我正在面临一个与Retrofit的问题,并希望找到一个合适的答案,作为唯一的方式,我可以想到它是相当丑陋和不实际.Retrofit PATH注释在开始时需要一个“/”(你可以从这个从库中提取的代码中读取:/** Loads {link #requestUrl},{link #requestUrlParamNames},and {link #…

新手操作HTML

一、 首先得学会使用HTML5-API手册,因为HTML的属性有很多很多,如果将这些属性全部记下来的话得不偿失,需要花费大量的时间和经历,因此我们需要学会使用这个帮主文档才能全面而深入的了解HTML; 就像你去找对象一样&am…

nginx 判断手机端跳转_nginx基本功能和工作原理

nginx能做什么反向代理正向代理负载均衡HTTP服务器(包含动静分离)反向代理和正向代理1.正向代理简单的说,我是一个用户,我无法直接访问一个网站,但是我能访问一个代理服务器,这个代理服务器能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内…

Node.js教程-express框架

概述 Express是基于Node.js平台(建立在Node.js内置的http模块上),快速、开放、极简的Web开发框架。 中文官网 http://www.expressjs.com.cn/。 Github地址:https://github.com/orgs/expressjs。 Express核心特性: 可设置中间件来响应 HTTP…

android开发适配深色模式,手机不支持深色模式,如何用软件解决深色模式的问题?(附有系统全局深色模式实现方法...

本帖最后由 巷子口的你 于 2020-8-8 07:57 编辑1.92允许通过设置为助手应用来饮捷切频深色模式(设置入口一般为系统默认应用-助手和语音输人, MIU需要设置为语音助手)提醒:稳定模式一股不用开启, OPPO等设备开启深色模式后自动关团的才需要开启,据反馈,部分OPPO设备在锁屏后还是…

python猜数字游戏续_python3实现猜数字游戏

本文实例为大家分享了python3实现猜数字游戏的具体代码,供大家参考,具体内容如下 需求目标: 需求:猜数字游戏 1: 开始游戏产生一个1~100随机数 2: 用户输入,游戏根据输入值提示大或者小 3: 用户根据提示继续输入,知道猜…

HTML的script标签

在 HTML 页面中插入一段 JavaScript: 这句话可能大家一开始根本不了解JavaScript,是什么? 在我的了解中JavaScript并不是用java语言开发的,人家用的是c语言和另外一种语言的结合体,就像印度和印度尼西亚根本不是同一…

织梦cms在线生成html,织梦CMS标签生成器

标题 / 关键词 / 描述title / keywords / description{dede:field.title/} - {dede:global.cfg_webname/}获取顶级栏目相关信息gettoptype(me,typename){dede:field.typeid functiongettoptype(me,typename)/}获取上级栏目相关信息getredtype(me,typename){dede:field.typeid f…

tesseract4.0.0 中文语言包_一份TensorFlow2.0中文教程

近两个月,网上已经出现了大量 TensorFlow 2 0 英文教程。在此文章中,本文为大家推荐一个持续更新的中文教程,以便大家学习。来源:机器之心今年 3 月份,谷歌在 Tensorflow Developer Summit 2019 大会上发布 TensorFlow…

HTML的块级元素和行级元素的标签列表

行内元素列表: <a>标签可定义锚点 <abbr>表示一个缩写形式 <acronym>定义只取首字母缩写 <b>字体加粗 <bdo>可覆盖默认的文本方向 <big>大号字体加粗 <br>换行符号 <cite>引用进行定义 <code>定义计算机代码文…

android光传感实现摩斯密码,根据莫尔斯代码 - Android的闪烁闪光。 如何避免ANR次数由于睡觉? (火炬APP)...

所以&#xff0c;我做了一个火把应用...正常火炬功能完全正常&#xff0c;没有任何问题。下面介绍以下功能&#xff0c;可能会导致可能的ANR的说&#xff0c;我想通过闪烁的闪光灯发出SOS信息(莫尔斯电码)。 (其111-000-111)&#xff0c;所以它开 - 开 - 开 - 关 - 关 - 和重复…

mysql select count 5万条数据很慢_mysql亿级数据数据库优化方案测试银行交易流水记录的查询...

点击上方△蓝字关注我们带你征服编程和泡妞两座大山对MySQL的性能和亿级数据的处理方法思考&#xff0c;以及分库分表到底该如何做&#xff0c;在什么场景比较合适&#xff1f;比如银行交易流水记录的查询限盐少许&#xff0c;上实际实验过程&#xff0c;以下是在实验的过程中做…

HTML的引用

<q></q>定义比较短的引用&#xff0c;直接加双引号 <blockquote cite"来源的网址"</blockquote>浏览器用缩进的形式显示该段文本 HTML5强调&#xff1a;语义与现实分离&#xff08;意思是说写好的东西普普通通&#xff0c;但是可以通过另外的…

html中如何让图片交错,HTML5/Canvas 光圈交错幻觉

JavaScript语言&#xff1a;JaveScriptBabelCoffeeScript确定// RequestAnimationFrame shim by Paul Irishwindow.requestAnimFrame (function() {return window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||function(…

jvm垃圾回收机制_干货|JVM垃圾回收机制

前言不同于C程序员必须自己完成内存的分配、使用和释放&#xff0c;JAVA语言提供了垃圾回收机制(GC&#xff0c;Garbage Collection)&#xff0c;所以JAVA程序员仅需要负责分配和使用内存即可&#xff0c;而释放内存则由GC负责。这样程序员就从讨厌的内存管理的工作中脱身了。本…

HTML的格式化应用

<del></del>在文本中增加删除线,但是是非错误的内容 <ins></ins>在文本中增加下划线表示插入的内容 通常del和ins成双出现(删除线和插入线) <s></s>也是在文本中增加删除线&#xff0c;但是是错误的内容需要删除 <u></u>在…