docker 数据管理,数据持久化详解 一

news2024/10/23 2:54:23

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:停止并删除容器,但命名数据卷中的文件仍然保留。

重新启动容器:再次启动容器时,使用相同的命名数据卷,文件仍然存在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2221253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何选择合适的电感器来匹配感性负载?

在匹配感性负载时&#xff0c;选择合适的电感器是至关重要的。电感器的主要作用是抑制电流变化&#xff0c;从而维持电路的稳定性。为了确保电路的稳定运行&#xff0c;需要考虑以下因素&#xff1a; 1. 电流和电压&#xff1a;首先&#xff0c;需要确定电感器的额定电流和额定…

GJS-WCP

不懂的就问&#xff0c;但我也是二把手......哭死 web GJS-ezssti 很常规的ssti模板注入&#xff0c;只过滤了"/","flag"。 过滤了/,flag 可以利用bash的特性绕过&#xff0c;如字符串截取&#xff0c;环境变量等等。payload1: {{url_for.__globals__[…

【uniapp】微信小程序使用echarts图表记录

1、插件引入 在Dcloud插件市场下载echarts插件&#xff1a;插件地址 或去相关代码库下载js&#xff1a;gitee地址 将static文件夹下中的echarts.min.js和ecStat.min.js复制到自己项目的static文件夹内或到echarts官方定制自己需要的图表类型下载js文件并放入相关目录。echart…

让你的 IDEA 使用更流畅 | IDEA内存修改

随着idea使用越来越频繁&#xff0c;笔者最近发现使用过程中有时候会出现卡顿现象&#xff0c;例如&#xff0c;启动软件变慢&#xff0c;打开项目的速度变慢等&#xff1a; 因此如果各位朋友觉得最近也遇到了同样的困惑&#xff0c;不妨跟着笔者一起来设置IDEA的内存大小吧~ …

【C#】在 WinForms 中使用 MVVM(Model-View-ViewModel) 设计模式

结合当前的 DevExpress 项目&#xff0c;在 WinForms 中使用 MVVM&#xff08;Model-View-ViewModel&#xff09; 设计模式。这个例子将通过数据绑定、命令绑定来展示 MVVM 模式的运用。 1. 项目结构 假设我们要实现一个简单的应用程序&#xff0c;它有一个文本框和一个按钮&…

【C++指南】类和对象(四):类的默认成员函数——全面剖析 : 拷贝构造函数

引言 拷贝构造函数是C中一个重要的特性&#xff0c;它允许一个对象通过另一个已创建好的同类型对象来初始化。 了解拷贝构造函数的概念、作用、特点、规则、默认行为以及如何自定义实现&#xff0c;对于编写健壮和高效的C程序至关重要。 C类和对象系列文章&#xff0c;可点击下…

【计网】理解TCP全连接队列与tcpdump抓包

希望是火&#xff0c;失望是烟&#xff0c; 生活就是一边点火&#xff0c;一边冒烟。 理解TCP全连接队列与tcpdump抓包 1 TCP 全连接队列1.1 重谈listen函数1.2 初步理解全连接队列1.3 深入理解全连接队列 2 tcpdump抓包 1 TCP 全连接队列 1.1 重谈listen函数 这里我们使用…

【JAVA】第三张_Eclipse下载、安装、汉化

简介 Eclipse是一种流行的集成开发环境&#xff08;IDE&#xff09;&#xff0c;可用于开发各种编程语言&#xff0c;包括Java、C、Python等。它最初由IBM公司开发&#xff0c;后来被Eclipse Foundation接手并成为一个开源项目。 Eclipse提供了一个功能强大的开发平台&#x…

IDEA如何查看所有的断点(Breakpoints)并关闭

前言 我们在使用IDEA开发Java应用时&#xff0c;基本上都需要进行打断点的操作&#xff0c;这方便我们排查BUG&#xff0c;也方便我们查看设计的是否正确。 不过有时候&#xff0c;我们不希望进入断点&#xff0c;这时候除了点击断点关闭外&#xff0c;有没有更快速的方便关闭…

深度解析机器学习的四大核心功能:分类、回归、聚类与降维

深度解析机器学习的四大核心功能&#xff1a;分类、回归、聚类与降维 前言分类&#xff08;Classification&#xff09;&#xff1a;预测离散标签的艺术关键算法与代码示例逻辑回归支持向量机&#xff08;SVM&#xff09; 回归&#xff08;Regression&#xff09;&#xff1a;预…

HarmonyOS Next应用开发——图像PixelMap变换

【高心星出品】 图像变换 图片处理指对PixelMap进行相关的操作&#xff0c;如获取图片信息、裁剪、缩放、偏移、旋转、翻转、设置透明度、读写像素数据等。图片处理主要包括图像变换、位图操作&#xff0c;本文介绍图像变换。 图形裁剪 // 裁剪图片 x&#xff0c;y为裁剪的起…

impdp+remap_schema导入后登录报ORA-01017: Invalid Username/password

环境说明&#xff1a;有个11.2.0.4的rac数据库&#xff0c;现需要把USR_OA克隆一份出来做测试&#xff0c;新用户名是TEST_OA&#xff0c;直接是expdp导出用户&#xff0c;再用impdpremap_schema生成TEST_OA&#xff0c; 业务人员使用PLSQL(版本12.0.1.1814) 登录TEST_OA时总…

Python程序设计 内置函数 日志模块

logging(日志) 日志记录是程序员工具箱中非常有用的工具。它可以帮助您更好地理解程序的流程&#xff0c;并发现您在开发过程中可能没有想到的场景。 日志为开发人员提供了额外的一组眼睛&#xff0c;这些眼睛不断关注应用程序正在经历的流程。它们可以存储信息&#xff0c;例…

ShardingProxy服务端分库分表

目录 一、为什么要有服务端分库分表&#xff1f; 二、ShardingProxy基础使用 1、部署ShardingProxy 2、配置常用分库分表策略 三、ShardingSphere中的分布式事务机制 1、什么是XA事务&#xff1f; 2、实战理解XA事务 3、如何在ShardingProxy中使用另外两种事务管理器&a…

【不要离开你的舒适圈】:猛兽才希望你落单,亲人总让你回家,4个维度全面构建舒适圈矩阵

单打独斗的英雄时代已经落幕 抱团取暖才是社会寒冬的良策 自然界中&#xff0c;每个物种都占据着自己的领地和生存空间。 生态位的差异决定了它们的生存方式&#xff0c;一旦离开领地&#xff0c;失去群体的庇护&#xff0c;就会沦为野兽的美餐。 人类社会同样存在隐形圈层…

数仓建模:金字塔原理在数仓建模分析中的应用

目录 1 金字塔原理 1.1 金子塔原理基本原理 1.2 金字塔内部结构 2 如何构建金字塔 2.1 金字塔塔尖构建 2.2 金字塔纵向层次构建 2.3 金字塔横向关系构建 2.3.1 归类分组 2.3.2 逻辑递进 2.4 小结 3 金字塔原理应用 3.1 数仓建模 3.1.1 数仓建模分析方法-自上而下…

OBOO鸥柏:液晶拼接大屏搭载节点盒分布式集中管控控制系统新技术

近年来&#xff0c;随着视频监控、会议系统及展示需求的快速增长&#xff0c;KVM分布式输入输出节点控制系统在各大行业中逐渐成为核心技术。OBOO鸥柏的液晶拼接大屏分布式输入输出节点控制系统&#xff08;WControl&#xff09;&#xff0c;以其创新的技术和卓越的用户体验&am…

在线刷题系统测试报告

一、项目背景 1. 本项目是一个在线刷题系统&#xff0c;灵感来源于力扣和牛客等刷题平台&#xff0c;旨在锻炼自己的代码能力和剖析系统整体结构与各模块之间关系的能力。系统支持用户注册与登录&#xff0c;查看题目列表与题目详情&#xff0c;在线提交代码并提供反馈。 2. 该…

【命令操作】信创终端系统上timedatectl命令详解 _ 统信 _ 麒麟 _ 方德

原文链接&#xff1a;【命令操作】信创终端系统上timedatectl命令详解 | 统信 | 麒麟 | 方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于如何在信创终端系统上使用timedatectl命令的详细介绍。timedatectl 是Linux系统中非常实用的时间管理工具&#xff0c;…

JMeter模拟并发请求

PostMan不是严格意义上的并发请求工具&#xff0c;实际是串行的&#xff0c;如果需要测试后台接口并发时程序的准确性&#xff0c;建议采用JMeter工具。 案例&#xff1a;JMeter设置20个并发卖票请求&#xff0c;查看后台是否存在超卖的情况 方式一&#xff1a;一共10张票&…