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…

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

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

RPC 服务 与 HTTP 服务的区别

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

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

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

【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;命名空间 作用&#…

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

异方差的检验 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…

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

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服务器…

Nginx的执行阶段详解

在了解nginx的执行阶段前&#xff0c;先看一个例子 对echo不熟悉的&#xff0c;可以先看文章Nginx调试必备了解下echo扩展 回到上面这个例子&#xff0c;在server块中配置这样的location&#xff0c;你觉得输出是什么样子&#xff1f; 按照正常的逻辑&#xff0c;输出应该是32 …

Docker挂了,数据如何找回

docker在实际使用中&#xff0c;让运维人员诟病的&#xff0c;除了安全问题外&#xff0c;大概就是数据的问题了 很多人在初用docker的时候&#xff0c;很多时候都忘记或不知道docker中需要保留的数据需要挂载到宿主机文件夹到容器内部对应目录&#xff08;当然除了挂载宿主机目…

TCP总结

TCP这些东西&#xff0c;基本每个程序猿都或多或少是掌握的了。虽然感觉在实际开发中没有什么用武之处&#xff0c;但&#xff0c;面试他要问啊 而最近大家伙过完年&#xff0c;也都在准备春招&#xff0c;我也一样。阅读了一些okHttp源码之后&#xff0c;又屁颠屁颠地跑回来重…

LDAP组的概念以及命令

Oracle统一目录支持组&#xff0c;组是作为单个对象管理的条目集合。通常&#xff0c;目录管理员配置打印机组、软件应用程序组、员工组等。在为一组用户分配特殊访问权限时&#xff0c;组尤其有用。例如&#xff0c;您可以配置一组访问管理器&#xff0c;并分配权限&#xff0…

oracle中修改process

可以用如下命令查看数据库连接的消耗情况 select b.MACHINE, b.PROGRAM, b.USERNAME, count(*) from v$process a, v$session b where a.ADDR b.PADDR and b.USERNAME is not null group by b.MACHINE, b.PROGRAM, b.USERNAME order by count(*) desc 在 oracle中&…

安装python3.9

GCC版本 这个版本的编译器不适合编译Python3.9&#xff0c;在编译时会产生如下的错误。我们用这个老版本编译器编译一个新的GCC 9.2版。 Could not import runpy module Traceback (most recent call last):File "Python-3.8.1/Lib/runpy.py", line 15, in <mod…

Oracle数据库游标数总结

各用户的打开游标总数 SELECT A.USER_NAME, COUNT(*) FROM V$OPEN_CURSOR A GROUP BY A.USER_NAME; 查找数据库各用户各个终端的缓存游标数 SELECT AA.USERNAME, AA.MACHINE, SUM(AA.VALUE) FROM ( SELECT A.VALUE, S.MACHINE, S.USERNAME FROM V$SESSTAT A, V$STATNAME B, V…

logstash安装

下载最新版logstash https://www.elastic.co/cn/downloads/logstash 解压缩 tar zxvf logstash-7.12.1-linux-x86_64.tar.gz 下载jdk1.8 tar zxvf jdk-8u291-linux-x64.tar.gz 编辑启动文件logstash、logstash.lib.sh、logstash-plugin 在首行添加 export JAVA_C…