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中 

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

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

相关文章

SAP 生产订单报工自动入库的几种处理方法

SAP 生产订单报工自动入库的几种处理方法 一、自动入库的功能与原理自动入库的核心机制包括:二、配置自动入库1. 控制关键字(Control Key)中的自动入库标志2. 生产订单类型设置三、自动入库的流程四、自动入库的优势五、适用场景六、业务场景七、系统配置点八、前台操作演示…

移动技术开发:登录注册界面

1 实验名称 登录注册界面 2 实验目的 掌握基本布局管理器的使用方法和基本控件的使用方法 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.0" encoding"utf-8"?><LinearLayoutxmlns:android"http://schemas.android.com/apk/…

在Windows 7上安装Redis

1、下载Redis安装包‌&#xff1a; 首先&#xff0c;从Redis的官方网站或可信的第三方资源下载Redis的Windows版本安装包。确保下载与你的Windows 7系统兼容的版本。 2、解压安装包‌&#xff1a; 将下载的Redis安装包解压到你选择的目录&#xff0c;例如F:\Redis\redis-win…

关于文件操作

1. 为什么使⽤⽂件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失 了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久…

栈和队列的算法题目(C语言)

1. 括号匹配问题 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 利用栈后入先出的特性解题 1.判断字符串是否为空 为空返回 2.创建栈&#xff0c;遍历字符串 第一个字符是左括号的情况&#xff1a;入栈->继续遍历下一个字符 第一个字符是右括号的情况&#xf…

高等数学 3.3 泰勒公式

泰勒&#xff08;Taylor&#xff09;中值定理1 如果函数 f ( x ) f(x) f(x) 在 x 0 x_0 x0​ 处具有 n n n 阶导数&#xff0c;那么存在 x 0 x_0 x0​ 的一个邻域&#xff0c;对于该领域内的任一 x x x &#xff0c;有 f ( x ) f ( x 0 ) f ′ ( x 0 ) ( x − x 0 ) f…

CAD图1

文章目录 选择直线工具选择圆形选中圆形 选择直线工具 画一条十字中心线 选择圆形 以十字中心为起点画一个半径为 53 的圆形 选中圆形 选中圆形&#xff0c;捕捉右侧圆形焦点

Android AlertDialog圆角背景不生效的问题

一行解决: window?.setBackgroundDrawableResource(android.R.color.transparent) 原文件: /*** Created by Xinghai.Zhao* 自定义选择弹框*/ SuppressLint("InflateParams", "MissingInflatedId") class CustomDialog(context: Context?) : AlertDia…

【算法专题】穷举vs暴搜vs深搜vs回溯vs剪枝

二叉树剪枝 LCR 047. 二叉树剪枝 - 力扣&#xff08;LeetCode&#xff09; 本题要求我们将全部为0的二叉树去掉&#xff0c;也就是剪枝&#xff0c;当我们举一个具体的例子进行模拟时&#xff0c;会发现&#xff0c;只关注于对其中一个子树的根节点进行剪枝&#xff0c;由于我…

4款AI生成PPT工具推荐,提升工作效率

在如今的工作环境中&#xff0c;PPT制作是许多技术人员不可避免的任务&#xff0c;尤其是在汇报、展示技术方案、以及项目进展时。随着AI技术的快速发展&#xff0c;使用AI生成PPT成为了提高效率的一种新趋势。本文将介绍几款适合程序员、技术人员的AI生成PPT工具&#xff0c;帮…

Agent:原理与快速构建 | 人工智能 | Langchain | Python ——学习笔记

视频链接&#xff1a;https://www.bilibili.com/video/BV1Hz421b7ag/?spm_id_from333.788&vd_source90787f5794c8e73cf358973d1de2e47f # # 将.env的信息放到环境变量 # from dotenv import load_dotenv # load_dotenv() 第一节课程&#xff1a;使用openai调用智谱轻言问…

【Kubernetes】常见面试题汇总(十)

目录 29.简述 Kubernetes 自动扩容机制&#xff1f; 30.简述 Kubernetes Service 类型&#xff1f; 31.简述 Kubernetes Service 分发后端的策略&#xff1f; 32.简述 Kubernetes Headless Service &#xff1f; 29.简述 Kubernetes 自动扩容机制&#xff1f; &#xff08;…

强化学习——马尔可夫决策过程(MDP)【附 python 代码】

一、马尔可夫过程 过程介绍随机过程在某时刻 t 的状态 S t S_t St​ 通常取决于 t 时刻之前的状态。状态 S t 1 S_{t1} St1​ 的概率表示为&#xff1a; P ( S t 1 ∣ S 1 , . . . , S t ) P(S_{t1}|S_1,...,S_t) P(St1​∣S1​,...,St​)马尔可夫过程某时刻 t 的状态只取…

C++面试模拟01

第一部分&#xff1a;基础知识 问&#xff1a;解释 const 关键字的作用&#xff0c;以及在什么场景下你会使用 const&#xff1f; 问&#xff1a;在 C 中&#xff0c;new 和 malloc 的区别是什么&#xff1f; 问&#xff1a;请解释什么是“深拷贝”和“浅拷贝”&#xff1f;在…

IMS 呼叫流程(详细)

目录 业务模型 典型组网如图1所示 信令流程 具体的语音流程如图2所示 主叫信令面流程 01:UE_A->P-CSCF/ATCF 02:P-CSCF/ATCF_A->PCRF_A 03:PCRF_A->PCSCF/ATCF_A 04:P-CSCF/ATCF_A 处理(把S-CSCF加到Route) 05:S-CSCF_A->MMTel AS/SCC AS_A 06:MM…

JAVA-集合相关

HashMap如何解决哈希冲突的&#xff1f; 计算hash值&#xff0c;基于hashCode计算冲突之后&#xff0c;先是使用链式寻址法当链表长度大于8&#xff0c;且hash表的容量大于60的时候&#xff0c;再添加元素则转化成红黑树 为什么计算hash值是&#xff0c;是将hash地址的值右移1…

JavaSE:13、常用工具类

学习 资源1 学习资源 2 1、数学工具类 import com.test.*;import java.util.Random; import java.util.RandomAccess;public class Main {public static void main(String [] argv) throws Exception {System.out.println(Math.pow(5,3));//125.0System.out.println(Math.a…

大数据Flink(一百一十八):Flink SQL水印操作(Watermark)

文章目录 Flink SQL水印操作&#xff08;Watermark&#xff09; 一、为什么要有WaterMark 二、​​​​​​​​​​​​​​Watermark解决的问题 三、​​​​​​​​​​​​​​代码演示 Flink SQL水印操作&#xff08;Watermark&#xff09; 一、​​​​​​​为什么…

43.常用C++编译器推荐——《跟老吕学C++》

43.常用C编译器推荐——《跟老吕学C》 常用C编译器推荐一、C编译器介绍1. GCC (GNU Compiler Collection)2. Clang2.1 Clang的特点2.2 Clang的应用场景2.3 Clang与GCC的比较 3. Microsoft Visual C (MSVC)MSVC的特点MSVC的使用场景MSVC与其他编译器的比较 4. Intel C Compiler4…

Spring MVC设置请求头和响应头的Header

在Spring MVC中&#xff0c;动态设置请求头和响应头的方法有多种&#xff0c;以下是一些常见的方式&#xff1a; 设置请求头 使用RequestHeader注解 这个注解用于读取请求中的单个HTTP头部值&#xff0c;并将其作为一个参数传递给控制器方法。 RequestMapping("/examp…