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数据卷容器实战
数据卷容器 数据共享 上面讲述的是主机和容器之间共享数据,那么如何实现容器和容器之间的共享数据呢?那就是创建 创建数据卷容器。 命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载…...
【Eureka 缓存机制】
今天简单介绍一下Eureka server 的缓存机制吧✌️✌️✌️ 一、先来个小剧场:服务发现的"拖延症" 想象你是个外卖小哥(客户端),每次接单都要打电话问调度中心(Eureka Server):“现在…...
docker-compose方式启动Kafka Sasl加密认证(无zk)
首先参考文档,思考过程可以进行参考https://juejin.cn/post/7294556533932884020#heading-3 用的镜像是Bitnami,对SASL配置进行了简化,需要按照特定格式去配置jass验证 完整配置如下 镜像版本参考:https://hub.docker.com/r/bitn…...
[ComfyUI]官方已支持Skyreels混元图生视频,速度更快,效果更好(附工作流)
一、介绍 昨天有提到官方已经支持了Skyreels,皆大欢喜,效果更好一些,还有GGUF量化版本,进一步降低了大家的显存消耗。 今天就来分享一下官方流怎么搭建,我体验下来感觉更稳了一些,生成速度也更快…...
数据库导出
MySQL数据库 使用命令行导出 导出整个数据库:在命令行中输入mysqldump -u用户名 -p密码 数据库名 > 导出文件路径/文件名.sql。例如mysqldump -uroot -p123456 mydb > /home/user/mydb_backup.sql,回车后输入密码即可将名为mydb的数据库导出为SQL…...
Flask 应用结构与模块化管理详细笔记
1. 代码结构优化:StructureA 最初的 Flask 项目结构适用于小型应用,但不适用于大型应用。为了改进代码结构,我们将 URL 管理应用拆分为多个模块。 1.1 StructureA 目录结构 StructureA |-- .flaskenv |-- app.py |-- views.py |-- templat…...
Excel的两个小问题解决
(一)因为合并单元格存在,无法使用下拉自动填充公式。 解决方案: 使用 CtrlEnter 组合键 选中目标区域:选中需要应用公式的所有合并单元格区域,这些单元格可能是由 2 行或 3 行等合并而成。输入公式&…...
计算机毕业设计Python+DeepSeek-R1大模型期货价格预测分析 期货价格数据分析可视化预测系 统 量化交易大数据 机器学习 深度学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
JVM 面试
JVM 运行时内存区域划分是怎样的? 程序计数器:记录当前线程执行的字节码指令的地址,是线程私有的。 Java 虚拟机栈:每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息&#…...
智慧后勤的消防管理:豪越科技为安全护航
智慧后勤消防管理难题大揭秘! 在智慧后勤发展得如火如荼的当下,消防管理却暗藏诸多难题。传统模式下,消防设施分布得那叫一个散,就像一盘散沙,管理起来超费劲。人工巡检不仅效率低,还容易遗漏,不…...
【Elasticsearch】(Java 版)
Elasticsearch(Java 版) 文章目录 Elasticsearch(Java 版)**1. Elasticsearch 简介****1.1 什么是 Elasticsearch?****1.2 核心概念** **2. 安装与配置****2.1 环境要求****2.2 安装步骤****Linux/macOS****Windows** …...
DeepSeek在昇腾上的模型部署 - 常见问题及解决方案
2024年12月26日,DeepSeek-V3横空出世,以其卓越性能备受瞩目。该模型发布即支持昇腾,用户可在昇腾硬件和MindIE推理引擎上实现高效推理,但在实际操作中,部署流程与常见问题困扰着不少开发者。本文将为你详细阐述昇腾Dee…...
安全面试5
文章目录 sql的二次注入在linux下,现在有一个拥有大量ip地址的txt文本文档,但是里面有很多重复的,如何快速去重?在内网渗透中,通过钓鱼邮件获取到主机权限,但是发现内网拦截了tcp的出网流量,聊一…...
【Python量化金融实战】-第2章:金融市场数据获取与处理:2.1 数据源概览:Tushare、AkShare、Baostock、通联数据(DataAPI)
本章将详细介绍四大主流金融数据源(Tushare、AkShare、Baostock、通联数据(DataAPI)),分析其特点与适用场景,并通过实战案例展示数据获取与处理的全流程。 👉 点击关注不迷路 👉 点击…...
Exoplayer(MediaX)实现音频变调和变速播放
在K歌或录音类应用中变调是个常见需求,比如需要播出萝莉音/大叔音等。变速播放在影视播放类应用中普遍存在,在传统播放器Mediaplayer中这两个功能都比较难以实现,特别在低版本SDK中,而Exoplayer作为google官方推出的Mediaplayer替…...
服务器间迁移conda环境
注意:可使用迁移miniconda文件 or 迁移yaml文件两种方式,推荐前者,基本无bug! 一、迁移miniconda文件: 拷贝旧机器的miniconda文件文件到新机器: 内网拷贝:scp -r mazhf192.168.1.233:~/miniconda3 ~/ 外…...
docker高级
文章目录 1.Docker Compose1.1 介绍1.2 compose文件1.3 常用命令1.4 安装1.5 项目说明和构建1.5.1 手工启动1.5.2 compose 编排启动1.5.3 完善 compose.yml1.5.4 加入前端容器 2.UI管理平台2.1 portainer 3.镜像发布3.1 阿里云3.2 Docker Registry3.2.1 介绍3.2.2 安装3.2.3 测…...
Redis Stream基本使用及应用场景
一、概念 Redis Streams是Redis5.0提供的一种消息队列机制,支持多播的可持久化的消息队列,用户实现发布订阅的功能,借鉴了kafka设计。 二、常用命令 命令名称描述XADD key ID field value [field value ...]添加一条消息 key:St…...
DAY40|动态规划Part08|LeetCode: 121. 买卖股票的最佳时机 、 122.买卖股票的最佳时机II 、 123.买卖股票的最佳时机III
目录 LeetCode:121. 买卖股票的最佳时机 暴力解法 贪心法 动态规划法 LeetCode:122.买卖股票的最佳时机II 基本思路 LeetCode: 买卖股票的最佳时机III、IV 基本思路 C代码 LeetCode:121. 买卖股票的最佳时机 力扣题目链接 文字讲解:121. 买卖股票的最佳时…...
【安装及调试旧版Chrome + 多版本环境测试全攻略】
👨💻 安装及调试旧版Chrome 多版本环境测试全攻略 🌐 (新手友好版 | 覆盖安装/运行/调试全流程) 🕰️ 【背景篇】为什么我们需要旧版浏览器测试? 🌍 🌐 浏览器世界的“…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
