docker中涉及的挂载点总结

文章目录

  • 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.mzph.cn/news/15533.shtml

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

相关文章

xshell连接liunx服务器身份验证不能选择password

ssh用户身份验证不能选择password 只能用public key的解决办法 问题现象 使用密码通过Workbench或SSH方式(例如PuTTY、Xshell、SecureCRT等)远程登录ECS实例时,遇到服务器禁用了密码登录方式错误. 可能原因 该问题是由于SSH服务对应配置文件/etc/ssh/sshd_config中…

路由器工作原理

路由器原理 路由概述 路由:跨越从源主机到目标主机的一个互联网络来转发数据包的过程。(为数据包选择路径的过程) 作用:路由器是连接不同网段的。 转发依据: 路由表:路径选择全看路由表,根…

蓝桥杯2018省赛全球变暖dfs

全球变暖 问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序 问题描述 格式输入 格式输出 输出一个整数 样例输入 样例输出 1 评测用例规模与约定 最大运行时间:1s最大运行内存: 256M 解析 采用dfs的方式进行搜索,首先输入地…

Xshell使用是出现全黑或全白问题

Xshell使用是出现全黑或全白问题,这是我实际遇到的问题如图。 解决方式: 设置字体 解决成功:

整理mongodb文档(一):增

个人公众号 整理mongodb文档(一):增 看前提示 本文主要用到的工具是mongodb的db管理工具-----mongo compass。 本文主要讲的是在上述工具中如何对db的增加的操作,对应转化为mongose里面的语句我想应该不需要我帮忙了吧。。。 选用mongose的理由也很简单&#xf…

一个监控系统的典型架构

监控系统的典型架构图,从左往右看,采集器是负责采集监控数据的,采集到数据之后传输给服务端,通常是直接写入时序库。然后就是对时序库的数据进行分析和可视化,分析部分最典型的就是告警规则判断,即图上的告…

Java阶段五Day14

Java阶段五Day14 文章目录 Java阶段五Day14分布式事务整合demo案例中架构,代码关系发送半消息本地事务完成检查补偿购物车消费 鲁班周边环境调整前端启动介绍启动前端 直接启动的项目gateway(网关)login(登录注册)atta…

网络请求fetch

fetch()是 XMLHttpRequest 的升级版,用于在 JavaScript 脚本里面发出 HTTP 请求。浏览器原生提供这个对象 fetch()的功能与 XMLHttpRequest 基本相同,但有三个主要的差异。 与 Ajax 类似,Fetch 也是前后端通信的一种方式。Fetch 要比 Ajax …

React Flow

// 创建项目 npm create vitelatest my-react-flow-app -- --template react // 安装插件 npm install reactflow npm install antd // 运行项目 npm run dev 1、App.jsx import { useCallback, useState } from react; import ReactFlow, {addEdge,ReactFlowProvider,MiniMap…

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

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

39.手机导航

手机导航 html部分 <div class"phone"><div class"content"><img class"active" src"./static/20180529205331_yhGyf.jpeg" alt"" srcset""><img src"./static/20190214214253_hsjqw…

【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Pythonmatlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

测试|自动化测试(了解)

测试|自动化测试&#xff08;了解&#xff09; 1.什么是自动化测试☆☆☆☆ 自动化测试相当于把人工测试手段进行转换&#xff0c;让代码执行。 2.自动化测试的分类☆☆☆☆ 注&#xff1a;这里只是常见的自动化测试&#xff0c;并不全部罗列。 1.单元自动化测试 其中Java…

嵌入式硬件系统的基本组成

嵌入式硬件系统的基本组成 嵌入式系统的硬件是以包含嵌入式微处理器的SOC为核心&#xff0c;主要由SOC、总线、存储器、输入/输出接口和设备组成。 嵌入式微处理器 每个嵌入式系统至少包含一个嵌入式微处理器 嵌入式微处理器体系结构可采用冯.诺依曼&#xff08;Von Neumann&…

前后端分离实现博客系统

文章目录 博客系统前言1. 前端1.1 登陆页面1.2 博客列表页面1.3 博客详情页面1.4 博客编辑页面 2. 后端2.1 项目部署2.1.1 创建maven项目2.1.2 引入依赖2.1.3 创建目录结构2.1.4 部署程序 2.2 逻辑设计2.2.1 数据库设计2.2.2 实体类设计2.2.3 Dao层设计2.2.3.1 BlogDao 2.2.4 D…

qt添加图标

1.添加资源 选择QtWidgetsApp.qrc文件打开 添加图标文件路径 添加图标文件 2.按钮添加图标 图标路径为:/res/res/swicth.jpg &#xff08;1&#xff09;代码设置图标 ui.pushButton_OPen->setIcon(QIcon(":/res/res/swicth.jpg")); &#xff08;2&#xff09;属…

apple pencil到底值不值得买?好用的iPad电容笔

随着ipad平板型号版本的不断更新&#xff0c;其的功能越来越多&#xff0c;现在它的性能已经可以和笔记本电脑相媲美了。而现在&#xff0c;随着技术的进步&#xff0c;IPAD已经不再是单纯的娱乐&#xff0c;而是一种功能强大的学习、绘画、工作等等。要增加生产效率&#xff0…

【数据结构与算法】归并排序

归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治&#xff08;divide-and-conquer&#xff09;策略&#xff08;分治法将问题分&#xff08;divide&#xff09;成一些小的问题然后递归求解&#xff0c;而…

stm32内存杂记

从上图中可以看出SRAM空间用来存放&#xff1a;1.各个文件中声明和定义的全局变量、静态数据和常量&#xff1b;2.未初始化的全局变量&#xff1b;3.HEAP区&#xff1b;4.STACK区 这是在.map文件中&#xff0c;双击工程target打开 堆栈是处于以0x2000xx地址处的 EQU伪代码&…

学C的第三十一天【通讯录的实现】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十天【自定义类型&#xff1a;结构体、枚举、联合】_高高的胖子的博客-CSDN博客 通讯录需求&#xff1a; 实现一个通讯录&#xff0c; 通讯录中存放保存人的信息&#xff1…