docker 数据管理,数据持久化详解 一
docker镜像是分层设计的,镜像出只读,通过镜像启动的容器添加一层可读写的文件系统,用户写入的数据表都保存在这层中。
容器的数据分层目录
LowerDir:image 镜像层,即镜像本身,制度
UpperDir:容器上层,可读写,容器变化的数据存在在此处
MergeDir:容器的文件系统,使用Union FS(联合文件系统)将 LowerDir和UpperDir合并完成后给容器使用,最终呈现给用户的统一视图
WorkDir:容器在宿主机的工作目录,挂在后内容会被清空,请在使用过程中其内容用户不可见
数据持久化方式
1.卷 volume 最常使用
2.绑定挂载 bindmount 有安全风险
3.tmpfs挂载 挂载在内存里,且容器停止时 挂载文件会删除
卷分类
数据卷(Data Volume) 直接将宿主机目录挂载只容器的指定目录 常用
数据卷容器(Data Volume Container)间接使用宿主机空间,数据卷容器是将宿主机的目录挂载至一个专门的数据卷容器,然后让其他容器通过数据卷容器读写宿主机的数据,不常用
数据卷详解
1.数据卷使用场景
数据库
日志输出
静态web页面
应用配置文件
多容器间目录或文件共享
2.数据卷特点
①数据卷是目录或者文件,并且可以在多个容器之间共同使用,实现容器之间共享和重用
②对数据卷更改数据在所有容器里面会立即更新
③数据卷的数据可以持久保存,删除使用该容器卷的容器也不影响
④在容器里面的写入数据不会形象到镜像本身,即数据卷的变化不会影响镜像的更新
⑤依赖于宿主机目录,宿主机出问题上面容器会受影响,当宿主机较多时,不方便统一管理
⑥匿名和命名数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,会拷贝到新初始化的数据卷中
3.数据卷分类
启动容器时,可以指定使用数据卷实现容器数据的持久化,数据卷有三种
①指定宿主机目录或文件:指定宿主机的具体路径和容器路径的挂载关系,此方式不会创建数据卷
②匿名卷:不指定数据名称,至指定容器内目录路径充当挂载点,dicker自动指定宿主机的路径进行挂载,此方式会创建匿名数据卷,dockerfile中volume指定的卷即为此种
③命名卷:指定数据卷的名称和容器路径的挂载关系,此方式会创建命名数据卷
案例 1:MySQL 数据库
目标
- 将 MySQL 数据库的数据持久化到主机上的命名数据卷中,确保数据在容器重启或删除后仍然保留。
步骤
1. 创建命名数据卷:
docker volume create mysql_data
2. 启动 MySQL 容器并挂载命名数据卷:
docker run -d --name mysql-container \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v mysql_data:/var/lib/mysql \
mysql:latest
3. 验证数据卷:
- 进入容器检查数据是否正确挂载:
docker exec -it mysql-container sh
ls /var/lib/mysql
4. 停止和删除容器:
docker stop mysql-container
docker rm mysql-container
5. 重新启动容器并挂载相同的命名数据卷:
docker run -d --name mysql-container \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v mysql_data:/var/lib/mysql \
mysql:latest
6. 验证数据是否保留:
- 进入容器检查数据是否仍然存在:
docker exec -it mysql-container sh
ls /var/lib/mysql
解释
docker volume create mysql_data:创建一个名为 mysql_data 的命名数据卷。
--v mysql_data:/var/lib/mysql:将命名数据卷 mysql_data 挂载到容器内的 /var/lib/mysql 目录,这是 MySQL 存储数据的默认位置。
docker stop 和 docker rm:停止并删除容器,但命名数据卷中的数据仍然保留。
重新启动容器:再次启动容器时,使用相同的命名数据卷,数据仍然存在。
案例 2:Nginx 静态文件
目标
将 Nginx 服务器的静态文件持久化到主机上的命名数据卷中,确保文件在容器重启或删除后仍然保留。
步骤
1. 创建命名数据卷:
docker volume create nginx_static
2. 启动 Nginx 容器并挂载命名数据卷:
docker run -d --name nginx-container \
-p 80:80 \
-v nginx_static:/usr/share/nginx/html \
nginx:latest
3. 向数据卷中添加静态文件:
- 创建一个 HTML 文件并复制到数据卷中:
echo "<h1>Hello, Docker!</h1>" > index.html
docker cp index.html nginx_container:/usr/share/nginx/html/
4. 验证静态文件:
- 访问 `http://localhost`,应该能看到 "Hello, Docker!" 页面。
5. 停止和删除容器:
docker stop nginx-container
docker rm nginx-container
6. 重新启动容器并挂载相同的命名数据卷:
docker run -d --name nginx-container \
-p 80:80 \
-v nginx_static:/usr/share/nginx/html \
nginx:latest
7. 验证静态文件是否保留:
访问 http://localhost,应该仍然能看到 "Hello, Docker!" 页面。
解释
docker volume create nginx_static:创建一个名为 nginx_static 的命名数据卷。
-v nginx_static:/usr/share/nginx/html:将命名数据卷 nginx_static挂载到容器内的 /usr/share/nginx/html` 目录,这是 Nginx 存储静态文件的默认位置。
docker cp:将本地文件复制到容器内的指定目录。
docker stop和 docker rm:停止并删除容器,但命名数据卷中的静态文件仍然保留。
重新启动容器:再次启动容器时,使用相同的命名数据卷,静态文件仍然存在。
案例 3:Redis 数据库
目标
将 Redis 数据库的数据持久化到主机上的命名数据卷中,确保数据在容器重启或删除后仍然保留。
步骤
1. 创建命名数据卷:
docker volume create redis_data
2. 启动 Redis 容器并挂载命名数据卷:
docker run -d --name redis-container \
-v redis_data:/data \
redis:latest
3. 验证数据卷:
- 进入容器检查数据是否正确挂载:
docker exec -it redis-container sh
ls /data
4. 写入数据:
- 使用 `redis-cli` 写入一些数据:
docker exec -it redis-container redis-cli
set key1 value1
exit
5. 停止和删除容器:
docker stop redis-container
docker rm redis-container
6. 重新启动容器并挂载相同的命名数据卷:
docker run -d --name redis-container \
-v redis_data:/data \
redis:latest
7. 验证数据是否保留:
- 使用 redis-cli 检查数据是否仍然存在:
docker exec -it redis-container redis-cli
get key1
exit
解释
docker volume create redis_data:创建一个名为 redis_data 的命名数据卷。
-v redis_data:/data:将命名数据卷 redis_data 挂载到容器内的 /data 目录,这是 Redis 存储数据的默认位置。
docker exec -it redis-container redis-cli:进入容器并使用 `redis-cli` 进行数据操作。
docker stop 和 docker rm:停止并删除容器,但命名数据卷中的数据仍然保留。
重新启动容器:再次启动容器时,使用相同的命名数据卷,数据仍然存在。
案例 4:多容器共享数据
目标
在多个容器之间共享数据,使用命名数据卷确保数据的一致性和持久性。
步骤
1. 创建命名数据卷:
docker volume create shared_data
2. 启动第一个容器并挂载命名数据卷:
docker run -d --name container1 \
-v shared_data:/shared \
nginx:latest
3. 向数据卷中添加文件:
- 创建一个文件并复制到数据卷中:
echo "This is a shared file" > shared_file.txt
docker cp shared_file.txt container1:/shared/
4. 启动第二个容器并挂载相同的命名数据卷:
docker run -d --name container2 \
-v shared_data:/shared \
busybox:latest
5. 验证文件是否共享:
- 进入第二个容器检查文件是否存在:
docker exec -it container2 sh
cat /shared/shared_file.txt
6. 停止和删除容器:
docker stop container1 container2
docker rm container1 container2
7. 重新启动容器并挂载相同的命名数据卷:
docker run -d --name container1 \
-v shared_data:/shared \
nginx:latest
docker run -d --name container2 \
-v shared_data:/shared \
busybox:latest
8. 验证文件是否保留:
- 进入任意一个容器检查文件是否仍然存在:
docker exec -it container1 sh
cat /shared/shared_file.txt
解释
docker volume create shared_data:创建一个名为 shared_data的命名数据卷。
-v shared_data:/shared:将命名数据卷 shared_data 挂载到容器内的 /shared目录。
docker cp:将本地文件复制到容器内的指定目录。
docker exec -it:进入容器并检查文件是否存在。
docker stop 和 docker rm:停止并删除容器,但命名数据卷中的文件仍然保留。
重新启动容器:再次启动容器时,使用相同的命名数据卷,文件仍然存在。
相关文章:
docker 数据管理,数据持久化详解 一
docker镜像是分层设计的,镜像出只读,通过镜像启动的容器添加一层可读写的文件系统,用户写入的数据表都保存在这层中。 容器的数据分层目录 LowerDir:image 镜像层,即镜像本身,制度 UpperDir:容…...
【ios】使用TestFlight将app分发给测试人员(超详细)
我的环境: macos系统是Ventura 13.0 xcode是14.2(后面发现至少需要15版本的xcode才能上传app) 证书生成 可以通过xcode生成Distribution类型的证书,如果你已经有的话那就忽略,这个证书也是备案时所需的。 我是已…...
证件照小程序源码,前后端稳定运行
演示:证寸照制作 运行环境: Linux Nginx PHP >5.6 MySQL>5.6 安装步骤: 1.下载源码上传至你的服务器宝塔面板 2.直接添加站点选择源码目录,新建数据库 3.设置代码执行目录为/web 4.在浏览器中输入你的域名,会提示安装,填写…...
java白嫖同事的从身份证里面提取省市区地址详细信息的工具类代码
/*** author sunpeiyang* date 2024/10/21 16:35*/ Slf4j public class MiTaAddressExtractor {/*** 获取详细地址** param fullAddress 身份证完整地址*/public static String getDetailedAddress(String fullAddress) {String[] addressArrays spliceDetailedAddress(fullAd…...
计算机网络基本架构示例2
一、企业内部网络架构 在一个中型企业中,通常会有以下的网络架构: - 核心层:由高性能的核心交换机组成,负责快速转发大量数据。例如采用具有高带宽和冗余功能的三层交换机,确保整个网络的稳定运行。它连接着各个部门的…...
无人机之室内定位技术篇
无人机的室内定位技术是实现无人机在室内环境中精准导航和定位的关键技术。由于室内环境复杂,卫星导航系统(如GPS)无法提供有效的信号,因此需要依赖其他室内定位技术。 一、主要技术类型 基于视觉的定位技术 原理:利…...
在ubuntu20.04中输入不存在shell命令时,报错ModuleNotFoundError的解决方案
这个问题出现过好几次,每次都比较困扰,以下的解决方案比较适合: 当我输入ubuntu无法识别的命令的时候,正常来说应该提示类似于 command not found 之类的字眼,但是系统确报了如下错误: Traceback (most r…...
互联网语言 互联网开发 互联网架构
JAVA和PHP是两种广泛应用于互联网开发的编程语言,它们在多个维度上展现出显著的不同。 JAVA是一种面向对象的编程语言,以其严谨、高效的特性而著称。JAVA的语法结构复杂且规范,强调封装、继承和多态等面向对象原则,适合构建大型企…...
解决MybatisPlus updateById更新数据时将没传的数据也更新成了null
首先,MybatisPlus在调用自带的更新接口updateById时,如果没加任何配置,默认是不会将前端没传的数据也更新成null的。即MyBatisPlus不会更新传入实体中为null的字段,只会更新设置了不为null的值。 如果发现没传的也更新成null了的话…...
OpenWRT 和 Padavan 路由器配置网络打印机 实现远程打印
本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 之前有给大家介绍过 Armbian 安装 CUPS 作为打印服务器,像是 N1 盒子、玩客云,甚至是随身 WiFi 都可以通过 CUPS 来进行打印。但是有些朋友不想专门为打印机添置一个设备࿰…...
R语言机器学习教程大纲
文章目录 介绍机器学习算法监督学习Supervised Learning分类Classification回归Regression 无监督学习 Unsupervised Learning聚类 Clustering降纬 Dimensionality Reduction相关Association 强化学习Reinforcement Learning模型自由 Model-Free Methods模型驱动 Model-Based M…...
java如何部署web后端服务
java如何部署web后端服务 简单记录一下,方便后续使用。 部署流程 1.web打包 2.关掉需要升级的运行中的服务 /microservice/hedgingcustomer-0.0.1-SNAPSHOT/conf/bin/ 执行脚本 sh shutdown.sh 3.解压文件 返回到/microservice 将升级包上传到该路径&#x…...
第八课 Vue中的v-bind指令
Vue中的v-bind指令 v-bind用于属性绑定,使得属性可以动态修改 v-bind动态修改class 动态修改的class名来源于data对象,而非手动给定 基础示例 <style>div{width: 100px;height: 100px;border: 3px solid #000;}.bg {background: red;}</sty…...
基于STM32的智能电能表设计
引言 本项目设计了一个基于STM32的智能电能表系统,能够实时测量家用电器的电压、电流、功率和电能消耗。该系统集成了电压电流传感器、显示屏、通信模块等,能够实现电能测量、数据显示、数据存储和远程传输功能,适用于家庭、工业等场景的电能…...
开启学习与探索之旅,自闭症学校全托为孩子打造温馨成长环境
原文指路:http://www.zibizhengwang.com/page33.html 在广州这座繁华都市的一隅,有一所特别的学校——星贝育园自闭症儿童寄宿制学校,它如同一座灯塔,照亮了自闭症儿童的学习与成长之路。在这里,每一个孩子都被视为独…...
多线程编程简单例题(3个线程) Linux环境 C语言实现
问题:编写程序完成如下功能:程序创建2个线程,然后: 1> 主线程先打印“I am main thread”,然后睡眠2秒后,打印"main thread wake up",主线程退出 2> 第一个新线程先打印“…...
UG NX12.0建模入门笔记:1.2 鼠标的基本操作
文章目录 前言:鼠标的操作1.鼠标左键:单击—>单选;长按并滑动—>框选。2.鼠标右键:在不同的地方单击弹出不同的菜单。3.鼠标中键:滚动中键—>放大缩小【镜头拉近拉远】。4.鼠标中键:摁住鼠标中键&…...
NVME盘未格式化导致Ubuntu20.04启动慢
背景 最近公司一款产品转产,工厂组装好后,用我提供的系统镜像烧录,系统起来后发现Ubuntu20.04转圈了90秒才进入图形界面,这是不可接受的,公司老总要求当天必须解决。 定位 分析syslog 看不到系统启动时的日志&…...
VSCode创建插件HelloWorld找不到指令解决办法
按照网上的教程执行yo code并且生成成功 但是F5打开调试新窗口后,ctrl shift P,输入helloworld并没有指令提示 原因:当前电脑安装的VSCode版本过低,不支持当前插件的使用(因为自动生成的插件总是默认使用最新版VSC…...
第20场 小白入门赛本场比赛为「蓝桥·算法双周赛」第二十场分级赛——小白入门赛
1. 四个亲戚【算法赛】 问题描述 风流倜傥的贾宝玉,拥有四个如花似玉的亲戚:林黛玉、薛宝钗、元春和迎春。这日,他们组团出国旅游了。为了方便称呼,宝玉给她们取了英文昵称,分别为:Daiyu、Baochai、Yuanchun 和Yingchun。但是&a…...
ESP32秒变双模调试器:一份代码实现有线DAP-LINK与无线WiFi调试自由切换
ESP32双模调试器实战:有线DAP-LINK与无线WiFi的智能切换方案 在嵌入式开发领域,调试工具的选择往往决定了开发效率的上限。传统调试方案通常需要在有线连接的高性能和无线调试的灵活性之间做出取舍,而ESP32芯片的出现为这个困境提供了全新的…...
AI 测试必修课:深入理解 LLM 的 Token、上下文与温度参数
一位资深测试工程师的血泪忠告:“你花三个月搭建的测试框架崩溃了——不是因为代码逻辑有bug,而是因为昨天 temperature 是 0 的时候模型输出是‘PASS’,今天同样的代码、同样的输入,模型说‘FAIL’。你以为温度设成 0 就稳了?天真。” 这是一篇写给 AI 测试工程师、LLM 应…...
别再乱设Public了!Minio权限控制实战:从用户、分组到自定义策略的完整配置流程
别再乱设Public了!Minio权限控制实战:从用户、分组到自定义策略的完整配置流程 在分布式存储系统的日常运维中,权限配置不当引发的数据泄露事件屡见不鲜。最近某科技公司因对象存储桶误设为公开访问,导致数万份客户资料暴露的案例…...
终极指南:HS2-HF_Patch汉化补丁完全免费使用手册
终极指南:HS2-HF_Patch汉化补丁完全免费使用手册 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为Honey Select 2的日文界面而烦恼吗ÿ…...
测试工程师必知的10个Linux命令:提升工作效率的利器
在软件测试领域,Linux系统是绕不开的重要工具。绝大多数应用后台都部署在Linux服务器上,从环境搭建、日志分析到性能监控,熟练掌握Linux命令能让测试工程师的工作效率大幅提升。不同职级的测试工程师对Linux的需求各有侧重:初级工…...
如何免费获得119,376个英语单词的标准发音MP3?终极发音库下载指南
如何免费获得119,376个英语单词的标准发音MP3?终极发音库下载指南 【免费下载链接】English-words-pronunciation-mp3-audio-download Download the pronunciation mp3 audio for 119,376 unique English words/terms 项目地址: https://gitcode.com/gh_mirrors/e…...
React Fiber vs Vue 响应式:从调用栈到依赖图,前端两大架构的底层对决
写在前面 前端框架之争吵了快十年。但坦白说,大多数争论卡在"React 好用还是 Vue 好用"的层面,很少有人真正追问:这两个框架为什么从根上就是两套东西? 它们的差异不是 API 设计喜好不同,而是对"UI 的…...
高性能Go Web框架Volo:设计原理、核心功能与生产实践
1. 项目概述:一个高性能的Go语言Web框架最近在折腾一个需要处理高并发请求的API服务,选型时又一次把目光投向了Go生态。说实话,Go的Web框架选择不少,从轻量级的Gin、Echo,到功能更全的Beego、Iris,各有各的…...
书匠策AI论文生存指南:降重降AIGC,2025届毕业生的“反内卷外挂“
🎬 开场:一场关于"论文能不能活着毕业"的生存实验 朋友们,今天咱不开学术讲座,咱开一场生存发布会。 2025年写毕业论文是什么体验?你辛辛苦苦码了两万字,满怀信心点了查重——好家伙࿰…...
从FLAN-T5到你的专属模型:如何用公司内部客服聊天记录做领域微调(附DialogSum实操对比)
从FLAN-T5到业务专属模型:领域微调实战指南 当通用大模型遇上垂直业务场景,性能落差往往令人沮丧。想象一个酒店预订客服场景:FLAN-T5可能把"我需要延迟入住"总结成"客户确认了入住时间",这种"幻觉"…...
