容器中的数据可以存储在容器层。但是将数据存放在容器层存在以下问题:

数据不是持久化。意思是如果容器删除了,这些数据也就没了

主机上的其它进程不方便访问这些数据

对这些数据的I/O会经过存储驱动,然后到达主机,引入了一层间接层,因此性能会有所下降

Docker 提供了3种持久化数据的方式:

volumes:存于主机文件系统中的某个区域,由Docker管理(/var/lib/docker/volumes/ on Linux)。非Docker进程不应该修改这些数据。卷是Docker中持久化数据的最好方式

bind mount:存于主机文件系统中的任意位置。非Docker进程可以修改这些数据

tmpfs mount(Linux中):存于内存中(注意,并不是持久化到磁盘)。在容器的生命周期中,它能被容器用来存放非持久化的状态或敏感信息

volumes

如果没有显式创建,一个卷会在最开始挂载时被创建。当容器停止时,卷仍然存在。多个容器可以通过read-write或read-only的方式使用同一个卷。

只有在显式删除时,卷才会被删除。如果将一个空卷挂载到容器中一个存有文件或目录的目录中,这些文件或目录会被拷贝到空卷中;如果将一个非空卷挂载到容器中一个存有文件或目录的目录中,这些文件或目录会被隐藏。

使用

创建:docker volume create

删除某个卷:docker volume rm 卷名

删除所有未使用的卷:docker volume prune

列出所有卷:docker volume ls

查看某个卷的信息:docker volume inspect 卷名

挂载到容器:-v或--volume。如果是Docker17.06或更高:推荐使用--mount。(同 bind mount)

挂载类型:key为type,value为bind、volume或tmpfs

挂载源:key为source或src,对于命名卷,value为卷名,对于匿名卷,则忽略

容器中的挂载点:key为destination、dst或target,value为容器中的路径

读写类型:value为readonly,没有key

volume-opt选项,可以出现多次。比如volume-driver=local,volume-opt=type=nfs,…

第一个域:对于命名卷,为卷名;匿名卷,则忽略,此时会创建匿名卷

第二个域:容器中的挂载点

第三个域:可选参数,由','隔开,如ro

-v或—volume:由3个域组成,’:’分隔

—mount:由多个’,’隔开的键值对

=组成:

当使用docker service create 启动Docker服务时,只支持--mount,不支持-v和--volume。并且每个服务容器使用它们各自的本地卷,因此如果使用本地(local)卷驱动,容器无法通过卷共享数据,但是一些卷驱动支持共享存储。Docker for AWS和Doocker for Azure都使用Cloundstor plugin支持持久存储

场景

多个运行容器间共享数据

当Docker主机不确保具有给定的目录或文件时。卷可以将容器运行时与Docker主机的配置解耦合

备份、恢复、或将数据从一个Docker主机迁移到另一个Docker主机时

bind mount

主机中的文件或目录通过全路径被引用。在使用绑定挂载时,这些目录或文件不一定要已经存在。

如果使用这种方式将一个目录挂载到容器中一个存有文件或目录的目录中,这些文件或目录会被隐藏;如果主机中的文件或目录不存在,当使用--mount挂载时,Docker会报错,当使用-v或--volume时,会在主机上创建目录

使用

挂载到容器:-v或—volume。如果是Docker17.06或更高:推荐使用—mount。(同 volumes)

-v或--volume:由3个域组成,':'分隔

第一个域:对于命名卷,为卷名;匿名卷,则忽略,此时会创建匿名卷

第二个域:容器中的挂载点

第三个域:可选参数,由','隔开,如ro

--mount:由多个','隔开的键值对=组成:

挂载类型:key为type,value为bind、volume或tmpfs

挂载源:key为source或src,value为主机中文件或目录的路径

容器中的挂载点:key为destination、dst或target,value为容器中的路径

读写类型:value为readonly,没有key

bind-propagation选项:key为bind-propagation,value为rprivate、private、rshared、shared、rslave或slave

一致性选项:value为consistent、delegated、cached。这个选项仅仅适用于Docker for Mac

--mount不支持z和Z(这个不同于-v和—volume)

场景

大体上来说,只要可能,最好使用volumes

主机与容器共享配置文件(Docker默认情况下通过这种方式为容器提供DNS解析,通过将/etc/resolv.conf挂载到容器中)

共享源代码或build artifacts(比如将Maven的target/目录挂载到容器中,每次在Docker主机中build Maven工程时,容器能够访问到那些rebuilt artifacts)

当 docker主机中的文件或目录结构和容器需要的一致时

bind propagation

对于bind mount和volumes,默认都是rprivate。只有在使用bind mount时可配置,且必须在linux下。bind propagation是个超前主题,对于大多数用户来说,并不需要配置

对于一个挂载点/mnt,假设它同时也被挂载到/tmp。bind propagation控制 whether a mount on /tmp/a would also be available on /mnt/a

在设置bind propagation之前,主机文件系统需要支持bind propagation

下面的例子将主机中的target/挂载到容器中2次:

docker run -d

-it

--name devtest

--mount type=bind,source="$(pwd)"/target,target=/app

--mount type=bind,source="$(pwd)"/target,target=/app2,readonly,bind-propagation=rslave

nginx:latest

此时如果创建/app/foo/,/app2/foo也会存在

selinux label

你能添加z或Z选项来修改挂载到容器中的主机文件或目录的selinux label:

z选项指明bind mount的内容在多个容器间是共享的

Z选项指明bind mount的内容是私有不共享的

要特别小心的使用这两个选项。”Bind-mounting a system directory such as /home or /usr with the Z option renders your host machine inoperable and you may need to relabel the host machine files by hand”

tmpfs mount

只在linux中支持

相对于volumes和bind mount,tmpfs mount是临时的,只在主机内存中持久化。当容器停止,tmpfs mount会被移除。对于临时存放敏感文件很有用

不同于volumes和bind mount,多个容器无法共享tmpfs mount

使用

挂载到容器:—tmpfs。如果是Docker17.06或更高:推荐使用—mount

挂载类型:key为type,value为bind、volume或tmpfs

容器中的挂载点:key为destination、dst或target,value为容器中的路径

tmpfs-size和tmpfs-mode选项

—tmpfs:直接指定容器中的挂载点。不允许指定任何配置选项

—mount:由多个’,’隔开的键值对

=组成:

场景

最好的使用场景是你既不想将数据存于主机,又不想存于容器中时。这可以是出于安全的考虑,或当应用需要写大量非持久性的状态数据时为了保护容器的性能

volume drivers

机器间共享数据

当构建错误容忍应用时,可能需要配置同一个服务的多个副本来访问相同的文件:

有多种方法来实现这个目的:

为应用添加逻辑,将文件存储到一个云对象存储系统(如Amazon S3)中

使用一个支持将文件写入外部存储系统(如NFS或Amazon S3)的driver来创建卷

volume drivers可以将底层存储系统从应用逻辑中抽象出来。比如,如果你的服务使用一个具有NFS driver的卷,你能更新你的服务使用不同的driver,作为在云中存储数据的示例,而不更改应用程序逻辑

使用

在使用docker volume create或驱动容器创建匿名卷时,可以指定一个volume drivers。下面的例子使用vieux/sshfs作为volume drivers

假设有2个节点,第一个节点是Docker主机,它能SSH到第二个节点

1、在Docker主机中,安装vieux/sshfs插件

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

2、使用卷驱动创建卷

1)创建命名卷

docker volume create --driver vieux/sshfs

-o sshcmd=test@node2:/home/test

-o password=testpassword

sshvolume

2)启动容器时使用卷驱动创建匿名卷

docker run -d

--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

3、备份、恢复、迁移数据卷

1)备份一个容器

docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

启动一个新容器,挂载dbstore容器中的卷

挂载一个本地主机目录到容器/backup

使用tar将dbdata卷中的数据打包成backup.tar

2)用备份恢复容器

使用刚刚创建的备份来恢复容器:

docker run -v /dbdata --name dbstore2 ubuntu /bin/bash

然后,在新创建的容器的卷中使用tar解包备份的数据:

docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata &

索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

linux中数据库的4种状态,数据库的数据持久有几种方案_数据库_数据管理_数据结构_课课家...相关推荐

  1. Linux命令备忘录: jobs 显示Linux中的任务列表及任务状态命令

    Linux jobs命令用法详解:显示Linux中的任务列表及任务状态命令 jobs命令用于显示Linux中的任务列表及任务状态,包括后台运行的任务.该命令可以显示任务号及其对应的进程号.其中,任务号 ...

  2. hibernate中对象的3种状态----瞬时态、持久态、脱管态

    转载: http://www.blogjava.net/amigoxie/archive/2007/02/11/99342.html Hibernate的对象有3种状态,分别为:瞬时态(Transie ...

  3. 在Linux中查找用户帐户信息和登录详细信息的11种方法

    本文将介绍 11 种在 Linux 系统查找用户相关信息的有用方法.这里,我们会讲解在系统中获取一个用户账户详细信息.展示登录详细信息以及用户行为数据的命令. 如果你想要在 Linux 中添加用户,可 ...

  4. linux 中 ACPI 电源管理 G 状态、S 状态、D 状态、C 状态、P 状态

    ACPI 高级电源管理 ACPI 中定义了 G.D.S.C.P 这 5 个大的电力状态. G 状态 Global system state G 状态表示的是用户看到的整个系统的电力状态. G0 运行模 ...

  5. linux中pl怎么使用教程,在Zynq-7000上编程PL的3种方法

    在Zynq-7000上编程PL大致有3种方法: 1. 用FSBL,将bitstream集成到boot.bin中 2. 用U-BOOT命令 3. 在Linux下用xdevcfg驱动. 步骤: 1. 去掉 ...

  6. Linux中vim编辑文件显示行号(临时和永久两种方式)

    一.前言   在Linux中经常使用vim编辑器去修改文件,默认是不显示行号的,那如何显示呢?有临时和永久两种方式.     本文由 @大白有点菜 原创,请勿盗用,转载请说明出处!如果觉得文章还不错, ...

  7. Hibernate对象的三种状态(瞬时态,持久态,游离态)

    1.  瞬时状态 (瞬态) 当我们通过Java的新的关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:  客户客户=新客户("zx",27,图片); 这时客户对象就 ...

  8. Hibername三种状态(瞬时态 持久态 游离态)

    Hibernate 三种状态,tansient瞬时态.persistent持久态.detached游离态 Hibernate三种状态之一:临时状态 (Transient): 用new创建的对象,它没有 ...

  9. 线程池的五种状态及创建线程池的几种方式

    上篇<Java线程的6种状态详解及创建线程的4种方式> 前言:我们都知道,线程是稀有资源,系统频繁创建会很大程度上影响服务器的使用效率,如果不加以限制,很容易就会把服务器资源耗尽.所以,我 ...

最新文章

  1. Uber无人车收购MightyAI:掘金尚未暴富,卖水先获财务自由
  2. mysql 结构优化建议_MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)...
  3. 让NVIDIA Jetson AGX Xavier火力全开的秘密
  4. javascript中this
  5. GARFIELD@12-20-2004
  6. vc6.0 matlab混合编程,matlab2010 + vc6.0混合编程实例(调用dll)
  7. vue jsx 使用 自定义组件
  8. MySQL--pymysql模块
  9. (转)EXCEL2007存储格式xlsx
  10. 用GitHub Copilot 生成的项目中,40%会引入漏洞
  11. auxiliary variable(辅助变量)的引入
  12. R语言绘制流程图(二)
  13. SQL索引及表的页的逻辑顺序与物理顺序
  14. dataturks解析
  15. 基于yolov5的目标检测和单目测距
  16. html pdf支持css%写法吗,flying-saucer-pdf终于完美解决了(中文问题,换行问题,分页,页眉页脚,水印),html+css控制pdf样式...
  17. python寻峰算法_python/scipy的寻峰算法
  18. 逆向破解思路和获取app的代码,脱壳操作(三)
  19. 将mp4文件转换为flv
  20. 以太坊合并60天,算通过大考验了吗?何时迈入星辰大海?

热门文章

  1. 2021年茶艺师(中级)考试题及茶艺师(中级)考试资料
  2. 简单通俗易懂 汽车入门知识图解大集合
  3. gnuplot画图技巧总结
  4. switch default多次触发
  5. 查看新增串口、USB设备
  6. android aar 自动引入依赖
  7. 国际知名财务和ERP软件系统
  8. android开发艺术探索3:IPC--AIDL(跨进程)的使用
  9. manjaro pacman,yaourt命令
  10. スーパーフィルター プライバシーポリシー