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私有知识库,不仅可以集中存储和管理企业知识,还能通过人工智能技术实现知识的智能化处理和利用。本文将详细介绍…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
