【云原生 | 20】Docker数据卷及卷的持久化问题

2023-11-06 00:10

本文主要是介绍【云原生 | 20】Docker数据卷及卷的持久化问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🍁博主简介
        🏅云计算领域优质创作者
        🏅2022年CSDN新星计划python赛道第一名

        🏅2022年CSDN原力计划优质作者
        🏅阿里云ACE认证高级工程师
        🏅阿里云开发者社区专家博主

💊交流社区:CSDN云计算交流社区欢迎您的加入!

❤️❤️❤️文末重磅福利~免费赠送5本实体书籍❤️❤️❤️

目录

1. 数据卷特性

2. docker管理卷(默认挂载)

3. 自管理卷(手动挂载)实验

4. 容器中的数据卷

5.卷的持久化问题

6.Docker卷的持久化问题

❤️❤️❤️重磅福利:小鹏送书活动第一期❤️❤️❤️


1. 数据卷特性

1.1 认识数据卷特性

Docker 镜像由多个只读层叠加而成,启动容器时,Docker 会加载只读镜像层并在镜像栈顶部添加一个读写层

> 如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,次即“写时复制”机制

1.2 数据卷意义 

关闭并重启容器,其数据不受影响;但删除 Docker 容器,则其改变将会全部丢失

        > 存在的问题

                   >> 存在于联合文件系统中,不易于宿主机访问

                   >> 容器间数据共享不便

                   >> 删除容器其数据会丢失

        > 解决方案:“卷”

                   >> “卷”是容器上的一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机上的某目录“绑定”

 1.3 数据卷结构

Bind mount volume 

> Docker-managed volume

Volume可以是物理机上的任何一个目录

存储服务方式有很多种,如NFS,MFS等,容器数据共享时需要对接到的文件系统或客户端接口都是不一样的,此时需要CSI容器存储接口将存储服务和容器内部对接。存储服务器对接物理机目录,物理机目录对接容器内目录。

2. docker管理卷(默认挂载)

制作镜像时以volumes关键字会指定一个目录。docker运行时先在镜像内找volumes关键字,然后在物理机的/var/lib/docker/volumes目录下生成一个随机名称的目录,默认将此目录与容器内volumes关键字后面指定的目录挂载起来。

3. 自管理卷(手动挂载)实验

方法1:先在物理机创建一个目录,再将多个容器的目录挂载到物理机目录

[root@localhost ~]# mkdir /data	                    #创建目录
[root@localhost ~]# docker run --name test1 -v /data:/usr/local/nginx/html -d nginx:1.21.4	                                #手动挂载#-v 物理机目录:容器内目录
[root@localhost ~]# cd /data/		                #进入
[root@localhost data]# ls			                #查看无文件
[root@localhost data]# touch {1..100}	            #创建100个文件
[root@localhost data]# ls			                #查看有1-100个文件
[root@localhost data]# docker exec -it test1 /bin/bash		#进入容器
root@5fdd3cd78396:/# cd /usr/local/nginx/html/		#进入目录
root@5fdd3cd78396:/usr/local/nginx/html# ls			#查看有1-100个文件。挂载成功

此时单容器完成目录共享

运行第二个容器,将此容器的/usr/local/nginx/html也与物理机的/data目录挂载:

[root@localhost ~]# docker run --name test2 -v /data:/usr/local/nginx/html -d nginx:1.21.4	    

此时物理机的/data目录分别与test1容器和test2容器的两个目录挂载。

这三个目录都可以看到对方创建的文件及内容了。实现了容器与容器的文件共享。

且容器删除后,物理机的挂载目录下的文件还存在。

方法2:先运行容器1让它按照默认的方式将容器的目录与物理机随机产生的目录挂载到一起,再查看到物理机上随机产生的这个目录。将其他的所有容器的目录挂载到物理机物理机上随机产生的这个与容器1默认挂载了的目录上。实现多容器数据共享

[root@localhost ~]# docker run --name test1  -d nginx:1.21.4	#运行容器1,会自动默认挂载
[root@localhost ~]# docker inspect test1	                    #查看,找到如下内容就能查找到默认挂载的物理机目录了

然后用-v选项可以将其他容器的目录挂载到此目录下了

方法2或者:

[root@localhost ~]# docker run --name test1  -d nginx:1.21.4	#运行容器1,会自动默认挂载
[root@localhost ~]# docker run --name test2 --volumes-from test1 -d nginx:1.21.4
[root@localhost ~]# docker run --name test3 --volumes-from test1 -d nginx:1.21.4

用此命令启动其他容器,并将其他容器的目录自动挂载到容器1的挂载目录下

4. 容器中的数据卷

 4.1 数据卷意义

 Docker-managed Volume

        >> docker run -it --name roc -v MOUNTDIR roc/lamp:v1.0

        >> docker inspect -f {{.Mounts}}  roc

   

 > Bind-mount Volume

        >> docker run -it --name roc -v HOSTDIR:VOLUMEDIR  roc/lamp:v1.0

 > Union Volume

        >> docker run -it --name roc --volumes-from ContainerName roc/lamp:v1.0

4.2 存储驱动

Docker 存储驱动 ( storage driver ) 是 Docker 的核心组件,它是 Docker 实现分层镜像的基础

        1、device mapper ( DM ):性能和稳定性存在问题,不推荐生产环境使用(centos6及以下的主流)

        2、btrfs:社区实现了 btrfs driver,稳定性和性能存在问题

        3、overlayfs:内核 3.18 overlayfs 进入主线,性能和稳定性优异,第一选择

4.3 UFS文件系统-Overlayfs

mount -t overlay overlay -olowerdir=./low,upperdir=./upper,workdir=./work ./merged	
echo "overlay" > /etc/modules-load.d/overlay.conf
cat /proc/modules|grep overlay
reboot  
vim /etc/systemd/system/docker.service --storage-driver=overlay \

5.卷的持久化问题

容器是一个强大的概念,但是有时候并不是所有想访问的事物都能立马被封装成容器。用户可能有一个存储在大的集群上的相关Oracle数据库,想要连接它做一些测试。又或者,用户可能有一台遗留的大型服务器,而它上面现有配置好的二进制程序很难重现。
刚开始使用Docker时,用户想要访问的大部分事物可能会是容器外部的数据和程序。我们将和读者一起从直接在宿主机上挂载文件转到更为复杂的容器模 式:数据容器和开发工具容器。我们还将展示一些实用的技巧,例如,只需要一个SSH连接便能跨网络进行远程挂载,以及通过BitTorrent协议与其他用户分享数据。
卷是Docker的一个核心部分,有关外部数据引用的问题也是Docker生态系统中另一个快速变化的领域。

6.Docker卷的持久化问题

容器的大部分力量源自它们能够尽可能多地封装环境的文件系统的状态,这一点的确很有用处。
然而有时候用户并不想把文件放到容器里,而是想要在容器之间共享或者单独管理一些大文件。一个经典的例子便是想要容器访问一个大型的中央式数据 库,但是又希望其他的(也许更传统些的)客户端也能和新容器一样访问它。

解决方案便是卷!一种Docker用来管理容器生命周期外的文件的机制。

我们可以使用Docker的卷标志,在容器里访问宿主机上的A文件。如下图则是使用卷标志和和宿主机上的文件系统交互过程

如下命令展示宿主机上的/var/db/tables目录被挂载到了/var/data1:
$ docker run -v /var/db/tables:/var/data1 -it debian bash
-v标志(--volume的简写)表示为容器指定一个外部的卷。随后的参数以冒号分隔两个目录的形式给出了卷的格式,告知Docker将外部 的/var/db/tables目录映射到容器里的/var/data1目录。如果外部目录和容器目录不存在均会被创建。
要注意的是,卷在Dockerfile里被设定为不是持久化的。如果添加了一个卷,然后在一个Dockefile里对该目录做了一些更改,这些变动将不会被持久化到生成的目标镜像.

重磅福利:小鹏送书活动第一期

首先重磅介绍一下本次送书活动的主角!《Spring Boot趣味实战课》书籍。

特色:这是一本美貌与智慧并重,内涵与趣味同在的书。

干货:书籍主要内容涵盖了 Spring 周边的常用的技术:Spring MVC、MyBatis(Plus)、Spring Data JPA、Spring Security、Quartz、MySQL、Druid、Redis、RabbitMQ、Elasticsearch 等。还包括一些最佳实践:Swagger、RESTful、单元测试、统一异常处理、日志、监控等。还有一些核心技术点:AOP、IOC、自动配置、事务(隔离级别、传播特性)、分布式锁等。京东购买链接

 京东 、当当、 天猫 均已上架喔!购买链接:🔗🔗🔗🔗🔗🔗

 本次活动一共赠送5本书,在下方评论区进行优质评论,评论获点赞量最高的前五名用户各送实体书《Spring Boot趣味实战课》一本。

活动截止时间:2022-08-05日上午12:00

这篇关于【云原生 | 20】Docker数据卷及卷的持久化问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/353317

相关文章

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@