管理Docker中的数据

默认情况下,在容器内创建的所有文件都存储在可写容器层中。这意味着:

  • 当该容器不再运行时,数据不会持久存在,如果另一个进程需要,则可能很难从容器中获取数据。
  • 容器的可写层紧密耦合到运行容器的主机。您无法轻松地将数据移动到其他位置。
  • 写入容器的可写层需要 存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供联合文件系统。与使用直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能 。

Docker有两个容器选项可以在主机中存储文件,因此即使在容器停止之后文件仍然存在:和 绑定挂载。如果你在Linux上运行Docker,你也可以使用tmpfs mount

继续阅读有关这两种持久数据方式的更多信息。

选择正确的挂载类型

无论您选择使用哪种类型的安装,数据在容器中看起来都是相同的。它作为目录或容器文件系统中的单个文件公开。

可视化卷,绑定装载和tmpfs 装载之间差异的简单方法是考虑数据在Docker主机上的位置。

Docker有两个容器选项可以在主机中存储文件,因此即使在容器停止之后文件仍然存在:卷(volume)和 绑定挂载(bind mount)。如果你在Linux上运行Docker,你也可以使用tmpfs mount

选择正确的挂载类型

无论您选择使用哪种类型的安装,数据在容器中看起来都是相同的。它作为目录或容器文件系统中的单个文件公开。

可视化卷,绑定装载和tmpfs 装载之间差异的简单方法是考虑数据在Docker主机上的位置。

卷存储在由Docker/var/lib/docker/volumes/在Linux上)管理的主机文件系统的一部分中。非Docker进程不应修改文件系统的这一部分。卷是在Docker中保留数据的最佳方式。

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

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

有关挂载类型的更多细节

  • volume:由Docker创建和管理。您可以使用该docker volume create命令显式创建卷,或者Docker可以在容器或服务创建期间创建卷。

    创建卷时,它存储在Docker主机上的目录中。将卷装入容器时,此目录是装入容器的目录。除了卷由Docker管理并与主机的核心功能隔离,其他类似于绑定挂载的工作方式。

    给定的容量可以同时安装到多个容器中。当没有正在运行的容器正在使用卷时,该卷仍可供Docker使用,并且不会自动删除。您可以使用删除未使用的卷docker volume prune

    装入卷时,可以命名或匿名。匿名卷在首次装入容器时未给出明确的名称,因此Docker为它们提供了一个随机名称,该名称在给定的Docker主机中保证是唯一的。除名称外,命名和匿名卷的行为方式相同。

    卷还支持使用卷驱动程序,这些驱动程序允许您将数据存储在远程主机或云提供的程序上,以及其他可能性。

  • bind mounts:自Docker早期开始提供。与卷相比,绑定装载具有有限的功能。使用绑定装入时,主机上的文件或目录将装入容器中。文件或目录由主机上的完整路径引用。该文件或目录不需要已存在于Docker主机上。如果它尚不存在,则按需创建。绑定挂载非常高效,但它们依赖于具有特定目录结构的主机文件系统。如果您正在开发新的Docker应用程序,请考虑使用命名卷。这是由于您无法使用Docker CLI命令直接管理bind mounts。

绑定挂载允许访问敏感文件

使用绑定装入的一个副作用,无论好坏,都可以通过容器中运行的进程更改主机文件系统 ,包括创建,修改或删除重要的系统文件或目录。这是一种强大的功能,可能会产生安全隐患,包括影响主机系统上的非Docker进程。

  • tmpfs挂载:tmpfs挂载不会保留在磁盘上,无论是在Docker主机上还是在容器中。它可以在容器的生命周期中由容器使用,以存储非持久状态或敏感信息。例如,在内部,swarm服务使用tmpfs挂载将隐私挂载到服务的容器中。

bind mounts和volume都可以使用-v  or --volume 标志装入容器,但每种装置的语法略有不同。对于tmpfs  mount,您可以使用该 --tmpfs标志。但是,在Docker 17.06及更高版本中,对于bind mounts,volume或tmpfs挂载,我们建议使用标志 --mount对容器和服务挂载,因为语法更清晰。

volume的使用用例

volume是在Docker容器和服务中持久保存数据的首选方法。卷的使用用例:

  • 在多个运行容器之间共享数据。如果未显式创建它,则会在第一次将其装入容器时创建卷。当该容器停止或被移除时,该卷仍然存在。多个容器可以同时安装相同的卷,可以是读写也可以是只读。仅在您明确删除卷时才会删除卷。

  • 当Docker主机不能保证具有指定的目录或文件结构时。Volumes可帮助您将Docker主机的配置与容器运行时分离。

  • 如果要将容器的数据存储在远程主机或云提供程序上,而不是本地存储。

  • 当您需要备份,还原或将数据从一个Docker主机迁移到另一个Docker主机时,卷是更好的选择。您可以使用卷停止容器,然后备份卷的目录(例如/var/lib/docker/volumes/<volume-name>)。

bind mounts的良好用例

通常,您应该尽可能使用卷。bind mounts适用于以下类型的用例:

  • 将配置文件从主机共享到容器。这就是Docker默认通过/etc/resolv.conf从主机安装到每个容器中来为容器提供DNS解析的方式 。

  • 在Docker主机上的开发环境和容器之间共享源代码或构建工件。例如,您可以将Maven target/ 目录安装到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问重建的构建。

    如果您以这种方式使用Docker进行开发,你的Dockerfile将会复制生产准备就绪的构建 指向到镜像中,而不再依赖于bind mounts。

  • 当Docker主机的文件或目录结构保证与容器所需的绑定装载一致时。

tmpfs挂载的好用例

tmpfs当您不希望数据在主机或容器内持久存在时,最好使用tmpfs挂载。这可能是出于安全原因,或者在应用程序需要编写大量非持久状态数据时保护容器的性能。

使用bind mounts或volume的提示

如果您使用bind mounts或volume,请记住以下几点:

  • 如果将空volume 挂在到容器中已存在的文件或目录中,则会将这些文件或目录传播(复制)到volume中。同样,如果启动容器并指定尚不存在的卷,则会为您创建一个空卷。这是预先填充另一个容器所需数据的好方法。

  • 如果将bind mounts或非空volume 装入容器中已存在某些文件或目录,则挂载会覆盖这些文件或目录,就像将文件保存到 Linux主机上/mnt然后安装USB驱动器进入/mnt/mnt在卸载USB驱动器之前,USB驱动器的内容会覆盖内容。隐藏的文件不会被删除或更改,但在安装mount binds或volume时无法访问

docker从零开始 存储(一)存储概述的更多相关文章

  1. docker从零开始 存储(六)存储驱动如何选择

    Docker存储驱动程序 理想情况下,将非常少的数据写入容器的可写层,并使用Docker卷来写入数据.但是,某些工作负载要求您能够写入容器的可写层.这是存储驱动程序的用武之地. Docker使用可插拔 ...

  2. docker从零开始 存储(五)存储驱动介绍

    关于存储驱动程序 要有效地使用存储驱动程序,了解Docker如何构建和存储镜像以及容器如何使用这些镜像非常重要.您可以使用此信息做出明智的选择,以确定从应用程序中保留数据的最佳方法,并避免在此过程中出 ...

  3. centos7下安装docker(13.1docker存储--data volume)

    我们现在知道docker 有两种存储方式:storage driver和data volume stroage driver这种存储方式主要是存储那些无状态的数据,是镜像层和容器层组成的,而data ...

  4. Docker镜像的目录存储讲解

    我们成功安装完docker后,执行命令行sudo docker run hello-world, 如果是第一次执行,则会从远程拉取hello-world的镜像到本地,然后运行,显示hello worl ...

  5. docker容器的持久化存储:Volume

    独立于docker容器的持久化存储: 法(1):自动将服务器文件夹挂载到容器内部文件夹/usr/share/nginx/html,这样只修改服务器文件夹下的内容即可对应修改容器内部文件夹的内容 将服务 ...

  6. File存储 - 文件存储

    博客地址 http://www.cnblogs.com/mmyblogs/p/6107472.html(转载请保留) 文件存储 文件存储是 Android 中最基本的一种数据存储方式,它不对存储的内容 ...

  7. 把mmapv1存储引擎存储的mongodb3.0数据库数据复制到WiredTiger存储引擎的mongodb3.2中

    mongodb3.0在mmapv1的存储引擎基础上添加了一个新的存储引擎WiredTiger.但是3.0的默认存储引擎依旧是mmapv1,因此我们项目之前也就用的默认方式. 但是mongodb更新实在 ...

  8. COM结构化存储中存储对象或者流对象的命名规则

      COM结构化存储中存储对象或者流对象的命名规则

  9. 万能存储工具类SDCard存储 /data/data/存储 assets存储 raw存储

    万能存储工具类 SDCard存储  /data/data/存储  assets存储 raw存储 粘贴过去就能够用了 <uses-permission android:name="and ...

随机推荐

  1. 关于react-redux中Provider、connect的解析

    Provider 是什么 react-redux 提供的一个 React 组件 作用 把 store 提供给其子组件 //使用 redux 的 createStore 方法创建的一个 store co ...

  2. Python中运算符"=="和"is"的差别分析

    前言 在讲is和==这两种运算符区别之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识).python type()(数据类型)和value(值).is和==都是对对象进行比 ...

  3. android多点触控自由对图片缩放

    在系统的相册中,观看相片就可以用多个手指进行缩放. 要实现这个功能,只需要这几步: 1.新建项目,在项目中新建一个ZoomImage.java public class ZoomImageView e ...

  4. 使用Microsoft EnterpriseLibrary(微软企业库)日志组件把系统日志写入数据库和xml文件

    这里只是说明在项目中如何配置使用微软企业库的日志组件,对数据库方面的配置请参考其他资料. 1.在项目中添加Microsoft.Practices.EnterpriseLibrary.Data.dll. ...

  5. LTE QOS

    http://wenku.baidu.com/link?url=ziFIkdKaC7MU2RY-bTOp2bt87WFPw5_02bqmYs5W6w4ktOfPHEcWesK1U2T7YiyXjVSM ...

  6. Eclipse下JRebel6.5.0热部署插件安装、破解及配置

    发现一个问题:如果安装了jRebel,但是并未对项目添加jRebel监听时,如果重写jar包中的类, 虽然重写后的类会得到编译(classes中的class已经是修改后的class),但是并不会调用重 ...

  7. EF 4.0 升级到 6.0 问题解决办法

    1.工具->库程序包管理器-> 管理解决方案的Nuget 程序包  找到EntityFramework 管理,勾选把需要进入 EF6.0的 项目,进行升级.

  8. [剑指Offer] 30.连续子数组的最大和

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  9. Android逆向之旅---静态方式分析破解视频编辑应用「Vue」水印问题

    一.故事背景 现在很多人都喜欢玩文艺,特别是我身边的UI们,拍照一分钟修图半小时.就是为了能够在朋友圈显得逼格高,不过的确是挺好看的,修图的软件太多了就不多说了,而且一般都没有水印啥的.相比较短视频有 ...

  10. BZOJ 3224 Tyvj 1728 普通平衡树 | Splay 板子+SPlay详细讲解

    下面给出Splay的实现方法(复杂度证明什么的知道是 nlogn 就可以啦) 首先对于一颗可爱的二叉查找树,是不能保证最坏nlogn的复杂度(可以想象把一个升序序列插入) (二叉查找树保证左子树元素大 ...