docker中涉及的挂载点总结

news2025/1/21 2:52:12

文章目录

  • 1.场景描述
  • 2. 容器信息在主机上位置
  • 3. 通过docker run 命令
  • 4、通过Dockerfile创建挂载点
  • 5、容器共享卷(挂载点)
  • 6、最佳实践:数据容器

1.场景描述

在介绍VOLUME指令之前,我们来看下如下场景需求:

1)容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上。
一旦容器删除后,这些数据就没了,除非我们人工备份下来(或者基于容器创建新的镜像)。能否可以让容器进程持久化的数据保存在
主机上呢?这样即使容器删除了,数据还在。

2)当我们在开发一个web应用时,开发环境是在主机本地,但运行测试环境是放在docker容器上。
这样的话,我在主机上修改文件(如html,js等)后,需要手动进入容器内找到相应目录然后把文件拷贝到容器中。这显然比较麻烦。

3)多个容器运行一组相关联的服务,如果他们要共享一些数据怎么办?

对于这些问题,我们当然能想到各种解决方案。而docker本身提供了一种机制,可以将主机上的某个目录与容器的某个目录(称为挂载点、或者叫卷)关联起来容器上的挂载点下的内容就是主机的这个目录下的内容,这类似linux系统下mount的机制。 这样的话,我们修改主机上该目录的内容时,不需要同步容器,对容器来说是立即生效的。 挂载点可以让多个容器共享。
其实数据还是一份,保存在主机的上的与容器内的挂载点关联的目录下的,并非是容器内一份数据,然后主机上还有一份数据。所以删除容器后,主机上对应挂载点的目录下的数据还在。
注意:容器上的挂载点并不是一个普通的目录。如果把主机上与其关联的目录删除后,那么在容器上的挂载点还在,只是其下的内容都没
有了,此时如果在容器的挂载点下 进行touch 文件名,会提示touch: cannot touch ‘文件名’: No such file or directory。说明当我们的
主机目录手动误删后,挂载点下就无法工作了。也同时说明了,挂载点下数据其实就是保存在主机与之关联的目录下的。而并非是在
容器上保存一份,然后再同步到主机与之关联的目录下一份。
注意:上面所说的主机目录误删 导致 容器内与关联的挂载点无法工作。需要在主机上创建误删前的项目的名称的目录,然后重启容器
后,挂载点才能生效,继续正常工作。

2. 容器信息在主机上位置

在这里插入图片描述
下方的测试用到的镜像:
在这里插入图片描述
下面我们来介绍具体的机制:

3. 通过docker run 命令

1、运行命令:docker run -d -p 8086:8096 -v /home/mydata:/data 79bcb7a73dd2 /bin/bash
其中的 -v 标记 在容器中设置了一个挂载点 /data(就是容器中根下的一个目录),并将主机上的根下/home/mydata目录中的内容关联到 /data下。
这样在容器中对/data目录下的操作,还是在主机上对/home/mydata的操作,都是完全实时同步的,因为这两个目录实际都是指向主机目录。
尾部加上/bin/bash 会创建并运行容器以及自动进入容器内。

2、运行命令:docker run -d -p 8087:8096 -v /data 79bcb7a73dd2 /bin/bash
上面-v的标记只设置了容器的挂载点(/data),并没有指定关联的主机目录。这时docker会自动绑定主机上的一个目录(在var/lib/docker/volumes下)。

通过docker inspect 命令可以查看上方两种方式的效果。

先通过docker ps 查看运行的容器的信息在这里插入图片描述
docker inspect 24388bf5790e
内容比较多截取部分:
在这里插入图片描述
docker inspect 82b44b609da3
在这里插入图片描述
上面 Mounts下的每条信息记录了容器上一个挂载点的信息,“Destination” 值是容器的挂载点,"Source"值是对应的主机目录。
可以看出这种第二种方式对应的主机目录是自动创建的,其目的不是让在主机上修改,而是让多个容器共享。

4、通过Dockerfile创建挂载点

上面介绍的通过docker run命令的-v标识创建的挂载点只能对单一创建的容器有效。
通过Dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。
还有一个区别是,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。等价于上面的方式二
通过docker run -v -v的标记只设置了容器的挂载点,并没有指定关联的主机目录的情况。

FROM openjdk:8u212-jre
MAINTAINER ssccxx
#VOLUME /data1 #设置单个挂载点
VOLUME ["/data1","/data2"] #通过数组的方式 设置多个挂载点,每个挂载点会分别对应一个主机上自动生成的目录
ADD platform-customer-post.jar myapp.jar
RUN bash -c 'touch /myapp1.jar'
ENTRYPOINT ["java","-jar","/myapp.jar"]
EXPOSE 8096

根据上方的Dockerfile文件构建镜像:
在这里插入图片描述
查看构建好的镜像
在这里插入图片描述
通过上方的这个镜像创建容器实例:
docker run -d -it 镜像id
docker inspect 容器id
在这里插入图片描述
可以看到两个挂载点的信息。分别对应主机上自动生成的两个目录下。

5、容器共享卷(挂载点)

docker run -d --name test1 镜像id

上面命令中的 镜像id是用前面的Dockerfile文件构建的镜像。 这样容器test1就有了 /data1 和 /data2两个挂载点。
下面我们创建另一个容器可以和test1共享 /data1 和 /data2卷 ,这是在 docker run中使用 --volumes-from标记,如:
可以是来源不同镜像,如:
docker run -d --name test2 --volumes-from test1  79bcb7a73dd2   #这个79bcb7a73dd2镜像中里有一个/tmp挂载点
也可以是同一镜像,如:
docker run -d --name test3 --volumes-from test1  c9aec8050444
上面的三个容器 test1 , test2 , test3 均有 /data1 和 /data2 两个目录,且目录中内容是共享的,任何一个容器修改了内容,别的容器都能获取到。
test2中 还有一个/tmp挂载点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
可以发现 test1,test2,test3容器内的 /data1,/data2挂载点对应的主机上的目录 都是同一个目录。也就是实现了数据在容器间的共享。
说明:虽然test3容器创建时,即使不用–volumes-from test1 ,也会产生 /data1,/data2挂载点。只是这样产生的挂载对应的主机目录和test1中 /data1,/data2挂载点 对应的主机目录不是一个。实现不了数据共享。加上 --volumes-from test1 后,那么 test3 所使用的镜像中的挂载点会比较是否有和test1中名称重复的,如果有就用test1的对应的主机目录,没有就新建主机目录。
注意: --volumes-from 后面如果跟前面的通过 docker run -v 主机目录:挂载点 产生的容器。那么 一样也共享这个容器的挂载点。
如下:
在这里插入图片描述
这里应该说test4容器内都拥有这些挂载点了,不能像截图上说的继承过来了。

6、最佳实践:数据容器

如果多个容器需要共享数据(如持久化数据库、配置文件或者数据文件等),可以考虑创建一个特定的数据容器,该容器有1个或多个卷。
其它容器通过–volumes-from 来共享这个数据容器的卷。

因为容器的卷本质上对应主机上的目录,所以这个数据容器也不需要启动。

如: docker create --name dbdata myimage echo “data container” #创建容器实例但是不启动

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

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

相关文章

关于OAuth2.0的一些基本知识

本文记录下关于OAuth2.0的一些基本知识 文章目录 什么是 OAuth2.0OAuth2.0 架构术语介绍Web 服务器用户代理本机应用程序本文小结 什么是 OAuth2.0 OAuth 是一种开放的授权协议,它是目前最流行的授权机制。它允许将存储在一个站点上的资源共享到另一个站点&#xff…

享元模式——实现对象的复用

1、简介 1.1、概述 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题。例如,在一个文本字符串中存在很多重复的字符,如果每个字符都用一个单独的对象来表示,将会占用较多的内存…

打印Winform控件实现简陋版的分页打印(C#)

本文的代码可以从这里获取:winformDemo.rar 张祥裕/分享的资源名称 - Gitee.com 作者的水平有限,如有错误,望指正。 为了简单起见,纸张大小,打印机等信息按照默认的来,本文的实现方案是:打印Pa…

超全整理,Jmeter性能测试-常用Jmeter第三方插件详解(超细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Jmeter作为一个开…

【回眸】备考PMP考点汇总 三(距离考试还有20天)

目录 前言 【回眸】备考PMP考点汇总 三(距离考试还有20天) 29、管理质量 30、获取资源 31、建设团队 32、管理团队 33、管理沟通 34、实施风险应对 35、实施采购 36、管理相关方参与 37、监控项目工作(10%) 38、实施整…

php://filter绕过死亡exit

文章目录 php://filter绕过死亡exit前言[EIS 2019]EzPOP绕过exit 参考 php://filter绕过死亡exit 前言 最近写了一道反序列化的题,其中有一个需要通过php://filter去绕过死亡exit()的小trick,这里通过一道题目来讲解 [EIS 2019]EzPOP 题目源码&#…

*CTF 2023 web jwt2struts 题解wp

jwt2struts 根据题目名字猜测,这题考察jwt和Struts2 包里面果然有一个cookie 验证了,是jwt eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiZXhwIjoyMDA2MjI1MjgxfQ.F7vOtdqg48M1DYK4tVZywTipIYDqKfsBSju7ekLSecU 我们的目标应该是把user改…

深蓝学院C++基础与深度解析笔记 第13章 模板

1. 函数模板 ● 使用 template 关键字引入模板&#xff1a; template<typename T> //声明&#xff1a;T模板形参void fun(T); // T 函数形参template<typename T> //定义void fun(T) {...}– 函数模板不是函数 –…

安全学习DAY12_信息打点-Web应用信息搜集

信息打点-Web应用 文章目录 信息打点-Web应用业务资产企业查信息的目的 Web应用信息搜集Web网站域名搜集WEB单域名WEB子域名OneForAll&#xff08;子域名收集工具&#xff09; WEB网站架构资产WEB指纹识别资产 常用查询平台汇总查企业信息查备案信息查公众号信息域名注册查询IP…

【Linux】进程篇Ⅱ:进程开始、进程终止、进程等待、程序替换

文章目录 五、fork 函数&#xff0c;创建进程写时拷贝 六、进程终止1. 退出码2. 如何终止程序 七、进程等待1. 概念2. wait 函数waitpid 函数 &#x1f53a; 3. 阻塞等待 八、程序替换1. execl2. execv3. execlp4. execvp5. execle &#x1f53a;6. execvpe 、execve 一个简易的…

vmware的window中安装GNS3

1.向vmware中的windows虚拟机传送文件 点击虚拟机-安装VMwaretools 安装在虚拟机上面 此图标代表已经成功&#xff0c;将文件复制到虚拟机上里面 2.安装 安装gns3&#xff0c;需要先安装winpcap&#xff08;检查网卡&#xff09;和wireshark&#xff08;对winpcap上数据进行抓…

16- C++多态-4 (C++)

第五章 多态 5.1 多态的引入 思考&#xff1a;在之前实现的英雄模型中&#xff0c;假如实现某个接口可以传入一个英雄&#xff0c;在该接口中可以对英雄的力量、敏捷和智力进行加强&#xff0c;请问该接口的参数该如何设计&#xff1f; 以上解决办法利用了C中的多态&#xf…

51单片机定时器/计数器

目录 1、定时器/计数器0/1介绍 1.1 定时器介绍 1.2 单片机定时/计数器原理 2、定时器/计数器0和1的相关寄存器 2.1 定时器/计数器控制寄存器TCON 2.2 定时器/计数器工作模式寄存器TMOD 2.3 定时器/计数器工作模式 2.3.1 模式0(13位定时器/计数器) 2.3.2 模式1(16位定…

CSDN如何输入公式

方法分三步&#xff1a; 1&#xff09;预先设置MathType的复制剪切选项 2&#xff09;将MathType已经编写好的公式复制到CSDN 3&#xff09;把复制的公式文本&#xff0c;首尾的“\[”和“\]”符号替换成“$$”和“$$” 1&#xff09;预先设置MathType的复制剪切选项 2&#x…

海量数据存储组件Hbase

hdfs hbase NoSQL数据库 支持海量数据的增删改查 基于Rowkey查询效率特别高 kudu 介于hdfs和hbase之间 hbase依赖hadoopzookeeper&#xff0c;同时整合框架phoenix(擅长读写),hive&#xff08;分析数据&#xff09; k&#xff0c;v 储存结构 稀疏的&#xff08;为空的不存…

Qt实现思维导图锦集

序号简述文章导航1思维导图树形结构、不重叠且均匀分布、支持折叠和展开核心树2菜单按钮风格、菜单提示风格、侧滑菜单、侧滑功能窗口UI设计3支持JPEG、PNG、XML、JSON、PDF、SVG格式文件数据导入导出4支持撤销回撤功能、显示节点操作流程、点击可跳转历史撤销回撤5思维导图横向…

哈工大计算机网络课程网络安全基本原理详解之:消息完整性与数字签名

哈工大计算机网络课程网络安全基本原理详解之&#xff1a;消息完整性与数字签名 这一小节&#xff0c;我们继续介绍网络完全中的另一个重要内容&#xff0c;就是消息完整性&#xff0c;也为后面的数字签名打下基础。 报文完整性 首先来看一下什么是报文完整性。 报文完整性…

C++模拟实现反向迭代器

1.代码实现 1.有了解正向迭代器的应该知道&#xff0c;比如list的正向迭代器其实本质是一个类&#xff0c;而有些人想模拟实现反向迭代器&#xff0c;依旧想再创建一个类&#xff0c;但是库里面想要的是&#xff0c;你给我一个迭代器&#xff0c;我就能给你反馈一个反向迭代器…

信号槽中的函数重载

信号槽中的函数重载 QT4的方式QT5的方式函数指针重载函数QT5信号函数重载解决方案 总结 QT4的方式 Qt4中声明槽函数必须要使用 slots 关键字, 不能省略。 信号函数&#xff1a; 槽函数&#xff1a; mainwondow: cpp文件&#xff1a; #include "mainwindow.h"…

C/C++多线程操作

文章目录 多线程C创建线程join 和detachthis_thread线程操作锁lock_guardunique_lock 条件变量 condition_variablewaitwaitfor C语言线程创建线程同步 参考 多线程 传统的C&#xff08;C11标准之前&#xff09;中并没有引入线程这个概念&#xff0c;在C11出来之前&#xff0c…