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

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镜像是分层设计的&#xff0c;镜像出只读&#xff0c;通过镜像启动的容器添加一层可读写的文件系统&#xff0c;用户写入的数据表都保存在这层中。 容器的数据分层目录 LowerDir&#xff1a;image 镜像层&#xff0c;即镜像本身&#xff0c;制度 UpperDir&#xff1a;容…...

【ios】使用TestFlight将app分发给测试人员(超详细)

我的环境&#xff1a; macos系统是Ventura 13.0 xcode是14.2&#xff08;后面发现至少需要15版本的xcode才能上传app&#xff09; 证书生成 可以通过xcode生成Distribution类型的证书&#xff0c;如果你已经有的话那就忽略&#xff0c;这个证书也是备案时所需的。 我是已…...

证件照小程序源码,前后端稳定运行

演示&#xff1a;证寸照制作 运行环境: Linux Nginx PHP >5.6 MySQL>5.6 安装步骤: 1.下载源码上传至你的服务器宝塔面板 2.直接添加站点选择源码目录&#xff0c;新建数据库 3.设置代码执行目录为/web 4.在浏览器中输入你的域名&#xff0c;会提示安装&#xff0c;填写…...

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

一、企业内部网络架构 在一个中型企业中&#xff0c;通常会有以下的网络架构&#xff1a; - 核心层&#xff1a;由高性能的核心交换机组成&#xff0c;负责快速转发大量数据。例如采用具有高带宽和冗余功能的三层交换机&#xff0c;确保整个网络的稳定运行。它连接着各个部门的…...

无人机之室内定位技术篇

无人机的室内定位技术是实现无人机在室内环境中精准导航和定位的关键技术。由于室内环境复杂&#xff0c;卫星导航系统&#xff08;如GPS&#xff09;无法提供有效的信号&#xff0c;因此需要依赖其他室内定位技术。 一、主要技术类型 基于视觉的定位技术 原理&#xff1a;利…...

在ubuntu20.04中输入不存在shell命令时,报错ModuleNotFoundError的解决方案

这个问题出现过好几次&#xff0c;每次都比较困扰&#xff0c;以下的解决方案比较适合&#xff1a; 当我输入ubuntu无法识别的命令的时候&#xff0c;正常来说应该提示类似于 command not found 之类的字眼&#xff0c;但是系统确报了如下错误&#xff1a; Traceback (most r…...

互联网语言 互联网开发 互联网架构

JAVA和PHP是两种广泛应用于互联网开发的编程语言&#xff0c;它们在多个维度上展现出显著的不同。 JAVA是一种面向对象的编程语言&#xff0c;以其严谨、高效的特性而著称。JAVA的语法结构复杂且规范&#xff0c;强调封装、继承和多态等面向对象原则&#xff0c;适合构建大型企…...

解决MybatisPlus updateById更新数据时将没传的数据也更新成了null

首先&#xff0c;MybatisPlus在调用自带的更新接口updateById时&#xff0c;如果没加任何配置&#xff0c;默认是不会将前端没传的数据也更新成null的。即MyBatisPlus不会更新传入实体中为null的字段&#xff0c;只会更新设置了不为null的值。 如果发现没传的也更新成null了的话…...

OpenWRT 和 Padavan 路由器配置网络打印机 实现远程打印

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 之前有给大家介绍过 Armbian 安装 CUPS 作为打印服务器&#xff0c;像是 N1 盒子、玩客云&#xff0c;甚至是随身 WiFi 都可以通过 CUPS 来进行打印。但是有些朋友不想专门为打印机添置一个设备&#xff0…...

R语言机器学习教程大纲

文章目录 介绍机器学习算法监督学习Supervised Learning分类Classification回归Regression 无监督学习 Unsupervised Learning聚类 Clustering降纬 Dimensionality Reduction相关Association 强化学习Reinforcement Learning模型自由 Model-Free Methods模型驱动 Model-Based M…...

java如何部署web后端服务

java如何部署web后端服务 简单记录一下&#xff0c;方便后续使用。 部署流程 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用于属性绑定&#xff0c;使得属性可以动态修改 v-bind动态修改class 动态修改的class名来源于data对象&#xff0c;而非手动给定 基础示例 <style>div{width: 100px;height: 100px;border: 3px solid #000;}.bg {background: red;}</sty…...

基于STM32的智能电能表设计

引言 本项目设计了一个基于STM32的智能电能表系统&#xff0c;能够实时测量家用电器的电压、电流、功率和电能消耗。该系统集成了电压电流传感器、显示屏、通信模块等&#xff0c;能够实现电能测量、数据显示、数据存储和远程传输功能&#xff0c;适用于家庭、工业等场景的电能…...

开启学习与探索之旅,自闭症学校全托为孩子打造温馨成长环境

原文指路&#xff1a;http://www.zibizhengwang.com/page33.html 在广州这座繁华都市的一隅&#xff0c;有一所特别的学校——星贝育园自闭症儿童寄宿制学校&#xff0c;它如同一座灯塔&#xff0c;照亮了自闭症儿童的学习与成长之路。在这里&#xff0c;每一个孩子都被视为独…...

多线程编程简单例题(3个线程) Linux环境 C语言实现

问题&#xff1a;编写程序完成如下功能&#xff1a;程序创建2个线程&#xff0c;然后&#xff1a; 1> 主线程先打印“I am main thread”&#xff0c;然后睡眠2秒后&#xff0c;打印"main thread wake up",主线程退出 2> 第一个新线程先打印“…...

UG NX12.0建模入门笔记:1.2 鼠标的基本操作

文章目录 前言&#xff1a;鼠标的操作1.鼠标左键&#xff1a;单击—>单选&#xff1b;长按并滑动—>框选。2.鼠标右键&#xff1a;在不同的地方单击弹出不同的菜单。3.鼠标中键&#xff1a;滚动中键—>放大缩小【镜头拉近拉远】。4.鼠标中键&#xff1a;摁住鼠标中键&…...

NVME盘未格式化导致Ubuntu20.04启动慢

背景 最近公司一款产品转产&#xff0c;工厂组装好后&#xff0c;用我提供的系统镜像烧录&#xff0c;系统起来后发现Ubuntu20.04转圈了90秒才进入图形界面&#xff0c;这是不可接受的&#xff0c;公司老总要求当天必须解决。 定位 分析syslog 看不到系统启动时的日志&…...

VSCode创建插件HelloWorld找不到指令解决办法

按照网上的教程执行yo code并且生成成功 但是F5打开调试新窗口后&#xff0c;ctrl shift P&#xff0c;输入helloworld并没有指令提示 原因&#xff1a;当前电脑安装的VSCode版本过低&#xff0c;不支持当前插件的使用&#xff08;因为自动生成的插件总是默认使用最新版VSC…...

第20场 小白入门赛本场比赛为「蓝桥·算法双周赛」第二十场分级赛——小白入门赛

1. 四个亲戚【算法赛】 问题描述 风流倜傥的贾宝玉&#xff0c;拥有四个如花似玉的亲戚:林黛玉、薛宝钗、元春和迎春。这日&#xff0c;他们组团出国旅游了。为了方便称呼&#xff0c;宝玉给她们取了英文昵称&#xff0c;分别为:Daiyu、Baochai、Yuanchun 和Yingchun。但是&a…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...