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

Docker数据卷容器实战

数据卷容器

数据共享

上面讲述的是主机和容器之间共享数据,那么如何实现容器和容器之间的共享数据呢?那就是创建 创建数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为 数据卷容器(Data Volume Container)

通俗地来说,docker 容器数据卷可以看成使我们生活中常用的 U 盘,它存在于一个或多个的容器中,由 docker 挂载到容器,但不属于联合文件系统,Docker 不会在容器删除时删除其挂载的数据卷。在创建一个容器时候,使用命令绑定一个父容器,这个父容器就是 数据卷容器

特点:

  • 数据卷可以在容器之间共享或重用数据
  • 数据卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

命令格式:docker run --volumes-from <数据卷容器名> <镜像名[:TAG | ID]>

创建三个容器 tomcat10、tomcat11、tomcat12,其中 tomcat10 是数据卷容器

[root@k8s-master ~]# docker run -d -P --name tomcat10 -v tomcat10:/usr/local/tomcat/webapps tomcat:8.5.73
c96daf52665e7955a7f34c513c9dd5be7a2206e4f7b3519a365a289bbe78f9d6
[root@k8s-master ~]# docker run -d -P --name tomcat11 --volumes-from tomcat10 tomcat:8.5.73
fd1460b6394c4085170298d0916a521669d4d5050086450b151b41fba97e3c19
[root@k8s-master ~]# docker run -d -P --name tomcat12 --volumes-from tomcat10 tomcat:8.5.73
e023742c8c9f6afcf24bb53861ecfd21c7abb0042ea096c544826d1106b9a983

 证明三个容器的数据是否共享

已经创建好三个容器,并且 tomcat10 容器的数据卷目录是 tomcat10。我们可以在 tomcat10 容器的 webapps 目录下创建一个 test.txt 文件,看看 tomcat11 容器和 tomcat12 容器的 webapps 是否同步数据。

首先进入 tomcat10 容器的 webapps 目录,创建 test.txt 文件

[root@k8s-master ~]# docker exec -it tomcat10 /bin/bash
root@c96daf52665e:/usr/local/tomcat# cd webapps
webapps/      webapps.dist/ 
root@c96daf52665e:/usr/local/tomcat# cd webapps/
root@c96daf52665e:/usr/local/tomcat/webapps# touch test1.txt
root@c96daf52665e:/usr/local/tomcat/webapps# ls 
test1.txt

 然后我们进入 tomcat11 容器,看文件是否同步过来,并且创建 test2.txt 文件

[root@k8s-master u]# docker exec -it tomcat11 /bin/bash
root@fd1460b6394c:/usr/local/tomcat# cd webapps/
root@fd1460b6394c:/usr/local/tomcat/webapps# ls -l
total 0
-rw-r--r--. 1 root root 0 Feb 27 12:24 test1.txt

然后我们进入 tomcat12 容器,看文件是否同步过来

[root@k8s-master u]# docker exec -it tomcat12 /bin/bash
root@e023742c8c9f:/usr/local/tomcat# cd webapps/
root@e023742c8c9f:/usr/local/tomcat/webapps# ls -l
total 0
-rw-r--r--. 1 root root 0 Feb 27 12:24 test1.txt

 最后我们看看宿主机的挂载目录

[root@k8s-master ~]# cd /var/lib/docker/volumes/tomcat10/_data/
[root@k8s-master _data]# ls
test1.txt

 

如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。这可以让用户在容器之间升级和移动数据卷。 

数据备份

可以利用数据卷对其中的数据进行进行备份、恢复。

数据备份命令格式:docker run [options] --volumes-from <数据卷容器> [-v <宿主机绝对路径>:<随机路径>] <镜像名>:[TAG | ID] tar cvf <随机路径/备份名> <数据卷容器路径>

 不指定宿主机挂载目录下和容器备份目录,备份 tomcat10 容器的数据卷 webapps 目录

[root@k8s-master _data]# docker run --name tomcat-backup --volumes-from tomcat10 tomcat:8.5.73 tar cvf /backup.tar /usr/local/tomcat/webapps
tar: Removing leading `/' from member names
/usr/local/tomcat/webapps/
/usr/local/tomcat/webapps/test1.txt
[root@k8s-master _data]# find / -name backup.tar
/var/lib/docker/overlay2/bc35ab2d75946a2392d68ddd0872a9656b3013a0da8e771ee4bea0dfc1bdbda2/diff/backup.tar

如果容器删除,那么该方式的备份文件也被删除,并且备份目录是容器 ID 命名,并非容器名,看一长串字符串就知道了。 

指定宿主机挂载目录下和容器备份目录,备份 tomcat10 容器的数据卷 webapps 目录 

[root@k8s-master _data]# docker run --volumes-from tomcat10 -v /opt/backup:/backup tomcat:8.5.73 tar cvf /backup/backup.tar /usr/local/tomcat/webapps
tar: Removing leading `/' from member names
/usr/local/tomcat/webapps/
/usr/local/tomcat/webapps/test1.txt
[root@k8s-master _data]# find / -name backup.tar
/var/lib/docker/overlay2/bc35ab2d75946a2392d68ddd0872a9656b3013a0da8e771ee4bea0dfc1bdbda2/diff/backup.tar
/opt/backup/backup.tar

 注意:容器的挂载路径要和备份的文件路径保持一致,才能备份成功。

数据恢复

备份了数据,那么就需要进行数据恢复。

恢复命令格式:docker run --volumes-from <恢复到哪个数据卷容器> [-v <宿主机绝对路径>:<随机路径>] <镜像名>[:TAG | ID] tar xvf <随机路径 | 路径>

 数据恢复到 tomcat20 容器的数据卷里

[root@k8s-master _data]# docker run -d --name tomcat20 -v tomcat20:/usr/local/tomcat/webapps tomcat:8.5.73
6b1b3fa0e74149197449bf0129771ff462f781d7c476365df9da1c0cc80fecd7[root@k8s-master _data]# 
[root@k8s-master _data]# docker run --volumes-from tomcat20 -v /opt/backup:/backup tomcat:8.5.73 tar xvf /backup/backup.tar -C /usr/local/tomcat/webapps/
usr/local/tomcat/webapps/test1.txt

-C / 代表解压到根目录下,因为压缩包的文件基于根目录的,否则解压的目录是基于 /backup

原理:此时 tomcat20 挂载目录是 /usr/local/tomcat/webapps,而新的容器只要挂载了 tomcat20 容器,它们两个的 /usr/local/tomcat/webapps 形成关联,新的容器的这个目录发生改变,则 tomcat20 的挂载目录也会发生改变,所以解压文件到新的容器的该目录下,实际上也是解压文件到 tomcat20 的挂载目录下,也就是实现恢复数据。

[root@k8s-master _data]# docker exec -it tomcat20 /bin/bash
root@6b1b3fa0e741:/usr/local/tomcat# cd webapps/
root@6b1b3fa0e741:/usr/local/tomcat/webapps# ls
test1.txt

 

挂载特性

关于到底是宿主机的挂载目录覆盖容器的挂载目录,还是反过来覆盖:

  • 默认目录挂载:
    • 当宿主机挂载目录已经存在时,双方挂载完成后,宿主机挂载目录覆盖容器挂载目录
    • 当宿主机挂载目录不存在时,双方挂载完成后,容器挂载目录覆盖宿主机挂载目录
  • 具体目录挂载
    • 当宿主机挂载目录无论存不存在,双方挂载完成后,宿主机挂载目录都会覆盖容器挂载目录

默认目录挂载

宿主机容器运行结果
文件存在文件存在挂载成功,宿主机文件内容覆盖容器文件内容
目录存在目录存在挂载成功,宿主机目录内容覆盖容器目录内容
..................
文件不存在文件存在挂载成功,容器文件内容覆盖宿主机文件内容
目录不存在目录存在挂载成功,容器目录内容覆盖宿主机目录内容
..................
其他和 具体目录挂载 类似

具体目录挂载

宿主机容器运行结果
文件存在文件存在挂载成功,宿主机文件内容覆盖容器文件内容
目录存在目录存在挂载成功,宿主机目录内容覆盖容器目录内容
------------------
文件不存在文件存在挂载成功,宿主机创建空文件,并覆盖掉容器的文件,导致也为空
目录不存在目录存在挂载成功,宿主机创建空目录,并覆盖掉容器的文件,导致也为空
------------------
文件存在文件不存在挂载成功
目录存在目录不存在挂载成功
------------------
文件存在目录存在容器启动失败
目录存在文件存在容器启动失败
------------------
目录不存在目录不存在挂载成功,Docker 会自动在宿主机和容器内新建目录
目录不存在文件存在容器启动失败
目录不存在目录存在挂载成功,宿主机空目录内容覆盖容器内目录(空)

相关文章:

Docker数据卷容器实战

数据卷容器 数据共享 上面讲述的是主机和容器之间共享数据&#xff0c;那么如何实现容器和容器之间的共享数据呢&#xff1f;那就是创建 创建数据卷容器。 命名的容器挂载数据卷&#xff0c;其他容器通过挂载这个&#xff08;父容器&#xff09;实现数据共享&#xff0c;挂载…...

Imagination通过最新的D系列GPU IP将效率提升至新高度

Imagination DXTP GPU IP在加速移动设备和其他电力受限设备上的 图形和计算工作负载时&#xff0c;能够延长电池续航时间。 近日&#xff0c;Imagination Technologies&#xff08;“Imagination”&#xff09;宣布推出其最新的GPU IP——Imagination DXTP&#xff0c;该产品…...

第13天:数据序列化实战 - 从内存到磁盘的完美转换

第13天&#xff1a;数据序列化实战 - 从内存到磁盘的完美转换 一、今日学习目标 &#x1f9f1; 掌握二进制序列化的原理与实现&#x1f4c4; 学习JSON格式的序列化方法&#x1f4be; 完成学生信息管理系统的通用数据存储方案&#x1f50d; 理解不同序列化格式的适用场景 二、…...

【Rust中级教程】2.13. 结语(杂谈):我学习Rust的心路历程

2.13.1. 【Rust自学】专栏的缘起 笔者我在去年12月份之前对Rust还一无所知&#xff0c;后来看到JetBrains推出了Rust Rover&#xff0c;想着自己毕竟是买的全产品证书就下载下来玩了一下。原本就是看看&#xff0c;都打算卸载了&#xff0c;后来去网上查才发现Rust这门语言挺牛…...

【备赛】点亮LED

LED部分的原理图 led前面有锁存器&#xff0c;这是为了防止led会受到lcd的干扰&#xff08;lcd也需要用到这些引脚&#xff09;。 每次想要对led操作&#xff0c;就需要先打开锁存器&#xff0c;再执行操作&#xff0c;最后关闭锁存器。 这里需要注意的是&#xff0c;引脚配置…...

cpp中的继承

一、继承概念 在cpp中&#xff0c;封装、继承、多态是面向对象的三大特性。这里的继承就是允许已经存在的类&#xff08;也就是基类&#xff09;的基础上创建新类&#xff08;派生类或者子类&#xff09;&#xff0c;从而实现代码的复用。 如上图所示&#xff0c;Person是基类&…...

WPF-3天快速WPF入门并达到企业级水准

嘿&#xff0c;小伙伴们&#xff01;如果你已经有一定的C#开发基础&#xff0c;但想快速掌握WPF开发&#xff0c;达到企业级水准&#xff0c;那接下来的这个三天快速入门计划绝对适合你&#xff01;虽然听起来有点挑战&#xff0c;但别担心&#xff0c;只要跟着这个高强度、结构…...

[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)

文章目录 1. JVM内存模型2. 常量池中有什么类型&#xff1f;3. 常量池中真正存储的内容是什么4. 判断一个字符串(引用)是否在常量池中5. BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗&#xff1f;6. 获取堆内存使用情况、非堆内存使用情况 1. JVM内…...

NocoBase 本周更新汇总:新增路由管理

汇总一周产品更新日志&#xff0c;最新发布可以前往我们的博客查看。 NocoBase 目前更新包括的版本更新包括三个分支&#xff1a;main &#xff0c;next和 develop。 main &#xff1a;截止目前最稳定的版本&#xff0c;推荐安装此版本。 next&#xff1a;包含即将发布的新功…...

Spring AOP 切面打印日志完整版

我的项目使用的是 SpringBoot 3。 要在 Spring Boot 3 项目中使用 AOP&#xff08;面向切面编程&#xff09;来打印接收和响应的参数&#xff0c;如 URL、参数、头部信息、请求体等&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1: 添加依赖 确保你的 pom.xml 文件中包…...

【数据结构】(12) 反射、枚举、lambda 表达式

一、反射 1、反射机制定义及作用 反射是允许程序在运行时检查和操作类、方法、属性等的机制&#xff0c;能够动态地获取信息、调用方法等。换句话说&#xff0c;在编写程序时&#xff0c;不需要知道要操作的类的具体信息&#xff0c;而是在程序运行时获取和使用。 2、反射机制…...

SEO炼金术(4)| Next.js SEO 全攻略

在上一篇文章 SEO炼金术&#xff08;3&#xff09;| 深入解析 SEO 关键要素 中&#xff0c;我们深入解析了 SEO 关键要素&#xff0c;包括 meta 标签、robots.txt、canonical、sitemap.xml 和 hreflang&#xff0c;并探讨了它们在搜索引擎优化&#xff08;SEO&#xff09;中的作…...

ONES 功能上新|ONES Copilot、ONES Project 新功能一览

ONES Copilot 智能 AI 助手模型可配置多种类型模型&#xff0c;服务提供方 Dashscope 的模型列表中新增 DeepSeek V3 与 DeepSeek R1&#xff1b;选择自定义模型配置时&#xff0c;填写私有部署的 DeepSeek 模型相关参数即可。 应用场景&#xff1a; 企业内部自部署或在模型服务…...

STM32寄存器控制引脚高低电平

一. 引子 最近在学习32代码的过程当中&#xff0c;虽然在学习IMX6ULL开发板的过程中接触过很多寄存器&#xff0c;最近在返回去看32的时候&#xff0c;在研究代码的时候发现自己对于寄存器的有些特性理解的不够深刻&#xff0c;所以下来的时候去查了资料&#xff0c;以及问了一…...

SOC-ATF 安全启动BL1流程分析(1)

一、ATF 源码下载链接 1. ARM Trusted Firmware (ATF) 官方 GitHub 仓库 GitHub 地址: https://github.com/ARM-software/arm-trusted-firmware 这是 ATF 的官方源码仓库&#xff0c;包含最新的代码、文档和示例。 下载方式&#xff1a; 使用 Git 克隆仓库&#xff1a; git…...

QVariantList使用详解

QVariantList 1. 基本概念2. 使用场景3. 基本操作3.1 创建和初始化3.2 访问元素3.3 修改元素3.4 删除元素 4. 实际应用示例5. 总结其他QT文章推荐 QVariantList 是 Qt 框架中的一个类&#xff0c;用于存储和操作 QVariant 对象的列表。 QVariant 是 Qt 中用于封装各种类型的通…...

TDesign:Cascader 级联选择器(省市区三级联动)

Cascader 级联选择器API 参考官方示例代码 在自己的模板中使用&#xff1a;view import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:get/get.dart; import package:tdesign_flutter/tdesign_flutter.dart;import i…...

Ubuntu20.04下各类常用软件及库安装汇总

1.Miniconda的安装 Ubuntu 20.04版本快速安装 Miniconda&#xff08;宝宝级攻略&#xff09; 2.Nvidia显卡驱动/CUDA/cuDNN安装 Ubuntu 20.04安装nvidia显卡驱动/CUDA/cuDNN Ubuntu 20.04&#xff1a;CUDAcuDNN安装&卸载 Y9000P24款 win11ubuntu20.04 双系统教程 3.SGL…...

linux中安装部署Jenkins,成功构建springboot项目详细教程

参考别人配置Jenkins的git地址为https&#xff0c;无法连上github拉取项目&#xff0c;所以本章节介绍通过配置SSH地址来连github拉取项目 目录&#xff1a; 1、springboot项目 1.1 创建名为springcloudproject的springboot项目工程 1.2 已将工程上传到github中&#xff0c;g…...

2025系统架构师(一考就过):案例之四:架构复用、架构评估、特定架构(DSSA)、架构开发方法(ABSD)

二、软件架构复用 ◆软件产品线是指一组软件密集型系统&#xff0c;它们共享一个公共的、可管理的特性集&#xff0c;满足某个特定市场或任务的具体需要&#xff0c;是以规定的方式用公共的核心资产集成开发出来的。即围绕核心资产库进行管理复用、集成新的系统。 ◆软件架构…...

基于定制开发开源AI大模型S2B2C商城小程序的商品选品策略研究

摘要&#xff1a;随着电子商务的蓬勃发展和技术的不断进步&#xff0c;商品选品在电商领域中的重要性日益凸显。特别是在定制开发开源AI大模型S2B2C商城小程序的环境下&#xff0c;如何精准、高效地选择推广商品&#xff0c;成为商家面临的一大挑战。本文首先分析了商品选品的基…...

后端之JPA(EntityGraph+JsonView)

不同表之间的级联操作或者说关联查询是很多业务场景都会用到的。 对于这种需求最朴素的方法自然是手动写关联表&#xff0c;然后对被关联的表也是手动插入数据。但是手写容易最后写成一堆shit代码&#xff0c;而且修改起来也是非常麻烦的。 学会使用现成的工具还是非常有利的…...

linux--卡顿

1&#xff0c;swappiness swappiness是一个影响操作系统如何使用交换空间&#xff08;swap space&#xff09;的内核参数。它的值范围是从0到100&#xff0c;这个数值决定了系统将数据从物理内存&#xff08;RAM&#xff09;移动到交换分区或交换文件的倾向程度&#xff0c;交…...

【Python pro】函数

1、函数的定义及调用 1.1 为什么需要函数 提高代码复用性——封装将复杂问题分而治之——模块化利于代码的维护和管理 1.1.1 顺序式 n 5 res 1 for i in range(1, n1):res * i print(res) # 输出&#xff1a;1201.1.2 抽象成函数 def factorial(n):res 1for i in range(1…...

Docker 2025/2/24

用来快速构建、运行和管理应用的工具。帮助部署。 快速入门 代码略 解释 docker run :创建并运行一个容器&#xff0c;-d是让容器在后台运行 --name mysql :给容器起个名字&#xff0c;必须唯一 -p 3306:3306 :设置端口映射 -e KEYVALUE :是设置环境变量 mysql :指定运行的…...

4. 示例:创建带约束的随机地址生成器(范围0x1000-0xFFFF)

文章目录 前言代码示例&#xff1a;运行方法&#xff1a;查看结果&#xff1a;关键功能说明&#xff1a;扩展功能建议&#xff1a; 前言 以下是一个完整的SystemVerilog测试平台示例&#xff0c;包含约束随机地址生成、日志输出和波形生成功能&#xff1a; 代码示例&#xff1…...

爱普生SG-8101CE可编程晶振赋能智能手机的精准心脏

在智能手机高速迭代的今天&#xff0c;高性能、低功耗与小型化已成为核心诉求。智能手机作为人们生活中不可或缺的工具&#xff0c;需要在各种复杂场景下稳定运行。爱普生SG-8101CE可编程晶振凭借其卓越性能&#xff0c;成为智能手机中不可或缺的精密时钟源&#xff0c;为通信、…...

指针解剖学:穿透C/C++内存操作的核心密码与避坑指南

一、指针的本质与内存模型 指针是C/C的核心特性&#xff0c;本质是内存地址的变量化表示。每个变量在内存中占据连续的字节空间&#xff0c;地址是内存单元的唯一编号&#xff08;如0x0028FF40&#xff09;。指针变量存储的是目标数据的首地址&#xff0c;通过地址间接操作数据…...

Qt关于平滑滚动的使用QScroller及QScrollerProperties类说明

一、触控时代的滚动工具&#xff1a;QScroller类设计介绍 1.1 从机械滚轮到数字惯性 在触控设备普及前&#xff0c;滚动操作如同老式打字机的滚轴&#xff0c;只能通过鼠标滚轮或滚动条进行离散式控制。QScroller的出现如同给数字界面装上了"惯性飞轮"&#xff0c;…...

【音视频】编解码相关概念总结

NALU RTP PS流 三者总体关系 NALU在RTP中的应用&#xff1a;视频流的RTP传输通常将NALU作为基本的单元进行传输。每个RTP包携带一个或多个NALU&#xff0c;这些NALU包含了视频编码数据。RTP协议通过其头部信息&#xff08;如时间戳、序列号等&#xff09;帮助接收端重新排列和…...