知识点9--Docker容器的数据卷

news2024/9/23 5:18:08

我前面介绍容器命令的时候,最后说过一个cp命令,可以把容器和宿主机之间的文件互相拷贝,保证数据的持久化,但是这种持久化偏向于比较独立完整的文件,大家有没有想过如果遇到成体系的数据保存,比如我整个数据库的落盘,这些我直接cp命令,可能会出现问题的文件,那怎么办?就算不出现问题,一个数据库的数据就靠cp命令,现实吗?此时就用到了数据卷。或者说它可以让容器自己把数据在生成的同时持久化到宿主机上。同样的既然数据可以从容器直接进入宿主机,同理其他容器之间也可以通过这样的机制共享某个数据。

总结的说,数据卷就是让某个目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

因此数据卷的特点如下:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接生效
3;数据卷中的更改不会包含在镜像的更新中,就是不会被commit打包进去,因为它也属于运行数据的一种,上一篇知识点的用例也体现了,commit不受运行数据的影响
4:数据卷的生命周期一直持续到没有容器使用它为止


容器添加数据卷有两种方式。

方式一:在创建容器的时候,你可以用-v参数添加容器卷

docker run -it -v 宿主机路径:容器路径 镜像名

比如我将我先前安装Oracle的包共享到容器去

[root@hdp3 opt] cd wy/
[root@hdp3 wy] ll
总用量 2295604
drwxr-xr-x. 8 root root       4096 8月  21 2009 database
-rw-r--r--. 1 root root 1239269270 10月  6 19:05 linux.x64_11gR2_database_1of2.zip
-rw-r--r--. 1 root root 1111416131 10月  6 20:27 linux.x64_11gR2_database_2of2.zip
[root@hdp3 wy] docker run -it -v /opt/wy:/opt/wy centos
[root@6f1543b2044e /] ls -l
total 48
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  360 Dec  6 10:31 dev
drwxr-xr-x   1 root root 4096 Dec  6 10:31 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   1 root root 4096 Dec  6 10:31 opt
dr-xr-xr-x 142 root root    0 Dec  6 10:31 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Dec  6 10:31 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var
[root@6f1543b2044e /] cd /opt/
[root@6f1543b2044e opt] ls
wy
[root@6f1543b2044e opt] cd wy/
[root@6f1543b2044e wy] ls
database                           linux.x64_11gR2_database_2of2.zip
linux.x64_11gR2_database_1of2.zip

添加共享卷的时候并不一定需要容器内部和宿主机两者存在对应的路径,其实就和插进去一块盘一样,且默认对数据卷拥有读写权限。

你还可以通过查看容器结构,来确定数据卷。
在这里插入图片描述
在这里插入图片描述
这里说一个注意点,老版本的docker中,容器拥有数据卷的写权限时,主路径是可以删除的,就比如本例中的/opt/wy这个文件夹的本身是可以删除的,但是在新版本的docker中最多只能删除其内部的所有文件,而不能删除主路径本身

[root@6f1543b2044e opt] cd wy/
[root@6f1543b2044e wy] ls
database                           linux.x64_11gR2_database_2of2.zip
linux.x64_11gR2_database_1of2.zip
[root@6f1543b2044e wy] cd /opt/
[root@6f1543b2044e opt] ls
wy
[root@6f1543b2044e opt] rm -rf *
rm: cannot remove 'wy': Device or resource busy  ###不让你删除主路径###
[root@6f1543b2044e opt] ls
wy
[root@6f1543b2044e opt] cd wy/
[root@6f1543b2044e wy] ls -l
total 0

言归正传,有的时候,数据卷对应的宿主机路径不会让你有写的权限,因此可以运行如下命令,:ro表示只读,默认:rw

docker run -it -v 宿主机路径:容器路径:ro 镜像名

如果你需要挂载多个数据卷,则要输入多个-v,而不是在一个-v后写

说明老版本docker,极端的时候,run命令-v挂载数据卷后访问会报错cannot open directory:Permission denied,这就需要加上--privileged=true这个参数,但新版本我还没有遇到出现这个问题。

方式二:DockerFile方式添加数据卷,这里先声明,DockerFile是一个完整的docker知识点,后面会开单章介绍,这里就先知道怎么用它添加数据卷就行。

特别说明!!!!!!DockerFile方式添加数据卷有个很鬼畜的事情,后面会说

你要改DockerFile,你总要知道它什么样吧?你就需要在官网上找到你下载的镜像,https://hub.docker.com/,比如我之前下载的tomcat镜像,随后在详情中你就可以看到官方的帮助文档,根据下载的镜像中含有的tomcat版本去找一个相近的DockerFile帮助,因为并不一定每个版本单独建一个。
在这里插入图片描述
随后会跳转到github上,内容看不懂没关系,后面会开一个单章介绍这里面的东西,你现在最多只需要知道每一个docker镜像一定有它对应的DockerFile,DockerFile中的内容是对该镜像的描述,它就和JAVA的class文件一样,在docker中DockerFile从逻辑上来说不可能单独存在,因为它的目的就是用来描述一个要生成的镜像,如果没有对应的镜像,则它本身也就没有了存在的价值。
在这里插入图片描述
当然上面这些只是让你找到这是个什么东西,下面我们准备一个文件,名字随意,不一定非要叫DockerFile,比如叫myfile

[root@hdp3 wy] vi myfile
FROM centos
VOLUME ["/opt/myfile/test01","/opt/myfile/test02"]
CMD echo "OK!!!!"
CMD /bin/bash
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
"myfile" [New] 4L, 95C written
[root@hdp3 wy] ll
总用量 4
-rw-r--r-- 1 root root 95 12月  6 21:02 myfile

这里由于已经用到了,所以先说两个VOLUME用来描述镜像中数据卷路径的,它不涉及宿主机的,应为宿主机存在可变性。FROM用来描述镜像的基础镜像是谁。CMD可以用来执行一个命令。就先知道这么多即可。

现在我们就用这个文件build生成一个镜像,用到的命令如下,注意末尾有个.,而且如你的DockerFile文件名就叫DockerFile,且你处于它所在的路径下,则可以不用-f参数,但不推荐这样用,保不住会出意外

docker build -f 你自己的DockerFile -t 镜像名 .
[root@hdp3 wy] docker build -f /opt/wy/myfile -t wy/centos .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["/opt/myfile/test01","/opt/myfile/test02"]
 ---> Running in 4b6880c91d0f
Removing intermediate container 4b6880c91d0f
 ---> 4bffb4a9ad2c
Step 3/4 : CMD echo "OK!!!!"
 ---> Running in 44edd9f7322e
Removing intermediate container 44edd9f7322e
 ---> 51a76bdc475f
Step 4/4 : CMD /bin/bash
 ---> Running in 8295fe0b4243
Removing intermediate container 8295fe0b4243
 ---> f605952bf91a
Successfully built f605952bf91a
Successfully tagged wy/centos:latest

[root@hdp3 wy] docker images
REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
wy/centos          latest    f605952bf91a   34 seconds ago   231MB
atguigu/mytomcat   1.2       4f6fc450f49c   4 hours ago      680MB
tomcat             latest    fb5657adc892   11 months ago    680MB
centos             latest    5d0da3dc9764   14 months ago    231MB

此时就可以再提一嘴前面知识点的内容,在镜像命令的时候,search一个镜像结果最后一项的AUTOMATED就表示该镜像是否是被build出来的。

现在我们就需要用这个build出来的镜像生成一个容器,看一下它是否自带我们指定的VOLUME ["/opt/myfile/test01","/opt/myfile/test02"]这两个数据卷路径

[root@hdp3 wy] docker run -it wy/centos
[root@4ad2a19c71db /] cd /opt  
[root@4ad2a19c71db opt] ls
myfile
[root@4ad2a19c71db opt] cd myfile/
[root@4ad2a19c71db myfile] ls
test01  test02

但是此时就出现一个问题,我们-v添加数据卷的时候就可以指定宿主机对应的路径,但是DockerFile由于官方考虑到镜像的宿主机有不确定因素,所以只能只能镜像中的数据卷路径,那宿主机上的路径怎么办呢?这个不要慌,因为docker会给一个默认路径,我们查看容器的结构信息就行

这个时候我上面说的很鬼畜的事情就要发生了 ----------------

当你想要打开容器中的数据卷的时候,会提示你,该目录打不开,由于我本人,在工作中使用docker挂载数据卷的时候一般都是直接-v,基本不用dockerfile,所以写本篇博文的时候,我用的docker版本较新,我有印象的用dockerfile做数据卷还是2018年,所以我在网上查了一下,才发现较新的docker中已经不再是直接生成数据卷,并挂载一个宿主机默认路径了,而是只生成一个挂载点,你想用它,只能是在run的时候-v


所以最后的总结一下,你就当做添加数据卷只能-v,DockerFile是除了commit第二种生成镜像方式中添加默认挂载点的就行。其实个人的看法想一想dockerfile,它的主体功能导致他确实不适合用来直接挂载数据卷这个操作,因为它本身是用来生成镜像的,而老版本的不足加上网上有好多通过它操作添加数据卷的文献,抛开会不会出问题,单说这种操作就和它存在的意义相背驰。

最后一定有人疑惑,run是新生成一个容器,那怎么给已有的容器添加数据卷,我很抱歉的告诉你,截至我目前操作的最新版,也就是20.10.21版本,通通不支持给已有容器添加数据卷,但是你可以试一试在已有的数据卷中,操作宿主机这一侧的路径,在里面直接挂载新磁盘

至于已有的容器添加数据卷,我尝试去改容器的配置文件,发现行不通,随着容器的重启,配置文件的相关内容就复原了。

除非某天你遇到了实在没办法的情况,在深思熟虑后,确保不会影响其他的东西,你再通过dockerfile把当前容器整体打包成一个新的镜像去新增挂载点的方式,把你所需要的数据卷挂载上去。但是这种情况即使真的发生了,也完全用不到doctorfile,因为docker file是直接操作基础镜像,没有容器的事,所以真的发生这种情况,你完全可以在容器里commit。

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

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

相关文章

精彩数据:2021年我国民旅客周转量6530亿公里,审定受理飞机2803架

2021年是特殊的一年,全体民航成员在努力克服疫情防控、经营亏损、安全压力等困难交织叠加的影响下,切实的推动了民航的高质量发展,再各项工作上都取得了较好的成绩。下面是小编使用可视化互动平台对民航发展统计报告进行报表数据处理分析后得…

超市商城小程序开发,在线盈利途径

随着消费意识的提高和零售业的不断升级,小程序已经成为目前重要的线上发展形势之一且具有很强的发展活力,在此发展机遇下,很多企业开始布局线上渠道,进入电商行业。超市作为日常生活中最常见、数量最多的线下门店,当然…

[基因遗传算法]原理思想和python代码的结合理解之(一) :单变量

读《遗传算法的Python实现(通俗易懂)》佳文的思考与笔记整理. 我们拥有一个目标函数y10⋅sin(5x)7⋅cos(4x)y10 \cdot sin(5x)7\cdot cos(4x)y10⋅sin(5x)7⋅cos(4x) def aim(x):return 10*np.sin(5*x)7*np.cos(4*x)约束范围(这里是定义域):x∈[0,5]x \…

如何选择分度带(中央子午线)

如何选择分度带(中央子午线) 发布时间:2018-01-17 版权: 同步视频教程:如何选择中央子午线或者分度带 播放 什么是中央子午线? 什么是分度带? 【百度百科】 第一步:查看你所下载(或者要套合的范围)的图像的经纬…

盘点| 爆款小游戏的开发引擎

微信推出小游戏已有4年,期间不断涌现爆款。作为可以不用下载安装直接在线玩的小程序游戏,小游戏渐渐成为不少人的心头好。今天就来盘点一下那些爆款小游戏用到的游戏开发引擎: 一、Cocos 必须得把Cocos放在第一个讲,毕竟近期的羊了…

计量经济学

计量经济学 复习题 题型:选择2*10;填空2*10;名词解释4*5;综合题10*4 一 选择填空考点 1. 截面数据,时间序列,面板数据定义。P12/1.3.3 截面数据:同一时间(时期或时点)某个…

艾美捷胆固醇肉豆蔻酸酯说明书和相关研究

艾美捷胆固醇肉豆蔻酸酯以结晶固体形式提供。储备溶液可以通过将胆甾醇肉豆蔻酸酯溶解在所选溶剂中来制备。肉豆蔻酸胆甾醇可溶于有机溶剂氯丨仿,应使用惰性气体吹扫,浓度约为10mg/ml。 艾美捷胆固醇肉豆蔻酸酯基本参数: CAS#:19…

vue中使用图像编辑器tui-image-editor(一)

vue中使用图像编辑器tui-image-editor(一) 场景:需要对图片进行旋转、缩放、裁剪、涂鸦、标注、添加文本等。 效果-图1 1、基本介绍 官网:https://ui.toast.com/tui-image-editor 官方GitHub地址:https://github.com/nhn/tui.image-edito…

数据库设计

概述 数据库设计是一项十分复杂的操作,首先需要理清数据之间的关系,绘制ER图,接着根据ER图设计Relation Schema,最后添加字段属性和索引生成数据表。一个好的ER图是一个数据库的基础。 数据库设计的好坏中最重要的一项指标就是重…

完整版在xcode打测试专用ipa包流程​

前言:有时候,想要把自己的程序运行在别人的iphone手机上,但又不能通过本地真机调试的方法安装,这个时候我们就要打一个测试专用的ipa包给远方的测试小伙伴们测试。​ 步骤:​ 首先希望你的发布证书已经安装好了。​ 1.…

分布式文件存储系统FastDFS[2]-上传和下载文件工具类

一、文件上传流程 1 时序图 2 流程说明 客户端访问Tracker Tracker 返回Storage的ip和端口 客户端直接访问Storage&#xff0c;把文件内容和元数据发送过去。 Storage返回文件存储id。包含了组名和文件名 1 添加依赖 <dependencies><dependency><groupId&g…

基于jsp+mysql+ssm峰值预警停车场管理系统-计算机毕业设计

项目介绍 随着城市建设与经济的不断发展,城市车辆的数量也不断增涨,为解决停车问题修建停车场。基于经营、安全、管理等多角度的考虑&#xff0c;希望在目前传统的大型车库管理系统中有机地结合车牌识别技术&#xff0c;以求得日后在停车库运营时更安全、管理上更细致、经营中…

13个小众有趣的网站,只有程序员才看得懂

欢迎来到程序员的世界&#xff0c;分享一些关于程序员的小众网站&#xff0c;不仅干货满满的实用类网站&#xff0c;也有一些有趣的娱乐网站&#xff0c;有些网站只有程序员才看得懂。1、程序员音乐 地址&#xff1a;https://musicforprogramming.net/ 一个仿代码样式的背景音乐…

使用JAR签名进行代码签名

JavaArchive(JAR)包格式可用于打包Java应用程序和库。 签名的JAR文件可以选择包含来自TSA时间戳响应&#xff0c;使用RFC#3161格式。 添加JAR签名者添加JAR签名者的链接&#xff0c;SignServer中的JAR签名器称为JArchiveSigner。 要配置JArchiveSigner&#xff0c;请按照以下…

[附源码]计算机毕业设计农产品销售网站Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

用R语言模拟M / M / 1随机服务排队系统

本文中我在R中构造一个简单的M / M / 1队列的离散事件模拟 。最近我们被客户要求撰写关于随机服务的研究报告&#xff0c;包括一些图形和统计输出。 模拟变量 像往常一样&#xff0c;我们从模拟及其检测所需的变量 开始。 t.end <- 10^5 # 模拟的持续时间 t.clock <- 0…

【OpenCV-Python】教程:4-3 Shi-Tomasi 角点检测

OpenCV Python Shi-Tomasi 角点检测器 【目标】 Shi-Tomasi 角点检测器cv2.goodFeaturesToTrack 【理论】 上一个章节中学习了Harris角点&#xff0c;J. Shi and C. Tomasi 做了一些修改&#xff0c;Good Features to Track显示了比Harris角点更好的效果。 Harris 角点检测…

私人定制AI绘画——快速finetune stable diffusion教程

最近AI绘图非常火&#xff0c;只需要输入文本就能得到令人惊艳的图。 举个例子&#xff0c;输入 “very complex hyper-maximalist overdetailed cinematic tribal darkfantasy closeup portrait of a malignant beautiful young dragon queen goddess megan fox with long bl…

springcloud之Eureka

idea项目创建 1.创建一个project&#xff0c;然后把src目录删掉 2.修改pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

java+springboot的社区维修平台

JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven 系统结构图&#xff0c;如图4-3所示。 图4-3 系统结构图管 效果图 目 录 第一…