Docker基础教程 - 7 容器数据卷

更好的阅读体验:点这里 ( www.doubibiji.com

7 容器数据卷

什么是容器卷,为什么需要容器卷?

我们在运行容器的时候,产生的数据都是保存在容器内部的。如果使用Docker来运行mysql容器,数据都保存在容器内部,此时删除容器,数据就全部没了!没了!了!比删库跑路还容易,简直离谱他妈给离谱开门——离谱到家了。


所以需要容器卷,将主机的目录挂载到容器内部(宿主机目录相当于一个外部移动硬盘一样),将容器的目录与宿主机的目录进行映射,将数据保存到宿主机上,这样,即使容器被删除,挂载到容器卷中的数据仍然会被保留在宿主机上。使用容器卷既可以实现容器数据的持久化,也可以在容器间共享数据。

目录挂载后,两个目录进行了映射,在宿主机对应目录进行操作,都会反应到容器内的对应目录中;同样,在容器内对挂载的目录进行操作,也会同步到宿主机上,两个文件夹之间的内容始终保持一致。将容器停止,然后修改宿主机的目录,重启容器,还是会将宿主机的内容同步到容器内部。


Docker 提供了三种常见的挂载方式,分别是:绑定挂载(Bind Mounts)、卷挂载(Volume Mounts)和临时文件系统(tmpfs)挂载。下面分别介绍这三种挂载方式的使用。

7.1 绑定挂载

下面使用 Ubuntu 镜像来运行一个容器,使用绑定挂载,将宿主机的目录挂载到容器中。

命令:

# 容器卷使用-v参数
docker run -it --privileged=true -v 宿主机目录:容器内目录 镜像名称

# 例如,运行ubuntu并进行容器卷的挂载:
docker run -it --privileged=true \
-v /home/doubi/my-ubuntu/host_data:/root/docker_data \
--name my-ubuntu ubuntu

shell 命令太长,使用 \ 进行换行。

解释一下:

  • --privileged=true :建议都添加 --privileged=true 参数来开启权限,否则可能出现 ls: cannot open directory .: Permission denied 的错误。使用该命令,容器内的root拥有真正的root权限,否则容器内的root在外部只是一个普通用户权限,所以导致容器内的root权限不够。

  • -v /home/doubi/my-ubuntu/host_data:/root/docker_data :表示将宿主机上的 /home/doubi/my-ubuntu/host_data 目录挂载到容器内的 /root/docker_data 目录,使两个目录进行映射。

运行上面的命令后,如果宿主机没有 /home/doubi/my-ubuntu/host_data 目录,则会自动创建,如果容器内部没有 /root/docker_data 目录,也会自动创建,挂载的路径必须是绝对路径,如果容器内/root/docker_data 目录有内容,内容将被覆盖删除。

-v 参数也是可以使用多个的,进行多个目录挂载的,例如:

docker run -it --privileged=true \
-v /home/doubi/my-ubuntu/host_data:/root/docker_data \
-v /home/doubi/my-ubuntu/config:/root/config \
--name my-ubuntu ubuntu

大多数情况下,我们都使用了绑定挂载的方式。

7.2 卷挂载

卷挂载方式,Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中。

卷挂载有两种方式:具名挂载匿名挂载

1 具名挂载

下面运行 ubuntu 并使用卷挂载:

docker run -it --privileged=true \
-v ubuntu_data:/root/docker_data \
--name my-ubuntu ubuntu

ubuntu_data 就是容器卷的名称,使用卷挂载,docker 会查看 ubuntu_data 容器卷是否存在,如果不存在就会创建 ubuntu_data 容器卷。docker 会将容器中的目录映射到 ubuntu_data 容器卷。

使用命令 docker volume ls 可以查看 docker 中存在的卷:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以使用 docker inspect 命令查看容器卷的位置:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

容器中对应的目录中的数据会被存储在 /var/lib/docker/volumes/容器卷名/_data 目录中。


我们也可以使用命令创建容器卷,然后在运行容器的时候,使用已存在的卷:

# 创建容器卷
docker volume create 卷名称

# 举个栗子,创建ubuntu_data2容器卷
docker volume create ubuntu_data2

我们可以使用多个容器使用同样的容器卷,实现容器间数据的共享:

# 创建容器1
docker run -it --privileged=true \
-v ubuntu_data:/root/docker_data \
--name my-ubuntu1 ubuntu

# 创建容器2,使用同样的数据卷
docker run -it --privileged=true \
-v ubuntu_data:/root/docker_data \
--name my-ubuntu2 ubuntu

2 匿名挂载

在上面使用命令进行容器卷挂载的时候,是指定了容器卷的名称。还有一种是匿名挂载,也就是只指定容器内部的目录,不指定宿主机的目录。

举个栗子:

docker run -it --privileged=true -v /root/docker_data --name my-ubuntu ubuntu

docker inspect 命令查看匿名挂载的容器的信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到,使用匿名挂载,容器卷是被挂载到宿主机的 /var/lib/docker/volumes/xxxx/_data 目录下。

匿名挂载一般很少使用。

7.3 临时文件系统挂载

这种挂载方式,数据只存储在宿主机的内存中,不会写入到宿主机的文件系统中,当容器停止时,挂载的数据会被删除。

例如,使用如下命令可以实现临时文件系统挂载:

docker run --tmpfs /container/path image_name

不过一般不会使用这种方式,就当我没说,忽略。

7.4 查看挂载

使用 docker inspect 容器ID 命可以查看容器挂载的详细信息,里面就包含了容器的挂载信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.5 理解挂载 - 重要

重新来说一下挂载,其实上面说的将宿主机和容器的目录进行映射是不准确的说法。

例如我们在运行容器的时候,使用了绑定挂载,指定了 -v /home/doubi/my-ubuntu/data:/root/docker_data

这表示将宿主机的 /home/doubi/my-ubuntu/host_data 目录挂载到容器内部的 /root/docker_data 目录,也就是容器内部的 /root/docker_data 目录变成了指向了宿主机的 /home/doubi/my-ubuntu/host_data 目录的一个链接,或快捷方式。在容器内部将数据保存到 /root/docker_data 目录,数据实际保存到的是宿主机的 /home/doubi/my-ubuntu/host_data 目录。

所以在执行挂载的时候,如果容器内的 /root/docker_data 目录是非空的,那么目录中的文件将会丢失,因为 /root/docker_data 目录变成了一个链接,指向了宿主机的目录的 /home/doubi/my-ubuntu/host_data 目录,显示的自然是宿主机 /home/doubi/my-ubuntu/host_data 目录的内容,如果 /home/doubi/my-ubuntu/host_data 目录是空的,那么容器内的 /root/docker_data 目录也将变成空的。

而卷挂载不一样:如果volume是空的而容器中的目录有内容,那么docker会将容器目录中的内容拷贝到volume中,但是如果volume中已经有内容,则会将容器中的目录覆盖。

7.6 容器卷读写规则

上面在进行容器卷挂载的时候,我们没有指定容器卷的读写规则,那么使用的就是默认规则,也就是说容器内部对挂载的目录具有可读可写权限。

还可以使用容器卷读写规则,限制容器内对挂载目录的读写权限。

命令:

docker run -it --privileged=true -v 宿主机目录:容器内目录 镜像名称

没有指定读写规则,默认是 rw 的读写规则,那么其实是这样的:

docker run -it --privileged=true -v 宿主机目录:容器内目录:rw 镜像名称

如果想限制容器内对挂载目录的操作权限,例如在容器内只能对挂载目录进行只读,那么,可以修改命令为:

# 容器内对挂载目录只能读
docker run -it --privileged=true -v 宿主机目录:容器内目录:ro 镜像名称

# 举例:
docker run -it --privileged=true -v /home/doubi/my-ubuntu/host_data:/root/docker_data:ro --name my-ubuntu ubuntu

ro 表示 readonly ,只读。目录下的内容只能通过宿主机来修改,容器内部是无法操作的,只能读!

一般情况下都是使用默认规则,可读可写。

7.7 容器卷的继承和共享

如果要在多个容器之间共享数据,那么可以使用相同的挂载目录。

举个栗子:

# 运行my-ubuntu1容器
docker run -it --privileged=true -v /home/doubi/my-ubuntu/host_data:/root/docker_data --name my-ubuntu1 ubuntu
# 运行my-ubuntu2容器
docker run -it --privileged=true -v /home/doubi/my-ubuntu/host_data:/root/docker_data --name my-ubuntu2 ubuntu

上面运行了两个 ubuntu 容器,使用的是宿主机相同的挂载目录,这样在宿主机修改目录下的内容,会同时同步到两个容器中;同样,在一个容器内修改目录下的内容,也可以同步到宿主机和其他的容器中。


上面是一种方式,我们还可以使用 --volumes-from 参数,让一个容器继承另一个容器的卷规则。

举个栗子:

# 运行my-ubuntu1容器
docker run -it --privileged=true \
-v /home/doubi/my-ubuntu/host_data:/root/docker_data \
--name my-ubuntu1 ubuntu

# 运行my-ubuntu2容器,继承my-ubuntu1容器的卷规则
docker run -it --privileged=true \
--volumes-from my-ubuntu1 \
--name my-ubuntu2 ubuntu

上面的 my-ubuntu2 容器,使用 --volumes-from 参数继承 my-ubuntu1容器的卷规则,那么他们的挂载将是相同的。

这样在宿主机修改目录下的内容,会同时同步到两个容器中;在一个容器内修改目录下的内容,也可以同步到宿主机和其他的容器中。

这种继承的方式在使用多个容器时更为方便。

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

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

相关文章

macOS Sonoma 14.4(23E214)发布[附黑苹果/Mac系统镜像]

黑果魏叔3 月 8 日消息,苹果今日向 Mac 电脑用户推送了 macOS 14.4 更新(内部版本号:23E214),本次更新距离上次发布隔了 29 天。 魏叔翻译 macOS 14.4 版本主要内容如下: macOS Sonoma 14.4 为你的 Mac 引…

遗传算法优化BP神经网络时间序列回归分析,ga-bp回归分析

目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 遗传算法原理 遗传算法主要参数 遗传算法流程图 完整代码包含数据下载链接: 遗传算法优化BP神经网络时间序列回归分析,ga-bp回归分析(代码完…

子查询与连表查询

子查询与连表查询 标签:数据库 子查询 mysql> explain select e.empno,e.ename,(select dname from dept d where e.deptno d.deptno) as dname from emp e where e.deptno 1; -------------------------------------------------------------------------------------…

【Web安全】XSS攻击与绕过

【Web安全】XSS攻击与绕过 【Web安全靶场】xss-labs-master 1-20 文章目录 【Web安全】XSS攻击与绕过1. XSS攻击是啥?2. XSS如何发生?3. XSS分类3.1. 反射型3.2. 存储型3.3. DOM型 4. XSS攻击方式1. script标签2. img标签3. input标签4. details标签5.…

CAN总线及通讯的工作原理

一、CAN总线 CAN是控制器局域网络(Controller Area Network)的简称, 它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的, 并最终成为国际标准(ISO11519),是国际上应用最广泛的现场总线之一。 二、工作原理 …

大规模语言模型中新的思想和方法

大规模语言模型的发展引入了多项创新的思想和方法,这些创新对实际效果产生了深远的影响: 1. 深度神经网络架构创新 如Transformer模型的引入,利用自注意力机制解决了长序列输入的处理难题,使得模型能够更有效地捕获语言中的长距离…

2024年AI辅助研发:科技遇上创意,无限可能的绽放

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 随着人工智能技术的持续突破与深度融合,2024年AI辅助研发正以前所未有的速度和规模,引领着科技界和工业界…

加密 / MD5算法 /盐值

目录 加密的介绍 MD5算法 盐值 加密的介绍 加密介绍:在MySQL数据库中, 我们常常需要对密码, 身份证号, 手机号等敏感信息进行加密, 以保证数据的安全性。 如果使用明文存储, 当黑客入侵了数据库时, 就可以轻松获取到用户的相关信息, 从而对用户或者企业造成信息…

Java学习笔记------内部类

类的五大成员 属性、方法、构造方法、代码块、内部类 内部类 格式: public class Outer{//外部类 public class Inner{//内部类 } } public class Test{//外部其他类 public static void main(String[] args) } inner类表示的事物是Outer类的一部分&#xf…

ABB机器人信号关联Cross Connection的具体方法示例

ABB机器人信号关联Cross Connection的具体方法示例 如下图所示,点击打开菜单,然后点击控制面板进入, 如下图所示,找到配置,点击进入, 如下图所示,找到“Cross Connection” 信号关联,点击进入, 如下图所示,选中“Cross Connection”后,点击下方的“显示全部”, 如下…

DFT应用:计算线性卷积

目录 一、计算两个有限长序列的线性卷积示例 二、无限长序列和有限长序列的卷积(重叠相加法) 实验1:数据实验 实验2:纯净语音加混响(音效) 二、无限长序列和有限长序列的卷积(重叠保留法) 实验1:数据实验 三、小结 一、计算两个有限长序…

吴恩达机器学习笔记十五 什么是导数 计算图 大型神经网络案例

假设函数 J(w)w^2,当 w3 时, J(w)3*39 当我们给w增加一个很小的量时,观察J(w)如何变化。 例如 w30.001, 则J(w)9.006001,因此当w3且增加一个变化量 ε 时,J(w)将会增加 6ε&#x…

非线形优化 Matlab和Python (含01规划)

MATLAB:fmincon 在matlab中,一般使用fmincon来解决非线性优化问题 [x,fval,exitflag,output,lambda,grad,hessian]fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) 一般使用: [x,fval,exitflag]fmincon(fun,x0,A,b,Aeq,beq,lb,ub,non…

RestTemplate解析响应数据中文字符出现Unicode编码问题解决和源码剖析

问题 基于上篇文章,开发过程中又遇到一个restTemplate问题: restTemplate请求接口返回响应数据为json时,解析其中的中文字符出现Unicode编码 测试 接口如下: 测试代码: 觉得很奇怪,我的restTemplate配置…

排序算法——梳理总结

✨冒泡 ✨选择 ✨插入  ✨标准写法  &#x1f3ad;不同写法 ✨希尔排序——标准写法 ✨快排 ✨归并 ✨堆排 ✨冒泡 void Bubble(vector<int>& nums) {// 冒泡排序只能先确定最右边的结果&#xff0c;不能先确定最左边的结果for (int i 0; i < nums.size(); i){…

Effective C++ 学习笔记 条款16 成对使用new和delete时要采取相同形式

以下动作有什么错&#xff1f; std::string *stringArray new std::string[100]; // ... delete stringArray;每件事看起来都井然有序&#xff0c;使用了new&#xff0c;也搭配了对应的delete。但还是有某样东西完全错误&#xff1a;你的程序行为未定义。至少&#xff0c;str…

自律篇001-养成自律的秘密武器1-目标规划表

&#x1f680;以前在某书上看到一些博主非常自律&#xff0c;比如每天5点多起床看书&#xff0c;或者每天坚持健身&#xff0c;直到练出马甲线&#xff0c;还有一边工作一边考研等等&#xff0c;自己也曾尝试过做一些目标规划&#xff0c;但结果都不尽人意。写计划的时候往往信…

阿里云k8s环境下,因slb限额导致的发布事故

一、背景 阿里云k8s容器&#xff0c;在发布java应用程序的时候&#xff0c;客户端访问出现500错误。 后端服务是健康且可用的&#xff0c;网关层大量500错误请求&#xff0c;slb没有流入和流出流量。 经过回滚&#xff0c;仍未能解决错误。可谓是一次血的教训&#xff0c;特…

UI学习 一

教程&#xff1a;Accessibility – Material Design 3 需要科学上网&#xff0c;否则图片显示不出来。设计教程没有图片说明&#xff0c;不容易理解。 优化UI方向 清晰可见的元素足够的对比度和尺寸重要性的明确等级一眼就能辨别的关键信息 传达某一事物的相对重要性 将重…

简单了解Stable Diffusion里面sampling methods(采样方法)每种方法的效果

在 Stable Diffusion 模型中&#xff0c;采样方法&#xff08;Sampling Methods&#xff09;是指在生成图像时用于从模型的概率分布中抽取样本的算法。这些方法对于生成图像的质量、多样性和速度都有重要影响&#xff0c;以下是一些 Stable Diffusion 中常见的采样方法。 那么…