当前位置: 首页 > news >正文

docker存储

docker分层结构

如图所示,容器是由最上面可读可写的容器层,以及若干个只读镜像层组成,创建容器时,容器中的 数据都来自镜像层。这样的分层机构最大的特点是写时复制:

1、容器中新生成的数据会直接存放在容器层,也可以称之为可写层。

2、修改容器中现有的数据会先从镜像层将数据复制到容器层,修改后的数据就会直接保存在容器层,而镜像层数据不会有任何变化。

3、如果多个镜像层中有相同的命名文件,在容器层只会看到最上面镜像层的内容。

联合挂载技术 

Docke镜像采用这种分层构建设计,能使镜像结构和容器的创建,共享和分发变得非常高效,每个镜 像层可以称之为layer,这些layer被存放在了/var/lib/docker/volume//目录下,这里 的storage-driver可以有很多种,比如AUFS、OverlayFS、VFS、Brtfs等。可以通过docker info命令查 看存储驱动,通常Ubuntu类的系统默认采用的是AUFS,Centos7.1+系列采用的是OverlayFS。

OverlayFS是一种堆叠文件系统,它依赖并建立在其它的文件系统之上(例如ext4fs和xfs等等),并 不直接参与磁盘空间结构的划分,仅仅将原来底层文件系统中不同的目录进行合并,然后向用户呈现,这 也就是联合挂载技术,如图所示。 而Linux内核为Docker提供的OverlayFS驱动有两种:overlay和 overlay2。而overlay2是相对于overlay的一种改进,在inode利用率方面比overlay更有效。但是overlay 有环境需求:Docker版本17.06.02+,宿主机文件系统需要是ext4或xfs格式。

data volume 

默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着,当该容器不再存在时,数 据将不会持久保存,并且如果另一个进程需要它,则可能很难从容器中取出数据。为了能够保存持久化数 据,Docker提出了volume的概念。

为了能够保存持久化数据,Docker提出了volume的概念。简单来说,volume就是目录或者文件, 它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于Docker Host文件系统上。 Docker为容器提供了两个选项来将文件存储在主机中,以便即使容器停止后文件也可以持久存储。


Volume类型: – Bind mounts 宿主机——》

容器 – Docker managed volume 容器——》宿主机

 bind mounts

Bind mounts只需要在创建容器时,使用-v参数指明Docker host目录或文件和容器目录或文件映射的对应关系, 将本地的数据映射到容器内,可以使用多个-v映射多个目录或文件,还需要注意的是目录只能映射目录,文件只能映射 文件,不然会报错。实例如下:
 

1、在Docker host中创建目录,与容器的/usr/share/nginx/html目录做映射,在容器中/usr/share/nginx/html 目录已经存在,如果不存在,会自动创建路径,映射时会隐藏容器中原本的数据,取而代之的是Docker host上的 /html目录中的数据。

[root@docker ~]# mkdir /html
[root@docker ~]# vim /html/index.html
welcome to huayuedu!!!
[root@docker ~]# docker run --name cynginx -itd -p 80:80 -v /html:/usr/share/nginx/html nginx:latest
cc0c8d7ac53af8b29f32aae76b767e51e6c3358ed2b491bd1ef4e0b96e77f3e5
[root@docker ~]# curl http://127.0.0.1
welcome to huayuedu!!

bind mount 

2、当Docker host上的数据发生了变化,容器中的数据也会随着发生变化,示例如下

[root@docker ~]# echo hello huayu > /html/index.html
[root@docker ~]# curl http://127.0.0.1
hello huay

3、就算是把容器删除,也不会影响到Docker host上的数据,示例如下。

[root@docker ~]# docker stop cynginx
cynginx
[root@docker ~]# docker rm cynginx
cynginx
[root@docker ~]# cat /html/index.html
hello huay

bind mount 

4、此外,Bind mounts还可以指定数据的读写权限,默认权限是可读可写,示例如下,在映射volume时,指定 容器中的文件权限只读,那么在容器内该文件只能被读取,无法修改,这样也提高了容器的安全性

[root@docker ~]# docker run --name cynginx1 -itd -p 80:80 -v
/html/index.html:/usr/share/nginx/html/
index.html:ro nginx:latest
[root@docker ~]# curl http://127.0.0.1
hello huayu
[root@docker ~]# docker exec -it cynginx1 /bin/bash
root@0555f35f03e8:/# echo huayu123 > /usr/share/nginx/html/index.html
bash: /usr/share/nginx/html/index.html: Read-only file system

通过上面的示例,我们已经理解了Bind mounts的使用,但是它也有自身的不足之处,使用时需要指定Docker host上的文件或目录为源数据,这样就限制了容器的可移植性。例如,当需要把容器移动到其他的Docker host上的时 候,如果对方Docker host上没有源数据库,或者路径不相同,操作会失败

docker managed volum

 第二种volume类型是由Docker管理的volume,与Bind mounts相比,Docker管理的volume在使用时不需要指 定Docker host路径,Docker管理的volume具有以下几个优点:

1、与Bind mounts相比,Docker管理的volume更易于备份或迁移。

2、用户可以使用Docker CLI命令或Docker API管理volume。

3、volume在Linux和Windows容器上均可工作。

4、可以在多个容器之间更安全地共享volume,提供volume加密功能。

6、可以通过容器预先填充新volume的内容。

实例如下:
1、通过-v告诉Docker需要一个volume,并将其mount到/usr/share/nginx/html目录,那么Docker会在 /var/lib/docker/volumes/目录下创建volume。

[root@docker ~]# docker run --name cynginx2 -itd -p 80:80 -v /usr/share/nginx/html/ nginx
22c875d19f3f12c8528e8f5316395305c04b3f127cdb5d877e57c055d1933fa7

2、使用docker inspect查看容器的mounts部分,可以看到docker host上的 /var/lib/docker/volumes/6adbe6c8051f58c1d5cc2e8a12faaf1e6aa60b1075433b33a410a5d55cd8e69c/_data目录已经挂在到容器中 /usr/share/nginx/html目录下,但是查看Docker host的volume中内容,内容是容器中的数据。也就是说使用Docker管理的volume,在做映射时,会把容 器中的数据映射到Docker host

[root@docker ~]# docker inspect cynginx2
"Mounts": [
{ "Type": "volume", "Name": "6adbe6c8051f58c1d5cc2e8a12faaf1e6aa60b1075433b33a410a5d55cd8e69c", "Source": "/var/lib/docker/volumes/6adbe6c8051f58c1d5cc2e8a12faaf1e6aa60b1075433b33a410a5d55cd8e69c/_data", "Destination": "/usr/share/nginx/html",
...... [root@docker ~]#ls /var/lib/docker/volumes/6adbe6c8051f58c1d5cc2e8a12faaf1e6aa60b1075433b33a4
10a5d55cd8e69c/_data
50x.html index.html

3、我们修改volume中的数据,再访问,发现volume中修改的数据会同步到容器中的。

[root@docker ~]# echo huayu1234 >
/var/lib/docker/volumes/6adbe6c8051f58c1d5cc2e8a12faaf1e6aa6
0b1075433b33a410a5d55cd8e69c/_data/index.html
[root@docker ~]# curl http://127.0.0.1
huayu1234

4、我们还可以是使用docker volume命令查看docker管理的有哪些volume,并且还可以创建volume,示例如 下,创建一个volume,名为cyhuayu。在创建新的容器时,可以直接指定使用该volume。

[root@docker ~]# docker volume ls
DRIVER VOLUME NAME
local 6adbe6c8051f58c1d5cc2e8a12faaf1e6aa60b1075433b33a410a5d55cd8e69c
[root@docker ~]# docker volume create cyhuayu
cyhuayu
[root@docker ~]# docker volume ls
DRIVER VOLUME NAME
local 6adbe6c8051f58c1d5cc2e8a12faaf1e6aa60b1075433b33a410a5d55cd8e69c
local cyhuayu
[root@docker ~]# docker run --name cynginx3 -itd -p 81:80 -v cyhuayu:/usr/share/nginx/html/
nginx:latest
072c6758e9a815f2421861a54bfc8168eaf286df66f1d3187bc3c4141880e52f

 两种volume不同点

在使用docker volume命令创建volume时,volume默认都是存在在本地的,实际上本地的volume 就是一个目录。除此之外Docker还支持在外部存储系统上创建volume,比如:NFS、Ceph等。

目前我们已经学习了Docker的两种volume的理论和基本操作,它们两者之间的相同点都是使用 Docker host文件系统中的某个路径。不同点如下表所示:

容器之间数据共享

 实现容器间数据共享的方法如下:

– 第一种方法是将共享数据放在volume中,然后将其mount到多个容器。

– 第二种方法是使用volume container,volume container是用来为其他容器提供volume的容器。 这样可以提高容器的可移植性。

– 第三种方法是将数据打包到镜像中,然后通过--volumes-from共享

第一种方法 

第一种方法是将共享数据放在volume中,然后将其mount到多个容器。示例如下,创建由三个nginx容器组成的 web集群,使用相同的html文件。在使用-v指定volume时,可以是Docker host的路径或者是Docker创建的volume。

[root@docker ~]# docker run --name apache1 -itd -p 8081:80 -v /html:/usr/share/nginx/html/
nginx:latest
[root@docker ~]# docker run --name apache2 -itd -p 8082:80 -v /html:/usr/share/nginx/html/
nginx:latest
[root@docker ~]# docker run --name apache3 -itd -p 8083:80 -v /html:/usr/share/nginx/html/
nginx:latest
[root@docker ~]# curl http://127.0.0.1:8081
hello huayu
[root@docker ~]# curl http://127.0.0.1:8082
hello huayu
[root@docker ~]# curl http://127.0.0.1:8083
hello huay

第二种方法 

第二种方法是使用volume container,volume container是用来为其他容器提供volume的容器。这样可以提高容 器的可移植性。

创建volume container,容器名为cy_data,使用-v指定了volume,提供html文件。需要注意的是,这里使用的 是docker create创建的容器,也就是说容器只是创建了,并未启动,因为volume container只是提供数据,自身并不 需要运行

[root@docker ~]# docker create --name cy_data -v /html:/usr/share/nginx/html busybox
创建新的nginx容器,使用参数--volumes-from指定使用cy_data容器提供的volume。
[root@docker ~]# docker run --name cynginx1 -itd -p 8081:80 --volumes-from cy_data nginx
[root@docker ~]# docker run --name cynginx2 -itd -p 8082:80 --volumes-from cy_data nginx
[root@docker ~]# docker run --name cynginx3 -itd -p 8083:80 --volumes-from cy_data ngin

通过docker inspect查看容器信息中的Mounts部分,可以看到新创建的nginx容器已经使用了cy_data容器所提供 的volume。经过验证三个nginx容器中的html文件一样。

[root@docker ~]# docker inspect cynginx1
[root@docker ~]# echo welcome to huayuedu > /html/index.html
[root@docker ~]# curl http://127.0.0.1:8081
welcome to huayuedu
[root@docker ~]# curl http://127.0.0.1:8082
welcome to huayuedu
[root@docker ~]# curl http://127.0.0.1:8083
welcome to huayued

与第一种实现数据共享的方法相比,不必再为每个容器指定volemu,所有volume都在volume container 中定义 好了,容器只需与volume container关联,实现了容器与Docker host的解

第三种方法

volume container的数据归根到底还是在Docker host里,对容器的可移植性有一定的限制。这里可以使用data- packed volume container。其原理是将数据打包到镜像中,然后通过--volumes-from共享。

示例如下,使用Dockerfile构建镜像,将Docker host中的数据进行打包。ADD指令是将html目录中的数据添加到 容器目录/usr/share/nginx/html中。VOLUME指令的作用与-v效果相同,用来创建volume,并且会把 /usr/share/nginx /html目录中的数据复制到volume中。

[root@docker ~]# mkdir html/
[root@docker ~]# echo huayu > index.html
[root@docker ~]# vim Dockerfile
FROM busybox:latest
ADD html /usr/share/nginx/html
VOLUME /usr/share/nginx/html
CMD [“/bin/bash”]
[root@docker ~]# docker build -t cy_hy /roo

 使用新构建的镜像创建data-packed volume container,创建新的nginx容器,使用参数--volumes-from 指定使用cy_data123容器提供的volume

[root@docker ~]# docker create --name cy_data123 cy_hy
[root@docker ~]# docker run --name cynginx7 -itd -p 8087:80 --volumes-from cy_data123 nginx
[root@docker ~]# docker inspect cynginx7
[root@docker ~]# curl http://127.0.0.1:8087
huayu

容器能够正确读取volume中的数据。data-packed volume container是自包含的,不依赖Docker host 提供数据,具有很强的移植性,非常适合只使用静态数据的场景,比如应用的配置信息、web server的静态文 件等

总结

1、实现数据共享的方法有:容器指定同一个volume、volume contauner和data-packed volume contauner。

2、volume分为两类:Bind mounts和Docker managed volume。

3、创建容器时,使用-v参数可以实现容器数据持久化存储,volume分为两类:Bind mounts类型是 将volume中的数据复制到容器中,Docker managed volume是将容器中的数据复制到volume中 

相关文章:

docker存储

docker分层结构 如图所示,容器是由最上面可读可写的容器层,以及若干个只读镜像层组成,创建容器时,容器中的 数据都来自镜像层。这样的分层机构最大的特点是写时复制: 1、容器中新生成的数据会直接存放在容器层&#xf…...

Ubuntu20.04.6 环境下docker设置proxy

问题背景: 在进行dokcer pull操作的时候,会失败且出现如下提示Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting h…...

如何给文件夹里面的文件批量添加前缀和编号(利用C#写的小工具)

运行结果 将上面的文件编号效果 下载过后启动这个程序即可(这个程序灵感来源是上次给美术资源分类和编号的时候给我干吐了,所以写了这个工具) 体验链接:laozhupeiqia/批处理 --- laozhupeiqia/批处理 (github.com) 如果对你有帮助…...

使用分布式调度框架时需要考虑的问题——详解

引言 随着企业系统的规模不断扩大,特别是在分布式计算和云计算环境下,如何协调多个节点或服务执行任务成为一个关键问题。分布式调度框架在这种背景下应运而生,它可以调度成千上万的任务,在多个节点上分配、执行和监控任务&#…...

C语言编译四大阶段

目录 一、引言 二、预处理阶段 三、编译阶段 四、汇编阶段 五、链接阶段 六、总结 本文将详细介绍C语言编译的四个阶段,包括预处理、编译、汇编和链接。通过学习这些阶段,读者可以更好地理解C语言程序的编译过程,提高编程效率。 一、引…...

C# 关于“您与该网站的连接不是私密连接...”的问题

目录 问题现象 范例运行环境 WebService 类 类介绍 增加参数 实现 小结 问题现象 最近在访问开发的微信支付功能时遇到了无法访问令牌的错误,这个错误是公司内部应用程序接口返回的访问错误。经过排查是访问 HTTPS 站点遇到的错误,提示证书风险…...

【超详细】基于YOLOv8训练无人机视角Visdrone2019数据集

主要内容如下: 1、Visdrone2019数据集介绍 2、下载、制作YOLO格式训练集 3、模型训练及预测 4、Onnxruntime推理 运行环境:Python3.8(要求>3.8),torch1.12.0cu113(要求>1.8)&#xff0c…...

VUE项目在Linux子系统部署

1、导读 环境:Windows 11、python 3.12.3、Django 4.2.11、 APScheduler 3.10.4 vue 背景:换系统需要重新安装,避免后期忘记,此处记录一下啊 事件:20240922 说明:使用node启动,非nginx&…...

开源 | 如何在产品上扩展大储存?合宙LuatOS外挂SPI Flash库轻松搞定

我们都知道芯片的储存都是寸土寸金的,当你的产品需要存储照片、音频、文档等资源的时候,有没有眉头一紧?内部不够只能外扩,但是外扩要编写各种驱动,还有Flash替换,这都要消耗头发啊! 但&#x…...

20 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示,设置电流阈值为80,电流小阈值为50,电压阈值为60,温度阈值…...

spring自定义属性编辑器

文章目录 spring自定义属性编辑器步骤 spring自定义属性编辑器 属性编辑器是用来解析bean的配置文件中的属性标签的,spring的BeanWrapperImpl默认会注册CustomCollectionEditor(集合)、CustomMapEditor(Map)、CurrencyEditor(货币)、ByteArrayPropertyEditor等&…...

在VMware16中安装Windows 10:完整教程

在VMware中安装Windows 10:完整教程 1.安装环境准备2.创建虚拟机 1.安装环境准备 1.虚拟机: VMware-workstation-full-16.2.2-19200509 2.系统镜像:win10 2.创建虚拟机 1.自定义 2.下一步 3.稍后安装系统 3.默认下一步 4.虚拟机取名和选择存放路径(按需更改…...

MATLAB系列09:图形句柄

MATLAB系列09:图形句柄 9. 图形句柄9.1 MATLAB图形系统9.2 对象句柄9.3 对象属性的检测和更改9.3.1 在创建对象时改变对象的属性9.3.2 对象创建后改变对象的属性 9.4 用 set 函数列出可能属性值9.5 自定义数据9.6 对象查找9.7 用鼠标选择对象9.8 位置和单位9.8.1 图…...

把设计模式用起来!(4) 用不好模式?之原理不明

(清华大学出版社 《把设计模式用起来》书稿试读) 上一篇:把设计模式用起来!(3)用不好模式?之时机不对 为什么用不好设计模式?——原理不明 难搞的顾客:“抹这种霜&#…...

安卓13去掉下拉菜单的Dump SysUI 堆的选项 android13删除Dump SysUI 堆

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析3.1 位置13.2 位置24.代码修改5.编译6.彩蛋1.前言 客户需要去掉下拉菜单里面的Dump SysUI 堆图标,不让使用这个功能。 2.问题分析 android的下拉菜单在systemui里面,这里我们只需要定位到对应的添加代…...

vue3常用的组件间通信

一 props props 可以实现父子组件通信&#xff0c;props数据是只读。 1. 基本用法 在父组件中&#xff0c;你可以这样传递 props&#xff1a; <template><ChildComponent message"Hello, Vue 3!" /> </template><script setup> import C…...

Windows 查找特定进程的ID并杀死

"*分析用户信息.py*" 换为自己的文件名 Get-WmiObject Win32_Process | Where-Object { $_.CommandLine -like "*分析用户信息.py*" } 查找后 内容如下 __GENUS : 2 __CLASS : Win32_Process __SUPERCLASS …...

Snapchat API 访问:Objective-C 实现示例

Snapchat 是一个流行的社交媒体平台&#xff0c;它允许用户发送和接收短暂存在的图片和视频。对于开发者来说&#xff0c;访问 Snapchat API 可以为应用程序添加独特的社交功能。本文将介绍如何在 Objective-C 中实现对 Snapchat API 的访问&#xff0c;并提供一个详细的代码示…...

ps证件照蓝底换白底

ps证件照蓝底换白底 1、打开 Photoshop&#xff0c;导入需要处理的照片。 2、左侧工具栏中选择“魔棒工具”&#xff0c;点击证件照的背景区域进行选择。 3、使用快捷键 Shift F5 或者从顶部菜单选择“编辑” -> “填充”&#xff0c;在弹出的对话框中选择“填充内容”中…...

阿里云kafka消息写入topic失败

1. 问题现象描述 20240918,14:22&#xff0c;测试反馈说kafka有问题&#xff0c;生产者写入消息的时候报错&#xff0c;并发了一张日志截图&#xff0c;主要报错如下&#xff1a; to topic xxxx: org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for x…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...

使用 uv 工具快速部署并管理 vLLM 推理环境

uv&#xff1a;现代 Python 项目管理的高效助手 uv&#xff1a;Rust 驱动的 Python 包管理新时代 在部署大语言模型&#xff08;LLM&#xff09;推理服务时&#xff0c;vLLM 是一个备受关注的方案&#xff0c;具备高吞吐、低延迟和对 OpenAI API 的良好兼容性。为了提高部署效…...

机器学习复习3--模型评估

误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异称为&#xff1a;误差&#xff08;error&#xff09;。 误差定义&#xff1a; ①在训练集上的误差称为训练误差&#xff08;training error&#xff09;或经验误差&#xff08;empirical error&#x…...