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主机上的存储位置)

Types of mounts and where they live on the Docker host


这篇我们主要学习数据卷

二、数据卷示例

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

image-20240529181720330

挂载在了相同宿主机目录到容器内的/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 !

image-20240529182703059

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

image-20240529183037863

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 -A

Database 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

image-20240529231724908

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
#之前创建好的容器不会有任何影响

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

移动端性能测试(android/ios)

solox官网 https://github.com/smart-test-ti/SoloX solox简介 实时收集android/ios性能的工具,Android设备无需Root,iOS设备无需越狱。有效解决Android和iOS性能的测试和分析挑战。 solox安装 环境准备 python安装3.10以上的 python官网下载地址…

CasaOS:开源家庭云系统安装

CasaOS是一个基于Docker生态系统的开源家庭云系统,专为家庭场景而设计。致力于打造全球最简单、最易用、最优雅的家居云系统。安装CasaOS可以给鲁班猫带来更好的局域网文件传输体验。 安装脚本 wget -qO- https://get.casaos.io | sudo bash软件截图

【论文复现|智能算法改进】基于自适应蜣螂算法的无人机三维路径规划方法

目录 1.UAV路径规划数学模型2.改进点3.结果展示4.参考文献5.代码获取 1.UAV路径规划数学模型 【智能算法应用】蜣螂优化算法DBO求解UAV路径规划 2.改进点 混沌序列初始化 在处理复杂的优化问题时,原始蜣螂算法采用随机生成种群的方法进行种群初始化,…

【Qt知识】Qt Creator快捷键

以下是Qt Creator中的一些常用快捷键列表(持续更新): 基本编辑 多行注释/取消多行注释: Ctrl /编译工程: Ctrl B运行工程: Ctrl R整行上移/下移: Ctrl Shift ↑/↓查找: Ctrl F函数声明和定义切换: F2向下查找: F3头文件和源文件切换:…

Docker安装Zookeeper(单机)

Docker安装Zookeeper(单机) 目录 Docker安装Zookeeper(单机)拉取镜像创建目录添加配置文件启动容器测试 拉取镜像 docker pull zookeeper创建目录 mkdir -p /data/zookeeper/data # 数据挂载目录 mkdir -p /data/zookeeper/conf…

03-树1 树的同构(浙大数据结构PTA习题)

03-树1 树的同构 分数 25 作者 陈越 单位 浙江大学 给定两棵树 T1​ 和 T2​。如果 T1​ 可以通过若干次左右孩子互换就变成 T2​,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G…

基于朴素贝叶斯算法的新闻类型预测,django框架开发,前端bootstrap,有爬虫有数据库

背景 在当今信息爆炸的时代,新闻内容的分类和预测对于用户个性化推荐和信息检索至关重要。基于朴素贝叶斯算法的新闻类型预测系统结合了机器学习和自然语言处理技术,能够根据新闻内容自动进行分类,提高新闻处理效率和准确性。采用Django框架…

Spring MVC 应⽤分层

什么是应用分层 引用分层是一种软件开发思想 将应用程序分为N个层次每个层次负责各个职责 其中MVC是常见的设计模式这就是应用分层的具体体现 目前主流的开发方式是前后段分离后端开发工程师不再需要关注前端的实现,对此就需要分为表现层,数据层,业务逻…

RxSwift - 实现一个MVVM架构的TableView

文章目录 RxSwift - 实现一个MVVM架构的TableView前沿MVVM架构的Tableview目录结构1、模型(Model)2、视图模型(ViewModel)3、视图(View) 界面效果 RxSwift - 实现一个MVVM架构的TableView 前沿 MVVM架构在…

IBM开源Granite Code模型,多尺寸可选,支持多种代码任务,性能媲美 CodeLlama

前言 近年来,大型语言模型(LLM)在代码领域展现出惊人的潜力,为软件开发流程带来了革命性的改变。代码 LLM 不仅能够生成高质量代码,还能帮助程序员修复错误、解释代码、编写文档等等,极大地提高了软件开发…

MyBatis通用Mapper:简化数据库操作的利器

引言 在软件开发中,数据库操作是不可或缺的一部分。通常我们会使用mybatis,的MBG插件,自动生成表对应的基本操作语句xml。 当我们的表字段发生变化的时候,我们需要修改实体类和Mapper文件定义的字段和方法。如果是增量维护&…

为何ICLR未能进入CCF推荐期刊会议列表?

会议之眼 快讯 最近小编在思考一个问题:ICLR(International Conference on Learning Representations)即国际学习表征会议自2013年诞生以来,ICLR以其开放的学术氛围、创新的研究议题和前沿的科学探索,迅速成为AI领域不…

【工具】 MyBatis Plus的SQL拦截器自动翻译替换“?“符号为真实数值

【工具】 MyBatis Plus的SQL拦截器自动翻译替换"?"符号为真实数值 使用MyBatis的配置如下所示: mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl调用接口,sql日志打印如下: 参数和sql语句不…

苏州金龙新V系客车科技助力“粤”动广州

粤动活力新V系! 5月23日,苏州金龙新V系智慧客车推介会在羊城广州举行。活动现场展出了4款新V系代表车型,来自广东省旅游客运、道路运输行业的200余位从业者齐聚一堂,共同品鉴、体验了苏州金龙新V系产品的“新、心、芯”魅力。苏州…

Perplexity 搜索引擎刚刚推出了新的页面功能——维基百科可以扔了

Perplexity 允许用户根据搜索结果创建自定义页面 人工智能搜索引擎初创公司 Perplexity 推出了一项新功能,使其结果更具粘性,允许用户将研究转变为易于共享的页面。页面建立在 Perplexity 中现有的人工智能驱动的搜索功能之上,该功能使用与 …

Artifactory清理二进制文件丢失的制品

一、摘要 当制品上传到 Artifactory 时,Artifactory 会在数据库中记录制品的相关元数据信息,包括文件路径、大小、校验和(如 MD5、SHA1)、上传时间、索引、依赖等。实际的制品二进制文件会存储在指定的存储后端,具体的…

【NumPy】掌握NumPy的divide函数:执行高效的数组除法操作

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

2年go蓝炎科技、爱诗科技面试经历,期望薪资22K

广州蓝炎科技一面 1、简单自我介绍?用的什么技术栈? 2、go的map是线程安全的吗? 3、Channel一般会在什么场景下使用?往一个未初始化的channel发送数据,会怎样? 4、关于go里头的随机数是线程安全的吗&am…

不同厂商SOC芯片在视频记录仪领域的应用

不同SoC公司芯片在不同产品上的应用信息: 大唐半导体 芯片型号: LC1860C (主控) LC1160 (PMU)产品应用: 红米2A (399元)大疆晓Spark技术规格: 28nm工艺,4个ARM Cortex-A7处理器,1.5GHz主频,2核MaliT628 GPU,1300万像…

基于51单片机多功能防盗报警proteus仿真( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机多功能防盗报警系统 1. 主要功能:2. 讲解视频:3. 仿真4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单&&下载链接 基于51单片机多功能防盗报警系统( proteus仿真程序设计报告原理图讲解视频) 仿真图proteus8.9及以上…