docker系列8:容器卷挂载(上)

目录

传送门

从安装redis说起

什么是容器卷挂载

操作系统的挂载

日志文件一般是"首恶元凶"

挂载命令

容器卷挂载 

卷挂载命令

启动时挂载

查看挂载卷信息

容器卷管理

查看卷列表

创建容器卷

具名挂载与匿名挂载

具名挂载


传送门

docker系列1:docker安装

docker系列2:阿里云镜像加速器

 docker系列3:docker镜像基本命令

docker系列4:docker容器基本命令

docker系列5:docker安装nginx

docker系列6:docker安装redis

docker系列7:docker安装ES

从安装redis说起

在前面几节通过docker安装过了nginx、redis和ES,会发现通过docker安装运行软件的过程都差不多。但是在redis章节时,有一点区别:在使用Docker容器管理时,有时候需要对Redis进行配置,但是Docker镜像中并没有默认的redis.conf,需要手动设置redis.conf文件。

当时的解决方案是在启动命令中加入了一个配置:

docker run --name test_redis -p 6379:6379 -v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf -d redis

其中的-v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf就是容器卷挂载!

什么是容器卷挂载

在具体解释上面这条命令参数之前,先使用docker run --help看下官方的解释:

-v, --volume list                    Bind mount a volume  绑定挂载一个卷;可以指定多个为一个列表
    --volume-driver string           Optional volume driver for the container  指定容器卷驱动
    --volumes-from list              Mount volumes from the specified container(s)

 光看上面这个解释第一次接触的可能还是比较模糊,要说清楚这个问题,可以先从传统操作操作系统的的挂载讲起

操作系统的挂载

日志文件一般是"首恶元凶"

不知道你有没有过这种经历:在linux上面搭建的应用系统服务,跑了一段时间之后会发生磁盘被占满了,甚至连登录服务器都登录不上,而且一般是客户上报的错误,开发很慌啊~~。

图片来自网络

最后各种排查,发现在是日志过大(比如nacos默认的系统日志,XXL-job的触发日志)导致磁盘容量不够,这时可能就会让"运维背锅":

  • 每隔一段时间手动去服务器删除日志文件(相关文件)
  • 或者写个cron任务,自动删除日志文件

这种比较暴力的处理方式,在不那么"草台班子"的公司可能不会出现,这时运维能力强的公司一般会要求日志必须保留多久或者做备份:

  • 对服务器各项指标做监控,并配置对应的自动化运维手段对日志备份
  • 提前对日志容量做评估,配置对应的磁盘容量水位做预留
  • 要求开发将日志输出到指定挂载盘上,空间足够大

对于传统自建的服务器,可以在购买物理机的时候选用磁盘容量比较大的机器,这个时候如果硬盘不量不够可以挂载单独的外设硬盘。随着云计算的发展,很多公司上云之后都会购买云主机(虚拟机)来搭建应用服务,这样扩容很方便且在一定规模下降低成本(这个命题最近非常火,此处不过多讨论持保留很意见)?这样就出现了NFS还有OSS等网络存储设备。不管是物理机还是虚拟机的挂载都可以统一称为磁盘挂载(用来区分前面提到的docker容器卷挂载)。下图是实际项目使用的一种解决方案:

挂载命令

对于挂载命令不是这里的重点,可以自行搜索或者查看

容器卷挂载 

而容器的卷挂载跟磁盘挂载其实原理相似,不过容器卷挂载的初衷更多的是由于容器内的存储是易失的不能持久化,虽然容器容量也是其中很重要的一个原因。对此看下官方的解释:

By default all files created inside a container are stored on a writable container layer. This means that:

The data doesn't persist when that container no longer exists, and it can be difficult to get the data out of the container if another process needs it.

A container's writable layer is tightly coupled to the host machine where the container is running. You can't easily move the data somewhere else.

Writing into a container's writable layer requires a storage driver to manage the filesystem. The storage driver provides a union filesystem, using the Linux kernel. This extra abstraction reduces performance as compared to using data volumes, which write directly to the host filesystem.

Docker has two options for containers to store files on the host machine, so that the files are persisted even after the container stops: volumes, and bind mounts.

---------------------------------------------- 以下为机译 -----------------------------------------------------

默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着:
当容器不存在时,数据不会持久存在,如果另一个进程需要,则很难将数据从容器中取出。
容器的可写层与运行容器的主机紧密耦合。你不能轻易地将数据移动到其他地方。
写入容器的可写层需要一个存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供了一个联合文件系统。与使用直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能。
Docker为容器在主机上存储文件提供了两个选项,这样即使在容器停止后文件也会被持久化:卷和绑定装载。

以上面的redis为例,docker运行redis镜像时不一定要强行增加-v才行:

  • 在宿主机放置一分redis.conf文件
  • 将上面的redis.conf文件拷贝到容器中
  • 修改容器中的redis.conf文件达到修改redis配置的目的

现在来启动一个redis容器:docker run -it -d --name myredis redis

将宿主机的redis.conf文件拷贝到容器中:docker cp /root/redis/redis.conf myredis:/usr/local/etc/redis-conf/redis.conf

进入容器查看redis.conf文件: docker exec -it myredis /bin/bash

后面就可以指定redis.conf文件启动服务了,注意这里的redis.conf文件需要跟redis的版本一致,不然可能会启动失败

卷挂载命令

虽然上述方式可以达到跟卷挂载一样的效果,但是还是不如挂载来的方便,先看一下挂载命令!

启动时挂载

前面的redis运行时,通过-v命令称作启动时自动挂载:

docker run --name test_redis -p 6379:6379 -v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf -d redis
  • -v,表明进行卷挂载
  • 后面接着路径:宿主机路径:容器内路径,比如/root/redis/redis.conf表示宿主机上面的redis.conf路径;/usr/local/etc/redis/redis.conf表示容器内的路径

既然是路径,除了上面挂载文件之外,肯定也可以挂载目录的。比如在刚才的命令中增加一个数据目录:-v /root/redis/data:/usr/local/etc/redis/data

然后分别查看宿主机与容器内的目录:

 对于这一点,官网的解释:

If you start a container with a volume that doesn't yet exist, Docker creates the volume for you

从上面磁盘挂载特性,在容器内操作文件就跟操作本地一样。比如在容器内创建一个测试文件test.txt,然后在宿主机观察一下:

从这说明容器的挂载成功了! 

查看挂载卷信息

如果要查看刚才redis挂载的卷信息,可以通过如下docker命令:docker inspect 容器名

在显示的容器里面查找到挂载卷信息:

容器卷管理

查看卷列表

如果要查看刚才redis挂载的卷信息,除了可以通过如下docker命令:docker inspect 容器名之外,还有专门的卷查看命令:docker volume ls

但是这个卷名字VOLUME NAME怎么这么奇怪? 因为这个是卷挂载自动生成的挂载卷名称,也称为"匿名挂载"。仔细看的话,前面的inspect里面有一项里面的Name也是类似:9287eb2555a9b48bb1f91c69489dd806e777aca0b22448d0d718e0c1c4bb7640

{
                "Type": "volume",
                "Name": "9287eb2555a9b48bb1f91c69489dd806e777aca0b22448d0d718e0c1c4bb7640",
                "Source": "/var/lib/docker/volumes/9287eb2555a9b48bb1f91c69489dd806e777aca0b22448d0d718e0c1c4bb7640/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }

而这一项就对应docker volume ls里面的一个卷:

如果查看此挂载卷信息:

会发现的确是刚才创建的,而匿名卷会默认跟宿主机的/var/lib/docker/volumes/VOLUME NAME/_data关联起来!

现在再测试一下,启动一个新的容器:

docker run --name test_redis3 -p 6379:6379 -v -v /root/redis/data2:/usr/local/etc/redis/data2 -d redis

运行之后,查看容器卷信息:

"Mounts": [
            {
                "Type": "bind",
                "Source": "/root/redis/data2",
                "Destination": "/usr/local/etc/redis/data2",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "volume",
                "Name": "109806e8fe95be922b8cb8b6a54bcc7bc664edaaca0cc2803dbb9c41bfce206c",
                "Source": "/var/lib/docker/volumes/109806e8fe95be922b8cb8b6a54bcc7bc664edaaca0cc2803dbb9c41bfce206c/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]
创建容器卷

除了前面介绍的启动时自动挂载,还可以手动创建容器卷:

# my-vol为卷名称
docker volume create my-vol

 执行一下上面的命令,并查看对应的卷列表:

具名挂载与匿名挂载

但是你会发现这种指定卷名称的创建方式,卷的名称不再是一种"看不懂"的字符串了。这种方式也叫作"具名挂载" !不过此时需要挂载的卷的宿主机路径都默认放到docker指定的目录下面了。而"匿名挂载"可以动态指定宿主机路径挂载的目录

具名挂载

有了手动创建的卷,那现在也可以通过启动时挂载具体的卷:

docker run --name test_redis -p 6379:6379 -v my-vol:/usr/local/etc/redis/data -d redis

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

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

相关文章

了解并学会使用反射

目录 一、反射的应用场景(简单了解) 二、反射的定义 三、关于反射的四个重要的类 四、反射的使用 1.Class获取一个class对象的方式 方式一:forName(): 方式二:封装类.Class: …

天风证券:水电燃气价格上涨,能推动通胀么?

水电燃气价格上涨对PPI的影响更大,6%的平均价格上涨能够拉动CPI和PPI分别上涨0.3个和0.7个百分点。 近期,国内多地上调水电燃气价格 燃气价格上涨主要针对居民端。目前燃气价格实行居民用气价格限价波动非民用气市场化定价的双轨制,这使得居…

【Linux】目录和文件相关的命令,补充:centos7系统目录结构

【Linux】Linux操作系统的设计理念之一就是“一切皆文件”(Everything is a file),即将设备、文件等都当作“文件”处理。 “文件”主要类型有:目录(即文件夹),链接文档(即快捷方式…

【Linux线程】

目录 线程是操作系统的一个执行流并发编程进程并发的优劣基于线程的并发编程Linux当中的线程 线程的创建使用pthread_createpthread_join对线程进行等待pthread_exit和pthread_cancelpthread_detach线程分离注意事项 原生线程库,详谈Linux的线程pthread库管理线程 线…

云端部署Stirling PDF:构建个人App的API调用指南(附Python源码)

今天发现一个Github的开源项目,Stirling PDF,项目地址如下:https://gitcode.com/Stirling-Tools/Stirling-PDFhttps://gitcode.com/Stirling-Tools/Stirling-PDF?utm_sourceartical_gitcode目前CSDN上已经有好几个up主都介绍了这个项目&…

cocos=》 预乘、混合(黑边、白色)

简介 预乘,指的是在数据提交给GPU之前,就对纹理的RGB分量与alpha值进行计算。 预乘计算 结果颜色 源颜色值 目标颜色值 * (1 - 源 alpha 值) result source.RGB dest.RGB * (1 - source.A); 对应的颜色混合函数设置为 gl.blendFunc(gl.ONE, gl.…

英语复习之英语形近词总结

最近在练习英语口语,有很好的练习场景,和数字人对练,还能纠错,不过开口的基础需要单词量的支撑以及语法的熟悉,因为英语的语法太简单了,没啥需要复习和注意的,音标发音的问题也可以后期再纠正&a…

Angular进阶-NVM管理Node.js实现不同版本Angular环境切换

一、NVM介绍 1. NVM简介 Node Version Manager(NVM)是一个用于管理多个Node.js版本的工具。它允许用户在同一台机器上安装和使用多个Node.js版本,非常适合需要同时进行多个项目的开发者。NVM是开源的,支持MacOS、Windows和Linux…

wechat_OCR项目打包以及如何使用

📚博客主页:knighthood2001 ✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下) 🎃知识星球:【认知up吧|成长|副业】介绍 ❤️感谢大家点赞👍&…

医学图像处理:nii格式转换(3D切片为2D)

目录 NIFTI文件结构 读取NII文件 ITK-SNAP安装 使用方法 NII转PNG NIFTI文件结构 NIFTI 格式,是一种用于存储和交换医学成像数据的文件格式,特别适用于神经影像学领域。NIFTI文件通常有两个扩展名:.nii(用于图像数据&#xf…

42.WEB渗透测试-信息收集-域名、指纹收集(4)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:41.WEB渗透测试-信息收集-域名、指纹收集(3) 关于单域名收集内容…

基于JSP的酒店客房管理系统(二)

目录 第二章 相关技术介绍 2.1 Jsp的简介 2.2 sql server 2005 的简介 第三章 系统的分析与设计 3.1 系统需求分析 1.理解需求 2.需求分析 3.2开发及运行环境 3.3功能模块的设计 3.3.1 设计目标 3.3.2 客房管理系统前台的设计 3.3.3 操作员管…

一种算法分类方式及其应用

在计算机科学领域,算法是解决问题的有效方法,而对算法进行分类有助于理解它们的特性、优劣以及在不同场景下的应用。常见的算法分类方法,包括按设计思想、问题类型、数据结构和应用领域等,每一类算法会对应有其典型和实际应用。 算…

大数据BI可视化(Echarts组件)项目开发-熟悉交互API5.0

全局echarts对象 init初始化 registerTheme注册主题 var mCharts echarts.init(document.querySelector("div"), itcast)registerMap地图图表 connect 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…

javaFor循环-打印九九乘法表

虽然所有循环结构都可以用while或者do...while表示&#xff0c;但java提供了另一种循环语句--for循环&#xff0c;使一些循环结构变得简单。for循环语句是支持迭代的一种通用结构&#xff0c;是最有效&#xff0c;最灵活的循环结构。 先写第一列&#xff1a; 运行结果&#xf…

什么是开发者门户?最佳实践及示例

原文链接&#xff1a;https://document360.com/blog/api-developer-portal-examples 开发者门户是什么&#xff1f; DevPortal 奖的主要赞助商 Provonix 对开发者门户的定义如下&#xff1a; “开发者门户&#xff08;通常缩写为 DevPortal&#xff09;是一组 API、SDK 或其他…

【电机控制】七段式SVPWM扇区、矢量作用时间计算——对比simplefoc与Ti例程

【电机控制】七段式SVPWM扇区、矢量作用时间计算——对比simplefoc与Ti例程 文章目录 前言一、simplefoc——通过角度找扇区1.通过角度找扇区理论1.通过角度找扇区2.矢量作用时间计算3.矢量切换时间计算——七段式 2.simplefoc代码3.解读simplefoc代码1.通过角度找扇区2.矢量作…

关于YOLO8学习(四)模型转换为ncnn

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 关于YOLO8学习(三)训练自定义的数据集 简介 本文将会讲解: (1)如何通过PyCharm,进行pt模型的转换,最后输出一个适合手机端使用的模型 开发环境 win10、python 3.11…

[ARM系列]coresight(一)

原文链接 目的&#xff1a;对复杂SOC实现debug和trace的架构 典型环境 包含&#xff1a;2个ARM core&#xff0c;一个DSP&#xff0c;众多coresight组件 coresight组件实现对core、DSP的debug和trace功能 环境中包含3个通路 trace通路&#xff1a;将core和DSP内部信息输出到…

【机器学习-21】集成学习---Bagging之随机森林(RF)

【机器学习】集成学习---Bagging之随机森林&#xff08;RF&#xff09; 一、引言1. 简要介绍集成学习的概念及其在机器学习领域的重要性。2. 引出随机森林作为Bagging算法的一个典型应用。 二、随机森林原理1. Bagging算法的基本思想2. 随机森林的构造3. 随机森林的工作机制 三…