Docker 数据持久化的三种方案

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

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

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

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

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

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

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

  3. 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>=<value>组成:

    • 挂载类型: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

你能添加zZ选项来修改挂载到容器中的主机文件或目录的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 && tar xvf /backup/backup.tar --strip 1"

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

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

相关文章

Git 存储原理及相关实现

Git 是目前最流行的版本控制系统&#xff0c;从本地开发到生产部署&#xff0c;我们每天都在使用 Git 进行我们的版本控制&#xff0c;除了日常使用的命令之外&#xff0c;如果想要对 Git 有更深一步的了解&#xff0c;那么研究下 Git 的底层存储原理将会对理解 Git 及其使用非…

Git内部原理

Git有什么特点&#xff1f; fast&#xff0c;scalable&#xff0c;distributed revision control system&#xff08;快速&#xff0c;可扩展的分布式版本控制系统&#xff09; 几乎所有操作都是本地执行 每一个clone都是整个生命周期的完整副本 the stupid content tracker&a…

git存储原理

四种数据类型 实际上Git基于数据类型的不同&#xff0c;把对象分为四种&#xff1a;数据对象、树对象、提交对象、标签对象。Git文件系统的设计思路与linux文件系统相似&#xff0c;即将文件的内容与文件的属性分开存储&#xff0c;文件内容以“装满字节的袋子”存储在文件系统…

详解设计模式:中介者模式

中介者模式&#xff08;Mediator Pattern&#xff09;也被称为调停者模式&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。 中介者模式 是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类&#xff0c;该类通常处理不同类之间的通信&#xff0c;并支…

rebase参数以及注意事项

可以根据需要将pick参数&#xff0c;改变为下面代表不同作用的参数&#xff1b;这样就可以对节点C和D进行不同的操作了。比如&#xff1a; pick&#xff1a;默认参数&#xff0c;表示不对提交节点进行任何操作&#xff0c;直接应用原提交节点。不创建新提交&#xff1b; rewor…

RPC 服务 与 HTTP 服务的区别

1、什么是RPC RPC&#xff08;Remote Procedure Call&#xff09;—远程过程调用&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在&#xff0c;如TCP或UDP&#xff0c;为通信程序之间携带信…

Docker 网络命名空间

Docker 用户可以通过与 CNM 的 Object 以及 API 的交互来管理对应容器的网络&#xff0c;下面是一个典型的容器网络生命周期&#xff1a; 1、Driver要向NetworkController注册。内置的Driver在Libnetwork内注册&#xff0c;远程的Driver则通过Plugin mechanism注册。每一个Driv…

缓存雪崩、击穿、穿透解决方案

用户的数据一般都是存储于数据库&#xff0c;数据库的数据是落在磁盘上的&#xff0c;磁盘的读写速度可以说是计算机里最慢的硬件了。 当用户的请求&#xff0c;都访问数据库的话&#xff0c;请求数量一上来&#xff0c;数据库很容易就奔溃的了&#xff0c;所以为了避免用户直…

Ansible中的playbook详解

首先简单说明一下playbook&#xff0c;playbook是什么呢&#xff1f; 根本上说playbook和shell脚本没有任何的区别&#xff0c;playbook就像shell一样&#xff0c;也是把一堆的命令组合起来&#xff0c;然后加入对应条件判断等等&#xff0c;在shell脚本中是一条一条的命令&am…

【Docker】容器镜像有哪些特性

首先解释一下什么是Docker镜像&#xff1f; Docker镜像它其实是一个模板&#xff0c;拥有这个模板我们才能创建我们的Docker容器&#xff0c;镜像里含有启动 docker 容器所需的文件系统结构及其内容&#xff0c;因此是启动一个 docker 容器的基础。docker 镜像的文件内容以及一…

nginx中的location指令

1、location 介绍 location是Nginx中的块级指令(block directive)&#xff0c;location指令的功能是用来匹配不同的url请求&#xff0c;进而对请求做不同的处理和响应&#xff0c;这其中较难理解的是多个location的匹配顺序&#xff0c;本文会作为重点来解释和说明。 开始之前…

容器底层实现技术Namespace/Cgroup

Docker容器实现原理 Docker容器在实现上是通过namespace技术来进行进程隔离&#xff0c;通过cgroup技术实现容器进程可用资源的限制&#xff0c;当docker启动一个容器时&#xff0c;实际是创建了多了namespace参数的进程。 Namespace Namespace&#xff1a;命名空间 作用&#…

身体原因 断更一周

由于众所周知的原因&#xff0c;博主最近具有发热、全身乏力、酸痛、干咳等症状&#xff0c;已严重影响日常的工作学习和博客编写&#xff0c;所以断更我将一周&#xff0c;由下周三&#xff08;即2022年12月21日&#xff09;恢复更新 更多往期内容可以参考&#xff1a;全网最…

异方差与多重共线性对回归问题的影响

异方差的检验 1.异方差的画图观察 2.异方差的假设检验&#xff0c;假设检验有两种&#xff0c;一般用怀特检验使用方法在ppt中&#xff0c;课程中也有实验&#xff0c;是一段代码。 异方差的解决办法 多重共线性 多重共线性可能带来的影响&#xff1a; 多重共线性的检验 多重…

如何修改Docker的镜像源

改或新增/etc/docker/daemon.json 文件 vi/etc/docker/daemon.json 添加需要修改的国内镜像源镜像源 { "registry-mirrors":["http://hub-mirror.c.163.com"] } 重启Docker服务 Systemctl restart docker.service 方法二 修改或新增 /etc/sysconfig…

nginx 的 rewrite 模块

ngxhttprewrite_module 模块用来使用正则表达式&#xff08;PCRE&#xff09;改变请求的 URI&#xff0c;返回重定向&#xff0c;并有条件地选择配置。 指令执行顺序 首先顺序执行 server 块中的 rewrite 模块指令&#xff0c;得到 rewrite 后的请求 URI 然后循环执行如下指令…

所有的Python库

库名称简介 Chardet字符编码探测器&#xff0c;可以自动检测文本、网页、xml的编码。 colorama主要用来给文本添加各种颜色&#xff0c;并且非常简单易用。 Prettytable主要用于在终端或浏览器端构建格式化的输出。 difflib&#xff0c;[Python]标准库&#xff0c;计算文本…

Oracle行转列语法总结大全

一、decode语法 SELECT deptno, nvl(SUM(decode(job, MANAGER, sal)), 0) s_MANAGER, nvl(SUM(decode(job, ANALYST, sal)), 0) s_ANALYST, nvl(SUM(decode(job, CLERK, sal)), 0) s_CLERK, nvl(SUM(decode(job, PRESIDENT, sal)), 0) s_PRESIDENT, …

Shell 各种符号 之 含义

#!&#xff1a;符号能够被内核识别成是一个脚本的开始&#xff0c;这一行必须位于脚本的首行 $0&#xff1a;当前脚本的名字 $#&#xff1a;输入<调用>参数(脚本或函数的位置参数) 的个数&#xff0c;如 NumArg$#&#xff1b;echo"\$#: $#;\$NumArg: $NumArg"…

Nginx的11个执行流程

1 Nginx简介 Web服务器市场份额 Nginx [engine x] 最初由 Lgor Sysoev 编写。根据 Netcraft 的数据&#xff0c;到2020年9月&#xff0c;Nginx 服务或代理了25.76&#xff05;站点&#xff0c;市场份额占到了约34.03&#xff05;。 Nginx 被广泛用作&#xff1a; HTTP服务器…