docker 存储管理

文章目录

  • 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. 绑定挂载和卷都可以

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++核心编程:C++ 中的引用 笔记

2.引用 2.1 引用的基本使用 - 作用&#xff1a;给变量起别名 - 语法&#xff1a;数据类型 &别名 原名 #include<iostream> using namespace std; int main() {// 引用基本语法// 数据类型 &别名 原名int a 10;// 创建引用int &ref_a a;cout<<&qu…

搭建Redis集群

一 应用场景 为什么需要redis集群&#xff1f; 当主备复制场景&#xff0c;无法满足主机的单点故障时&#xff0c;需要引入集群配置。 一般数据库要处理的读请求远大于写请求 &#xff0c;针对这种情况&#xff0c;我们优化数据库可以采用读写分离的策略。我们可以部 署一台…

Ubuntu 系统如何修改时间

Ubuntu 系统如何修改时间 简介&#xff1a;在Ubuntu上&#xff0c;你可以使用以下三种方法来修改时间&#xff1a;date命令&#xff0c;timedatectl命令和hw 原文&#xff1a;Ubuntu 系统如何修改时间 (baidu.com)https://cloud.baidu.com/article/393621 三种方法修改Ubunt…

Linux——文本编辑器Vim

Linux中的所有内容以文件形式管理&#xff0c;在命令行下更改文件内容&#xff0c;常常会用到文本编辑器。我们首选的文本编辑器是Vim&#xff0c;它是一个基于文本界面的编辑工具&#xff0c;使用简单且功能强大&#xff0c;更重要的是&#xff0c;Vim是所有Linux发行版本的默…

husky结合commitlint审查commit信息

commintlint是一个npm包用来规范化我们的commit信息&#xff0c;当然这个行为的操作时期是在git的commit-msg生命周期期间&#xff0c;这一点当然是有husky来控制&#xff0c;需要注意的是commit-msg作为一个git生命周期会被git commit和git merge行为唤醒&#xff0c;并且可以…

03-Redis缓存高可用集群

文章目录 1、Redis集群方案比较2、Redis高可用集群搭建redis集群搭建Java操作redis集群 4、Redis集群原理分析槽位定位算法跳转重定位Redis集群节点间的通信机制gossip通信的10000端口网络抖动 Redis集群选举原理分析集群脑裂数据丢失问题集群是否完整才能对外提供服务Redis集群…

第二百八十八回

文章目录 1. 概念介绍2. 使用方法2.1 实现步骤2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取文件类型"相关的内容&#xff0c;本章回中将介绍如何播放视频.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 播放视频是我们常用…

用Visual Studio Code创建JavaScript运行环境【2024版】

用Visual Studio Code创建JavaScript运行环境 JavaScript 的历史 JavaScript 最初被称为 LiveScript&#xff0c;由 Netscape&#xff08;Netscape Communications Corporation&#xff0c;网景通信公司&#xff09;公司的布兰登艾奇&#xff08;Brendan Eich&#xff09;在 …

Java基础—面向对象OOP—17类与对象(创建、构造器、创建对象时简单内存分析)

把握重点&#xff0c;重点已标注&#xff0c;这篇笔记分了4个章节&#xff0c;重点看二、三、四 一、整体思维--重点把握面向对象的本质和特点 1、面向对象编程OOP&#xff1a; Object-Oriented programming 2、面向过程与面向对象 面向过程&#xff1a;线性思维 面向对象…

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现IIC控制OLED屏幕

上一篇&#xff1a;[嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键 [嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集 [嵌入式软件][启蒙篇][仿真平台]STM32F103实现定时器 [嵌入式软件][启蒙篇][仿真平台] STM32F103实现IIC控制OLED屏幕 文章目…

有关链表的题目

目录 1.环形链表的约瑟夫问题 2.链表的中间节点 3.合并两个有序链表 4.反转链表 5.移除链表元素 1.环形链表的约瑟夫问题 环形链表的约瑟夫问题_牛客题霸_牛客网 (nowcoder.com) 思路&#xff1a;题目给出结构是环形链表&#xff0c;且题目已经定义好了环形链表的结构。 1…

MATLAB - 控制小车上的倒立摆

系列文章目录 前言 一、小车 - 摆杆 小车 - 摆杆模型如图 1 所示&#xff0c;使用 Simscape™ Multibody™ 在 Simulink 中建模。 图 1&#xff1a;小车上的倒立摆 图 2&#xff1a;Simscape 多体模型 该系统通过对小车施加可变力 进行控制。控制器需要在将小车移动到新位置或…

145基于matlab的求解悬臂梁前3阶固有频率和振型

基于matlab的求解悬臂梁前3阶固有频率和振型,采用的方法分别是&#xff08;假设模态法&#xff0c;解析法&#xff0c;瑞利里兹法&#xff09;。程序已调通&#xff0c;可直接运行。 145 matlab 悬臂梁 固有频率 振型 (xiaohongshu.com)

正则匹配 | 正则实际应用探索分享

这并不是一篇教正则基础的文章&#xff0c;其正则式不能对您进行使用后的结果负责&#xff0c;请以研究的眼光看待本篇文章。 技术就是懒人为了更好的懒才会想办法搞的东西&#xff0c;我最近因为某些原因需要频繁删除注释 我就想到通过替换的正则功能快速删除文件中的简单注…

微信小程序(十八)组件通信(父传子)

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.组件属性变量的定义 2.组件属性变量的默认状态 3.组件属性变量的传递方法 解释一下为什么是父传子&#xff0c;因为组件是页面的一部分&#xff0c;数据是从页面传递到组件的&#xff0c;所以是父传子&#xf…

DevExpress WinForms导航控件 - 交付更时尚、体验更好的业务应用(二)

DevExpress WinForms的Side Navigation&#xff08;侧边导航&#xff09;和Nav Panel&#xff08;导航面板&#xff09;可以帮助客户交付完全可模仿UI体验的业务解决方案&#xff0c;这些体验在当今流行的应用程序中都可找到。在上文中&#xff08;点击这里回顾>>&#x…

数据结构排序算详解(动态图+代码描述)

目录 1、直接插入排序&#xff08;升序&#xff09; 2、希尔排序&#xff08;升序&#xff09; 3、选择排序&#xff08;升序&#xff09; 方式一&#xff08;一个指针&#xff09; 方式二&#xff08;两个指针&#xff09; 4、堆排序&#xff08;升序&#xff09; 5、冒…

IP报文格式

IP报文格式 报文格式 图1 IP头格式 表1 IP头字段解释 字段长度含义Version4比特 4&#xff1a;表示为IPV4&#xff1b;6&#xff1a;表示为IPV6。IHL4比特首部长度&#xff0c;如果不带Option字段&#xff0c;则为20&#xff0c;最长为60&#xff0c;该值限制了记录路由选项。…

Flink问题解决及性能调优-【Flink根据不同场景状态后端使用调优】

Flink 实时groupby聚合场景操作时&#xff0c;由于使用的是rocksdb状态后端&#xff0c;发现CPU的高负载卡在rocksdb的读写上&#xff0c;导致上游算子背压特别大。通过调优使用hashmap状态后端代替rocksdb状态后端&#xff0c;使吞吐量有了质的飞跃&#xff08;20倍的性能提升…

【Tomcat与网络1】史前时代—没有Spring该如何写Web服务

在前面我们介绍了网络与Java相关的问题&#xff0c; 最近在调研的时候发现这块内容其实非常复杂&#xff0c;设计的内容多而且零碎&#xff0c;想短时间梳理出整个体系是不太可能的&#xff0c;所以我们还是继续看Tomcat的问题&#xff0c;后面有网络的内容继续补充吧。 目录 …