docker 存储管理

news2024/9/29 11:38:39

文章目录

  • docker 存储管理
    • 容器存储方案
      • docker 容器存储解决方案
    • docker 存储驱动
      • 基本概述
      • 存储驱动的选择原则
      • 主流的 docker 存储驱动
      • docker 版本支持的存储驱动
    • overlay2 存储驱动
      • OverlayFS
      • overlay2 存储驱动要求
      • 配置 docker 使用 overlay2 驱动
    • overlay2 存储驱动的工作机制
      • OverlayFS 的镜像分层与共享
      • overlay2 存储驱动的镜像层实现
      • 存储驱动实现的磁盘上的容器层
      • overlay2存储驱动的读写机制
    • docker 存储挂载
      • 卷与存储驱动
      • 挂载类型
      • docker 卷的使用
      • docker 绑定挂载的使用
      • docker tmpfs挂载
      • docker 卷容器
      • 容器的数据共享

docker 存储管理

容器存储方案

docker 容器存储解决方案

存储驱动

由存储驱动实现的联合文件系统

外部挂载卷

以外部挂载卷为代表的持久化存储

docker 存储驱动

docker 镜像和容器的分层结构,就是由 docker 存储驱动来实现的

基本概述

存储驱动控制镜像和容器在 docker 主机上的存储和管理方式

联合文件系统

Union file systems (UnionFS),为Linux、FreeBSD、NetBSD 操作系统设计的,将其他文件系统合并到一个联合挂载点的文件系统,是 docker 重要的底层技术之一,可以通过创建层进行操作,轻巧和快速。

联合文件系统的多种变体

  • AUFS
  • Over;ayFS
  • Btrfs
  • BFS
  • DeviceMapper等

存储驱动

  • aufs
  • overlay
  • overlay2
  • devicemapper
  • btrfs
  • zfs
  • vfs等

联合文件系统实际是由存储驱动来实现的----》

存储驱动的选择原则

  • 生产环境使用具有最佳整体性能和稳定性的存储驱动
  • 内核支持多个存储驱动,存储驱动选择顺序在 docker 的源代码中定义
  • 优先使用 linux 发行版默认的存储驱动,docker 在安装的时候会根据当前系统的配置选择默认的存储驱动,默认驱动有好的稳定性,已经在发行版上经过了严格的测试
  • 个别存储驱动要求使用特定格式的底层文件系统
  • 选择存储驱动要取决于工作负载的特征和所需的稳定性级别

主流的 docker 存储驱动

存储驱动类型说明
overlay2当前主流Linux发行版的首选存储驱动,不需要额外配置(ubuntu14.04不支持)
aufsdocker 18.06以前版本,aufs首选,只支持 ubuntu和debian,需要安装额外的包
devicemapper以前centos和红帽推荐的存储驱动,现在不是了,性能有点问题
btrfs、zfs依赖底层文件系统的正确配置,需要更多投入的维护和设置
vfs用于测试,适合那些没有“写时拷贝”的文件系统,不过性能差,不推荐生产环境

docker 版本支持的存储驱动

  • 基本建议的存储驱动都是 overlay2

底层文件系统

backing filesystem,就是/var/lib/docker (默认)所在的文件系统

存储驱动支持的底层文件系统
overlay2、overlayfstype=1的xfs和ext4
aufsxfs ext4
devicemapperdirect-lvm
btrfsbtrfs
zfszfs
vfs任何文件系统

检查当前存储驱动

docker info | grep "Storage Driver"

在这里插入图片描述

overlay2 存储驱动

OverlayFS

  • 类似于 AUFS 的现代联合文件系统
  • 比 AUFS 速度更快,实现更简单
  • Linux3.18版本开始,OverlayFS 进入 Linux 内核主线,内核模块中的名称从 overlayfs 变成了 overlay
  • docker 提供的存储驱动版本:最初的 overlay 和更高效稳定的 overlay2
  • OverlayFS 是 Linux 内核提供的联合文件系统,overlay 和 overlay2 是 docker 用来实现 OverlayFS 的存储驱动
  • overlay2 存储驱动在索引节点优化上更加高效,但是需要Linux内核4.0以上的版本(centos7.9内核好像是3.10吧??)

overlay2 存储驱动要求

存储驱动要求说明
Docker ERE 17.06 +
4.0或更高版本内核
RHEL或Centos 可使用3.10.0-514+
底层文件系统要求:ext4、xfs(仅限于启用d_type)

OverlayFS 文件系统通过 d_type 特性来确保文件的操作被正确处理,如果不支持 d_type的 overlay 或者 overlay2 存储驱动下使用 docker,docker 在操作文件上可能遇到一些错误

如何确定底层文件系统是否开启 d_type

在这里插入图片描述

在这里插入图片描述

配置 docker 使用 overlay2 驱动

  • 大多数默认就是
  • 显示的配置存储驱动方法:
{
  "registry-mirrors": ["https://xpd691zc.mirror.aliyuncs.com"],
  "insecure-registries":["https://192.168.1.236"],
  "storage-driver": "overlay2"
}

对于centos7系列

  1. centos7 初始安装的内核时 3.x,官方基于该内核构建了 overlay 存储驱动,但是不能直接加载,到centos7.4版本才解决
  2. centos7.4上安装的docker可以直接支持 overlay2存储驱动
  3. centos7.4版本安装创建xfs文件系统的时候,默认没有启 d_type 支持的,需要额外注意

overlay2 存储驱动的工作机制

OverlayFS 的镜像分层与共享

  • 不同层次的目录,对外统一呈现单个目录,2个目录被称为层,统一呈现的单个目录的联合进程被成为联合挂载(Union Mount)
  • OverlayFS 将底层目录称之为【lowerdir】,高层目录称之为【upperdir】,对外暴露统一视图的目录称为【merged】

在这里插入图片描述

  • 镜像层与容器层有相似的文件时,容器层文件就会掩盖镜像层中相同的文件,然后合并显示

overlay与overlay2

  1. 最初的 overlay 仅仅适用2层模型工作,意味着多层镜像无法以多个 OverlayFS,当时的解决方法是采用硬链接的方案,比较废索引节点 node
  2. 两者存储驱动本质的区别在于镜像层之间共享数据的方法不同,overlay2 存储驱动通过每层的 lower 文件,而 overlay 存储驱动使用硬链接

overlay2 存储驱动的镜像层实现

多层镜像的分析

在这里插入图片描述

nginx镜像分层分析
在这里插入图片描述

最底层:3b93be9587d6276dc81265c5ab420878d27bddfb6343ea69656e5ad52ff14bfc
第一层:505637fc69befa54d1c0975e2cb99fb646ae1b04ccc6bdfe310b7576a2cceb6a
第二层:30ace3d17c2e4bd68261dc1fd3315f9278deef220a85f928435aaa9ce6ebc41c
第三层:27fda6ae190defa0beb127b7d8b29022dfc700ba2be1c0f9b196ff3fada49728
最顶层:62961b9285913b2fd2551c369f3401e1288b137037bc549ba15c3894135ee170

存储驱动实现的磁盘上的容器层

镜像层

在这里插入图片描述

容器层

docker run -it nginx /bin/bash

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

overlay2存储驱动的读写机制

读取文件

场景:

  1. 文件不存在于容器层,从镜像层读取,性能开销很小
  2. 文件存在于容器层,不在镜像层,直接从容器层读取
  3. 同时存在容器层和镜像层,读取镜像层中的文件版本,容器层中的文件将掩盖镜像中同名的文件

修改文件或目录

  1. 首次写入文件:容器层不存在,存储驱动执行一次【copy-on-write】将文件从镜像层(lowerdir)复制到容器层(upperdir),然后容器将更改部分写入容器中的该文件的一个新复制,这是一个文件级别的操作,即使这个文件非常大,但是只需要修改一个小部分,也是要复制整个文件,对容器的写入性能会带来影响,上述操作只在首次发生,后续的这个文件写操作只会针对已经复制到容器中的文件进行复制操作

删除文件和目录

  1. 容器中删除一个文件,会在容器层创建一个白化(whiteout)文件,在联合文件系统中,白化文件是指某一类占位符形态的特殊文件,可以删除属于自己的某些系统文件副本,但是无法删除镜像层的文件,因为镜像层是只读的,白化文件可以阻止容器读取到它。
  2. 容器中删除一个目录,和上述类似,会在容器层创建一个不透明(opaque)目录,能够有效阻止容器访问它

重命名目录

  1. 只有源和目的路径都位于顶层才能对目录进行重命名,否则返回错误(cross-device link not permitted)

docker 存储挂载

卷与存储驱动

容器层的数据所存在的问题

  • 在容器的生命周期内存在,随着容器的死亡还被删除,不会持久保存
  • 主机其他进程要访问容器中的数据,难度较高
  • 容器的可写层与主机紧密耦合,无法轻松将数据转移到其他地方
  • 写入容器的可写层还需要存储驱动来管理文件系统,性能不如卷

存储卷

  • 又称数据卷
  • 本质就是主机上的文件或者目录,能够直接被挂载到容器的文件系统中
  • 对数据卷的读写操作会绕过存储驱动,以主机的速度运行
  • 任意数量的数据卷都可以装入容器
  • 多个容器可以共享一个或多个卷

挂载类型

不管挂载类型,数据并没有什么不同,这些数据在容器的文件系统中,都会显示目录或文件

  1. 存储在主机文件系统中,默认/var/lib/docker/volumes 目录中,由 docker 管理,非 docker 进程不能修改
  2. 是 dockers 中持久保存容器应用数据的最佳方式
  3. 也支持卷驱动,这些卷驱动可以让用户将数据存储到远程主机或云上

绑定挂载

  1. 存储到主机上的任意位置
  2. 绑定挂载性能较高,依赖于具有特定目录结构的主机文件系统
  3. 绑定挂载也允许访问敏感文件
  4. 适合的场景:主机与容器共享配置文件等

tmpfs

  1. 仅限于运行 Linux 操作系统的 Docker 主机使用,只存储在主机的内存中,不会被写入主机的文件系统中,不能持久化保存容器的数据
  2. 如果容器产生了非持久化状态数据,可以考虑使用这个来挂载

docker 卷的使用

卷的创建

显示创建:docker volume create

卷的优势

  • 更易备份和迁移
  • 可以通过 docker 命令和 API 进行管理
  • 卷在 Linux 容器和 Windows 容器中都可以工作
  • 多个容器之间共享更安全
  • 卷驱动支持远程主机和云端,加密卷内容等,拓展其他功能都可以
  • 新卷的内容可以由容器预填充

使用

–mount:键值对,逗号隔开的用法,比-v的语法更加冗长,顺序不重要,

-v:卷的名称:容器中被挂载的文件或目录的路径(绝对路径):<ro等可选项>

在这里插入图片描述

在这里插入图片描述

如果卷不是空白的呢 ?

在这里插入图片描述

如果卷是空白的呢,上面其实已经看过效果

在这里插入图片描述

删除卷

删除所有:docker volume prune

删除卷:docker volume rm xxxx

在这里插入图片描述

docker 绑定挂载的使用

特性

  • 绑定挂载功能有效
  • 绑定挂载性能高
  • 容器的移植性被限制,更多的需要配置操作
  • 系统安全产生影响

使用

–mount 选项说明
type挂载的类型
src主机上的绝对路径
target容器内的路径
readonly只读
bind-propagation绑定传播
consistency一致性

在这里插入图片描述

在这里插入图片描述

  • 上述操作也可以用于文件挂载
  • 挂载主机上不存在的目录或者文件

在这里插入图片描述

docker tmpfs挂载

tmpfs:临时文件系统,基于内存的文件系统,速度非常快

  • 不会持久化到磁盘
  • 容器的生命周期内存在

特性

  1. 挂载是临时的
  2. 存储在主机内存中,内存不够,就存交换空间中
  3. 容器停止,tmpfs 将被移除
  4. 不能容器共享
  5. 只适合linux平台

这个就不去细看了,等需要用到的场景再学习一下即可

docker 卷容器

Volume Container 数据卷容器,是一种特殊的容器,专门用来将卷提供给其他容器挂载,通过 --volumes-from 选项基于卷容器创建一个新的容器,并挂载君容器提供的卷

通过卷容器实现容器之间的数据共享

  • 容器要共享数据,先创建卷容器,再让其他容器挂载卷容器来共享

使用

在这里插入图片描述

感觉这个用途不大

容器的数据共享

容器与主机共享数据

  1. 绑定挂载和卷都可以
  2. docker cp 可以在容器与主机之间复制数据

容器之间共享数据

  1. 绑定挂载和卷都可以

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

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

相关文章

mybatis-plus常用使用方法

** mybaits-plus常用使用方法 ** 常用三层分别继承方法 1.1mapper层&#xff08;接口定义层&#xff09;可以用BaseMapper<> 例如&#xff1a; 1.2.里面常用的封装方法有 1.3常用方法介绍 【添加数据&#xff1a;&#xff08;增&#xff09;】int insert(T entity);…

Neo4j 国内镜像下载与安装

Neo4j 5.x 简体中文版指南 社区版&#xff1a;https://neo4j.com/download-center/#community 链接地址&#xff08;Linux版&#xff09;&#xff1a;https://neo4j.com/artifact.php?nameneo4j-community-3.5.13-unix.tar.gz 链接地址&#xff08;Windows&#xff09;&#x…

uml时序图刻画多个线程的活动

使用box关键字圈入不同线程内的组件 使用loop关键字客刻画线程的定时活动 示例

新建一个基于标准库的工程(STM32)

目录 1.新建存放工程的文件夹 2.打开KEIL5软件 3.新建一个本次工程的文件夹 4.添加工程的必要文件 4.1打开STM32的启动文件 ​编辑 4.2&#xff1a; 4.3添加内核寄存器文件 ​编辑 5.回到keil5软件&#xff0c;将刚才复制的那些文件添加到工程中 5.1添加一个启动文件&am…

vue3+naiveUI二次封装的v-model cascader联级选择框

组件 v-model 源码 <template><div class"clw-cascader pt-3"><n-cascaderref"cascader":value"value":title"title"filterableclearable:check-strategy"checkStrategy":label-field"labelField"…

在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作

前言&#xff1a;什么是操作筛选器 操作筛选器是 ASP.NET Core Web API 中的一种过滤器&#xff0c;用于在执行控制器操作&#xff08;Action&#xff09;之前或之后执行一些代码&#xff0c;完成特定的功能&#xff0c;比如执行日志记录、身份验证、授权、异常处理等通用的处…

2、鼠标事件、键盘事件、浏览器事件、监听事件、冒泡事件、默认事件、属性操作

一、鼠标事件 1、单击事件&#xff1a;onclick <body><header id"head">我是头部标签</header> </body> <script> var head document.getElementById("head")head.onclick function () {console.log("我是鼠标单击…

Elasticsearch使用经验和云上竞品对比

Elasticsearch使用经验和云上竞品对比 - 知乎 过去三十年&#xff0c;我们从企业应用开始&#xff0c;经历了 PC 互联网、移动互联网的爆发式发展&#xff0c;到如今的产业互联网。在这些不同时代&#xff0c;一直变化的是应用形态&#xff0c;不变的是核心数据的价值。 对于核…

kafka summary

最近整体梳理之前用到的一些东西&#xff0c;回顾Kafka的时候好多东西都忘记了&#xff0c;把一些自己记的比较模糊并且感觉有用的东西整理一遍并且记忆一遍&#xff0c;仅用于记录以备后续回顾 Kafka的哪些场景中使用了零拷贝 生产者发送消息&#xff1a;在 Kafka 生产者发送…

五、Kotlin 函数进阶

1. 高阶函数 1.1 什么是高阶函数 以下 2 点至少满足其一的函数称为高阶函数&#xff1a; 形参列表中包含函数类型的参数 //参数 paramN 可以是&#xff1a;函数引用、函数类型变量、或 Lambda 表达式。 fun funName(param1: Type1, param2: Type2, ... , paramN: (p1: T1, p2…

7.【SpringBoot3】项目部署、属性配置、多环境开发

1. SpringBoot 项目部署 项目完成后&#xff0c;需要部署到服务器上。 SpringBoot 项目需要经过编译打包生成一个 jar 包&#xff08;借助打包插件 spring-boot-maven-plugin&#xff09;&#xff0c;再将该 jar 包发送或拷贝到服务器上&#xff0c;然后就可以通过执行 java …

【AndroidStudio】2022.3Giraffe连接超时,更换下载源,使用本地gradle,版本对应问题

记录了使用AndroidStudio2022.3 Giraffe版本在搭建环境时遇到的问题&#xff0c;包括连接超时&#xff0c;gradle无法读取等。 如果只看如何正确的配置&#xff0c;直接跳转第3节 配置汇总 1 连接超时 项目一开始会自动下载gardle文件来加载项目 1.1 Connect timed out 基…

【NodeJS JS】动态加载字体的各方式及注意事项;

首先加载字体这个需求基本只存在于非系统字体&#xff0c;系统已有字体不需要加载即可直接使用&#xff1b; 方案1&#xff1a;创建 style 标签&#xff0c;写入 font-face{font-family: xxx;src: url(xxx)} 等相关字体样式&#xff1b;将style标签添加到body里&#xff1b;方…

网站将http升级到https大概要多少费用

随着网络安全意识的不断提升&#xff0c;越来越多的网站正从传统的HTTP协议转向更安全的HTTPS协议。这一转变的核心在于部署SSL&#xff08;Secure Sockets Layer&#xff09;或TLS&#xff08;Transport Layer Security&#xff09;证书&#xff0c;以实现数据加密传输&#x…

数据结构(顺序表)

文章目录 一、线性表1、线性表1.1、线性表的定义1.2、线性表的操作 2、顺序表2.1、顺序表的实现--静态分配2.2、顺序表的实现--动态分配2.2、顺序表的特点 3、顺序表的基本操作3.1、插入操作3.2、删除操作3.3、查找操作3.2、按位查找3.2、按值查找 一、线性表 1、线性表 1.1、…

自动驾驶的决策层逻辑

作者 / 阿宝 编辑 / 阿宝 出品 / 阿宝1990 自动驾驶意味着决策责任方的转移 我国2020至2025年将会是向高级自动驾驶跨越的关键5年。自动驾驶等级提高意味着对驾驶员参与度的需求降低&#xff0c;以L3级别为界&#xff0c;低级别自动驾驶环境监测主体和决策责任方仍保留于驾驶…

大数据数据流分析和处理的工具pig,从入门到精通!

介绍&#xff1a;Pig是一种数据流语言和运行环境&#xff0c;用于处理和分析大数据。 Pig由两个主要部分构成&#xff1a; Pig Latin语言&#xff1a;这是一种用于描述数据流的高级语言&#xff0c;它允许用户以较为简洁的方式编写数据处理和转换任务。 Pig执行环境&#xff1a…

JVM工作原理与实战(二十八):内存溢出和内存泄漏

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、内存溢出与内存泄漏 1.内存溢出与内存泄漏介绍 2.内存泄漏的常见场景 3.解决内存溢出的步骤 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字节码&#x…

<蓝桥杯软件赛>零基础备赛20周--第18周--动态规划初步

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

Mediasoup Demo-v3笔记(七)——Mediasoup 下的业务操作

Mediasoup 主业务的创建流程 Mediasoup 权限验证的创建 在实际的代码中&#xff0c;在main.cpp 中调用mediasoup_worker_run函数 在mediasoup_worker_run函数实现中进行了各个模块的初始化 Mediasoup 数据流转 创建连接的过程 数据传输过程 WebRTC大规模部署方案 方案一…