【云原生 | 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

相关文章

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

springboot3.4和mybatis plus的版本问题的解决

《springboot3.4和mybatisplus的版本问题的解决》本文主要介绍了springboot3.4和mybatisplus的版本问题的解决,主要由于SpringBoot3.4与MyBat... 报错1:spring-boot-starter/3.4.0/spring-boot-starter-

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer