Docker的数据管理(数据卷+数据卷容器)

news2024/11/25 3:49:16

文章目录

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

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

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

相关文章

DBeaver连接Oracle报错:ORA-12514

Listener refused the connection with the following error:ORA-12514, TNS:listener does not currently know of service requested inconnect descriptor ———————————————— 1.报错信息2.配置正确结语 ———————————————— 如果是第一次连接Or…

「51媒体」媒体邀约全攻略

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体邀约全攻略可以概括如下,以确保流程的清晰性和完整性: 一、前期准备 明确目标:清晰定义活动的目标,例如增加曝光度、提高知名度、塑造…

FinalShell 配置SSH密钥登陆

转载请标明出处:http://blog.csdn.net/donkor_/article/details/139355489 文章目录 前言生成密钥服务器配置公钥本地配置私钥存储私钥FinalShell配置 总结 前言 本机FinalShell 配置SSH密钥登陆服务器,这样就不再需要使用密码进行登陆了。由于FinalSh…

【2024新版】银系统源码/超市收银系统/智慧新零售/ERP进销存管理/线上商城/商户助手

>>>系统简述:本系统适用于超吃便利店,美妆母婴行业,服装鞋帽行业,食品零售行业,3C数码电子行业,食品生鲜等一切零售行业,产品功能角色介绍如下 合伙人:无限发展代理商和商…

说明白计算机网络之TCP的流量控制与拥塞控制之慢开始算法与拥塞避免算法

TCP的流量控制 利用滑动窗口实现流量控制 设A向B发送数据,连接建立时候,B告诉A自身的接收窗口大小,A的发送窗口大小不能超过接收方B的窗口大小 流量控制:发送方发送速率不要太快,要让接收方来得及接收。窗口大小的单…

相对论真的很难理解吗?其实一点也不难,原理就在你我身边!

相对论,一个听起来就充满神秘色彩的名词,它在科学界的地位举足轻重,被誉为现代物理的基石。或许你并不了解相对论,但大概率应该听说过。 不过对于大多数人来说,相对论似乎总是笼罩在一层难以穿透的迷雾之中&#xff0c…

未来工厂新篇章:大型工厂3D可视化技术引领工业新潮流

在科技日新月异的今天,大型工厂不再是我们印象中机器轰鸣、尘土飞扬的钢铁丛林,而是变成了智慧与效率并存的现代化生产中心。这一切的改变,都离不开一项革命性的技术——3D可视化。 一、何为大型工厂3D可视化? 大型工厂3D可视化&…

VRTK4.0学习——(一)

此开发基于Unity 6000.0.0f1 1.导入VRTK v4 Tilia Package Importer.unitypackage包 2.在PackManager中查看配置是否正确 3.点击 Window→Tilia→Package Importer 打开面板后点击 Add Scoped Registry 4.首先我们先将CameraRigs导入,CameraRigs中主要是启动VR头盔的功能&…

Web前端三大主流框:React、Vue 和 Angular

在当今快速发展的 Web 开发领域,选择合适的前端框架对于项目的成功至关重要。React、Vue 和 Angular 作为三大主流前端框架,凭借其强大的功能和灵活的特性,赢得了众多开发者的青睐。本文将对这三大框架进行解析,帮助开发者了解它们…

达梦数据库写文件的方式探索

0x01 前沿 这篇文章整体算是《达梦数据库手工注入笔记》的续集,达梦作为国内优秀的信创数据库,在关基单位中拥有越来越大的用户使用量。 通过SQL注入来写文件一直以来都是SQL注入漏洞深入利用的一种方式,对于不同的数据库通常写文件的方式也是…

Check Point 安全网关任意文件读取漏洞复现(CVE-2024-24919)

Check Point 安全网关任意文件读取漏洞复现(CVE-2024-24919) 1.漏洞描述 Check Point Security Gateways 是 Check Point Sofware 提供的一系列 网络安全Q解决方案。这些解决方案包括下一代防火墙(NGFW)、数据中心安全网关和 A1驱动的量子网关,旨在为企业提供针对…

【自然语言处理】Transformer中的一种线性特征

相关博客 【自然语言处理】【大模型】语言模型物理学 第3.3部分:知识容量Scaling Laws 【自然语言处理】Transformer中的一种线性特征 【自然语言处理】【大模型】DeepSeek-V2论文解析 【自然语言处理】【大模型】BitNet:用1-bit Transformer训练LLM 【自…

【RuoYi】实现二级页面跳转

一、前言 在我们写项目的时候,很多时候都会用到二级页面的跳转,RuoYi框架中也不例外,RuoYi虽然前端用的是vue,但是因为其有权限设置,在实现二级页面跳转的时候和普通的页面跳转有所区别,博主这里进行记录&a…

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

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

LeetCode-47 全排列Ⅱ

LeetCode-47 全排列Ⅱ 题目描述解题思路代码说明 题目描述 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 : 输入:nums [1,1,2]输出: [[1,1,2], [1,2,1], [2,1,1]] b站题目解读讲的不好&…

【机器学习】Transformer模型大小与性能探究

Transformer模型大小与性能:不仅仅是尺寸的问题 一、Transformer模型的挑战二、经验标度定律的局限性三、记忆过程与性能动态五、结论与展望 在人工智能和机器学习的领域里,模型的大小与性能之间的关系一直是研究人员关注的焦点。然而,最近的…

CUDA学习(2)

什么是CUDA CUDA(Compute Unified Device Architecture),统一计算设备架构,英伟达推出的基于其GPU的通用高性能计算平台和编程模型。 借助CUDA,开发者可以充分利用英伟达GPU的强大计算能力加速各种计算任务。 软件生…

下载安装node.js,查看node.js版本

目录 一、下载安装node.js 二、查看node.js版本 三、使用nvm管理node.js版本 一、下载安装node.js 文档 nodejs中文网•学习教程•入门•如何安装 Nodejshttps://nodejs.cn/en/learn/getting-started/how-to-install-nodejs 步骤 1.进入node.js官网 nodejshttps://nodejs.…

解决:写路由文件时引入页面路径没有提示

1、首先安装插件: Path Autocomplete 2、配置settings.json 文件 复制下面代码到settings.json配置文件中: "path-autocomplete.pathMappings": {"": "${folder}/src/","views": "${folder}/src/views/&…

Python考试复习---day5

1.打印商品名 ainput().split() print("商品列表:") for i,name in enumerate(a):print("{}\t{}".format(i,name))enumerate----枚举--利用它可以同时获得索引和值 enumerate多用于在for循环中得到计数 例如: list1 ["这&qu…