Docker的数据管理(数据卷+数据卷容器)
文章目录
- 一、Docker的数据管理
- 1、概述
- 2、主要的技术(三种数据挂载方式)
- 2.1、数据卷(Volumes)
- 2.2、绑定挂载(Bind mounts)
- 2.3、tmpfs挂载(Tmpfs mounts)
- 2.4、之间的关系(数据在Docker主机上的存储位置)
- 二、数据卷示例
- 1、创建一个命名的数据卷
- 2、修改数据卷内文件内容
- 3、启动两个容器并验证数据共享
- 4、宿主机与容器间的实时同步
- 4.1、进入容器内部修改数据测试同步
- 4.2、宿主机修改数据测试同步
- 5、删除容器验证数据持久性
- 6、只读挂载
- 三、数据卷案例:5.6版本MySQL数据迁移到MySQL5.7版本
- 1、创建一个命名的数据卷
- 2、Docker安装MySQL5.6版本
- 3、进入容器创建数据
- 4、删除mysql-5.6容器
- 5、Docker安装MySQL5.7版本
- 6、进入容器进行验证
- 四、数据卷容器
- 1、概述
- 2、创建数据卷
- 3、查看所有的数据卷
- 4、修改数据卷内文件内容
- 5、启动一个挂载数据卷的容器
- 6、启动两个客户端容器
- 7、访问测试
- 8、停止了卷容器创建新容器也可以引用他
- 9、删除卷容器后无法依据卷容器创建新容器
一、Docker的数据管理
1、概述
Docker的数据管理是指在Docker容器中对数据进行存储、共享、备份和持久化的方法和技术。它允许用户在保持容器轻量级的同时,确保容器产生的数据能够安全、高效地存储和管理。
2、主要的技术(三种数据挂载方式)
2.1、数据卷(Volumes)
- 数据卷是Docker管理的、独立于容器的存储区域,提供了数据持久化和容器间共享的能力。
- 数据卷存储在Docker主机上的特定目录,默认是
/var/lib/docker/volumes/
(Linux系统),并且可以在容器间共享而不依赖于任何单一容器的生命周期。 - 即使容器被删除,数据依然存在。
2.2、绑定挂载(Bind mounts)
- 绑定挂载是将宿主机上的文件系统路径直接挂载到容器内的过程。
- 这种方式允许直接利用宿主机的文件系统资源,但可能带来数据管理上的复杂性和安全性考量。
- 绑定挂载的存储位置和数据格式完全由宿主机控制,不受到Docker的直接管理。
2.3、tmpfs挂载(Tmpfs mounts)
- Tmpfs挂载是将数据存储在宿主机的内存中而不是磁盘上,适用于临时文件或对速度有高要求的场景。
- 这种类型的存储不会持久化,容器停止或宿主机重启后数据将会丢失。
- 适合存储敏感信息或缓存数据,因其不会写入磁盘,可以增加安全性。
2.4、之间的关系(数据在Docker主机上的存储位置)
这篇我们主要学习数据卷
二、数据卷示例
1、创建一个命名的数据卷
[root@localhost ~]# docker volume create web_data
web_data
2、修改数据卷内文件内容
[root@localhost ~]# docker volume inspect web_data
[{"CreatedAt": "2024-05-29T19:04:36+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/web_data/_data","Name": "web_data","Options": null,"Scope": "local"}
]
#这里的/var/lib/docker/volumes/web_data/_data就是数据卷在宿主机上的路径。[root@localhost ~]# echo "nginx test" > /var/lib/docker/volumes/web_data/_data/index.html
#直接在宿主机上通过找到的路径修改数据卷内的文件。
3、启动两个容器并验证数据共享
[root@localhost ~]# docker run -itd --name nginx_v1 -v web_data:/usr/share/nginx/html -p 8085:80 nginx
73a584b4345b6bb05f99e153f5a92e1aaaf14b183ffb2173cd4238e1bd4edf60
[root@localhost ~]# docker run -itd --name nginx_v2 -v web_data:/usr/share/nginx/html -p 8086:80 nginx
5ce93af52b15d0f905fb749c483138f7e3247995186b9696709b3bd166bc10f6
[root@localhost ~]# curl -s 192.168.112.60:8085
nginx test
[root@localhost ~]# curl -s 192.168.112.60:8086
nginx test
挂载在了相同宿主机目录到容器内的
/usr/share/nginx/html
路径,同时映射了不同的端口以区分访问。可以看到数据内容是可以共享的,都显示
nginx test
4、宿主机与容器间的实时同步
4.1、进入容器内部修改数据测试同步
[root@localhost ~]# docker exec -it nginx_v1 /bin/bash
root@73a584b4345b:/# echo "nginx test write !" > /usr/share/nginx/html/index.html
root@73a584b4345b:/# exit
exit
[root@localhost ~]# curl -s 192.168.112.60:8085
nginx test write !
[root@localhost ~]# curl -s 192.168.112.60:8086
nginx test write !
4.2、宿主机修改数据测试同步
[root@localhost ~]# echo "nginx test write twice" > /var/lib/docker/volumes/web_data/_data/index.html
[root@localhost ~]# curl -s 192.168.112.60:8085 nginx test write twice
[root@localhost ~]# curl -s 192.168.112.60:8086 nginx test write twice
5、删除容器验证数据持久性
[root@localhost ~]# docker rm -fv `docker ps -qa`
5ce93af52b15
73a584b4345b
#这是删除所有容器的命令针对删除nginx_v1以及nginx_v2的命令如下:
docker rm -fv nginx_v1
docker rm -fv nginx_v2[root@localhost ~]# cat /var/lib/docker/volumes/web_data/_data/index.html
nginx test write twice
可以看到即使所有使用该数据卷的容器都被删除,数据卷本身及其数据依然会被保留
直到显式执行
docker volume rm
命令来删除它。
6、只读挂载
[root@localhost ~]# docker run -itd --name nginx_v3 -v web_data:/usr/share/nginx/html/:ro -p 8087:80 nginx
64737fc7e6fc60e6d4f6203735afb464bc3cdbacbacb92372e3112d35a3d1be8
[root@localhost ~]# docker run -itd --name nginx_v4 -v web_data:/usr/share/nginx/html/:ro -p 8088:80 nginx
fbb5c0dc949b2fca4d9e39b392d535233dfa57b48f348c028d1518cebd7a3560
[root@localhost ~]# docker exec -it nginx_v3 /bin/bash
root@64737fc7e6fc:/# echo "test readonly" > /usr/share/nginx/html/index.html
bash: /usr/share/nginx/html/index.html: Read-only file system
通过只读方式挂载以后,在容器内部是不允许修改数据的
三、数据卷案例:5.6版本MySQL数据迁移到MySQL5.7版本
1、创建一个命名的数据卷
[root@localhost ~]# docker volume create mysql_data
mysql_data
2、Docker安装MySQL5.6版本
[root@localhost ~]# docker run -d --name mysql-5.6 -p 3306:6606 -v mysql_data:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123 mysql:5.6
[root@localhost ~]# cd /var/lib/docker/volumes/mysql_data/_data/
[root@localhost _data]# ls
auto.cnf ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema
-d
: 表示后台运行容器(detached模式),即容器会在后台运行而不是与当前终端交互。--name mysql-5.6
: 为容器指定一个名字,这里是mysql-5.6
,便于后续管理和识别。-p 3306:3306
: 端口映射配置,将宿主机的3306端口映射到容器内的3306端口。-v mysql_data:/var/lib/mysql/
: 数据卷挂载,mysql_data
是数据卷的名称(如果没有事先创建,Docker会自动创建一个匿名数据卷),这个数据卷挂载到容器内的/var/lib/mysql/
目录。-e MYSQL_ROOT_PASSWORD=123
: 设置环境变量,这里设置了MySQL的root用户的密码为123
。mysql:5.6
: 这是Docker镜像的名称和标签,表示使用mysql
镜像的5.6
版本来创建容器。
3、进入容器创建数据
[root@localhost _data]# docker exec -it mysql-5.6 /bin/bash
root@7ef4b48ecbcf:/# cd /var/lib/mysql
root@7ef4b48ecbcf:/var/lib/mysql# ls
auto.cnf ib_logfile0 ib_logfile1 ibdata1 mysql performance_schema
root@7ef4b48ecbcf:/var/lib/mysql# mysql -uroot -p123
mysql> create database test;
mysql> use test;
mysql> create table stu (id int(5),name varchar(20),age int(5));
mysql> insert into stu values(1,"zhangsan",18);
创建了个stu表插入了一条数据
4、删除mysql-5.6容器
docker rm -f mysql-5.6
5、Docker安装MySQL5.7版本
[root@localhost ~]# docker run -d --privileged=true --name mysql-5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 -v mysql_data:/var/lib/mysql/ mysql:5.7
6、进入容器进行验证
[root@localhost ~]# docker exec -it mysql-5.7 /bin/bash
bash-4.2# mysql -uroot -p123
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| stu |
+----------------+
1 row in set (0.00 sec)mysql> select * from stu;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 18 |
+------+----------+------+
1 row in set (0.00 sec)
可以看到之前mysql-5.6创建的数据还在
四、数据卷容器
1、概述
数据卷容器是Docker中管理数据卷的一种高级用法,它允许用户创建一个专门用于数据存储的容器,并将其数据卷挂载到其他容器中。
这种方式使得数据可以跨容器共享,同时保持数据的持久性和可移植性。
数据卷容器主要用于数据的持久化存储和跨容器共享,它本身并不运行任何实际的应用服务,而是作为一个存储媒介存在。
2、创建数据卷
[root@localhost ~]# docker volume create my_volume
my_volume
3、查看所有的数据卷
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local my_volume
local mysql_data
local web_data
4、修改数据卷内文件内容
[root@localhost ~]# echo "my_volume_test" > /var/lib/docker/volumes/my_volume/_data/index.html
5、启动一个挂载数据卷的容器
[root@localhost ~]# docker run -itd --name volume_v1 -v my_volume:/usr/share/nginx/html:ro -p 8089:80 nginx
c9cff2a314fef930aa570680068e40c280a53d0921613b60d926c9ffd185200b
6、启动两个客户端容器
[root@localhost ~]# docker run -itd --name web1 -p 8090:80 --volumes-from volume_v1 nginx
c036bb587750c2232e7e1efe11b4b421e2c0be275a0aec6da953e670ba6d47b0
[root@localhost ~]# docker run -itd --name web2 -p 8091:80 --volumes-from volume_v1 nginx
9bff8f66a04d701b46f6e94d39664758e22fa4ab6140dd48a1ce0212bb59b941
7、访问测试
[root@localhost ~]# curl -s 192.168.112.60:8089
my_volume_test
[root@localhost ~]# curl -s 192.168.112.60:8090
my_volume_test
[root@localhost ~]# curl -s 192.168.112.60:8091
my_volume_test
8、停止了卷容器创建新容器也可以引用他
[root@localhost ~]# docker stop volume_v1
volume_v1
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bff8f66a04d nginx "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 0.0.0.0:8091->80/tcp, :::8091->80/tcp web2
c036bb587750 nginx "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 0.0.0.0:8090->80/tcp, :::8090->80/tcp web1
c9cff2a314fe nginx "/docker-entrypoint.…" 8 minutes ago Exited (0) 4 seconds ago volume_v1
#停止卷容器volume_v1[root@localhost ~]# docker run -itd --name web3 -p 8092:80 --volumes-from volume_v1 nginx
7e8a3e82e6aacf32e5194d4a47d827f718685e0811ffc478b09a6e1748fd997f
[root@localhost ~]# curl -s 192.168.112.60:8092
my_volume_test
#可以获取my_volume数据卷的内容
9、删除卷容器后无法依据卷容器创建新容器
[root@localhost ~]# docker rm -f volume_v1
volume_v1
[root@localhost ~]# docker run -itd --name web4 -p 8093:80 --volumes-from volume_v1 nginx
docker: Error response from daemon: No such container: volume_v1.
See 'docker run --help'.[root@localhost ~]# curl 192.168.112.60:8089
curl: (7) Failed connect to 192.168.112.60:8089; 拒绝连接
[root@localhost ~]# curl 192.168.112.60:8090
my_volume_test
[root@localhost ~]# curl 192.168.112.60:8091
my_volume_test
[root@localhost ~]# curl 192.168.112.60:8092
my_volume_test
#之前创建好的容器不会有任何影响
相关文章:

Docker的数据管理(数据卷+数据卷容器)
文章目录 一、Docker的数据管理1、概述2、主要的技术(三种数据挂载方式)2.1、数据卷(Volumes)2.2、绑定挂载(Bind mounts)2.3、tmpfs挂载(Tmpfs mounts)2.4、之间的关系(…...
字符串-至多包含K种字符的子串中最长子串(mid)
一、题目描述 二、解题思路 借鉴以下题目思想,使用双指针,外层循环右侧指针移动,内存循环左侧指针移动 字符串-最长不含重复字符的子字符串(mid)-CSDN博客文章浏览阅读622次,点赞17次,收藏4次。java刷题:…...
Docker从安装开始精通
从虚拟机到容器 1.环境配置的难题 软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来? 用户必须保证两件事:操作系统的设置,各种库和组件的安装…...
MFC:初步理解序列化与反序列化(含代码实现)
序列化与反序列化是MFC将对象数据以二进制数据流的形式进行存储和读取的机制,读、写的效率很高。通过序列化与反序列化,可以将程序中对象在内存中数据保存到文件 (磁盘) 或者从文件 (磁盘) 中读取到内存以恢复对象数据,从而实现程序对数据的持…...
python程序控制结构
文章目录 一、python程序控制结构介绍二、顺序结构2.1、print()函数2.2、end参数2.3、input()函数 三、选择结构3.1选择结构的用途 四、循环结构4.1循环结构的构造4.1.1、循环结构的三个要素4.1.2、循环结构的一个要求4.1.3、循环结构的一个关系 4.2、循环语句4.2.1、while语句…...

【GD32】04 - Timer定时器
GD32中的定时器 GD32E230中有七个定时器,六种类型,其中通用的L4版本有两个,其他类型的各一个。 那我们就以通用L4这个类型来敲代码,其他流程是通用的。 通用L4 虽然每种类型的定时器都有自己的结构框图,但是其实大差…...

Golang | Leetcode Golang题解之第123题买卖股票的最佳时机III
题目: 题解: func maxProfit(prices []int) int {buy1, sell1 : -prices[0], 0buy2, sell2 : -prices[0], 0for i : 1; i < len(prices); i {buy1 max(buy1, -prices[i])sell1 max(sell1, buy1prices[i])buy2 max(buy2, sell1-prices[i])sell2 m…...

Leetcode2028. 找出缺失的观测数据
Every day a Leetcode 题目来源:2028. 找出缺失的观测数据 解法1:模拟 统计当前 m 个元素的总和 curSum sum(rolls),总共 mn 个元素和为 total (m n) * mean。 排除 2 种情况: total - curSum > 6 * n:n 个…...
如何在CentOS中合理划分磁盘空间以优化系统性能
目录 前言 理想的分区方案 为什么需要单独分区 安全性 性能 管理和维护 稳定性和可靠性 升级和兼容性 结论 前言 在进行CentOS系统的安装和配置时,合理划分磁盘空间是确保系统性能、安全性和易于管理的关键步骤。本文将探讨如何根据系统的硬件配置和预期用途…...

算法(十一)贪婪算法
文章目录 算法简介算法概念算法举例 经典问题 -背包问题 算法简介 算法概念 贪婪算法(Greedy)是一种在每一步都采取当前状态下最好的或者最优的选择,从而希望导致结果也是全局最好或者最优的算法。贪婪算法是当下局部的最优判断,…...

Rust之函数式语言特性:迭代器和闭包(一):概述
开发环境 Windows 11Rust 1.78.0 VS Code 1.89.1 项目工程 这次创建了新的工程minigrep. 函数式语言特性:迭代器和闭包 Rust的设计从许多现有语言和技术中获得了灵感,其中一个重要影响是函数式编程。函数式编程通常包括通过在参数中传递函数、从其他函数返回函数、…...

配置资源管理
一 Secret Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。 1 有三种类型: kubernetes.io/service…...

unity2020打包webGL时卡进程问题
我使用的2020.3.0f1c1,打包发布WEB版的时候会一直卡到asm2wasm.exe这个进程里,而且CPU占用率90%以上。 即使是打包一个新建项目的空场景也是同样的问题,我尝试过一直卡在这里会如何,结果还真打包成功了。只是打包一个空场景需要20…...
云原生架构相关技术_3.无服务器技术
1.技术特点 1.1面向特定领域的后端云服务(BaaS) 随着以Kubernetes为代表的云原生技术成为云计算的容器界面,Kubernetes成为云计算的新一代操作系统。面向特定领域的后端云服务(BaaS)则是这个操作系统上的服务API&…...

Leetcode:Z 字形变换
题目链接:6. Z 字形变换 - 力扣(LeetCode) 普通版本(二维矩阵的直接读写) 解决办法:直接依据题目要求新建并填写一个二维数组,最后再将该二维数组中的有效字符按从左到右、从上到下的顺序读取并…...
Python 3 判断文件是否存在
1 使用os.path模块 import osfile_path hello.txtif os.path.exists(file_path):print(f"文件 {file_path} 存在。") else:print(f"文件 {file_path} 不存在。") 2 使用pathlib模块 from pathlib import Pathfile_path Path(word.txt)if file_path.ex…...

(深度学习记录)第TR3周:Transformer 算法详解
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文本的输入处理中,transformer会将输入文本序列的每个词转化为一个词向量,我们通常会选择一个合适的长度作为输入…...
谷神前端组件增强:自定义列
初始化 $gp.customColumn {}initColumnPool /*** initColumnPool* 初始化列池* * param prefix 前缀* param length 长度* * return Array 列ID数组* */ function initColumnPool (prefix, length) {return Array.from({length}, (value, index) > prefix index) } self…...
31-ESP32-S3-WIFI篇-02 Event Group (事件标记组)
ESP32-S3-WIFI 事件标记组 介绍 在ESP32-S3的WiFi驱动程序中,事件标记组(Event Group)是一个非常重要的概念。它是FreeRTOS中的一种同步机制,用于在任务之间传递和同步事件。在WiFi驱动程序中,我们使用事件标记组来通…...

构建企业级AI私有知识库
一、引言 在当今竞争激烈的市场环境中,企业为了保持竞争优势,需要高效地管理和利用内部知识资源。构建一个企业级AI私有知识库,不仅可以集中存储和管理企业知识,还能通过人工智能技术实现知识的智能化处理和利用。本文将详细介绍…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...

动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...
用 FFmpeg 实现 RTMP 推流直播
RTMP(Real-Time Messaging Protocol) 是直播行业中常用的传输协议。 一般来说,直播服务商会给你: ✅ 一个 RTMP 推流地址(你推视频上去) ✅ 一个 HLS 或 FLV 拉流地址(观众观看用)…...