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

news2024/11/17 16:52:50

传送门

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

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

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

相关文章

1.初探MPI——MPI简介

系列文章目录 初探MPI——MPI简介初探MPI——点对点通信初探MPI——集体通信 文章目录 系列文章目录前言一、MPI_COMM_WORLD, size and ranks二、Hello WorldInstructions 总结参考 前言 Message Passing Interface (MPI) 是一种标准化的消息传递库接口规范。该标准是消息传递…

结构体的对齐原则

一、C语言结构体对齐步骤: 1.每个成员对齐 2.总体对齐 二、C语言结构体对齐规则: 1.结构体第一个成员存放在相较于结构体变量起始位置的偏移量为0的位置 2.从第二个成员开始,往后的每一个成员都要对齐到某个对齐数的整数倍处。 对齐数:结构体成员自身的…

C 408—《数据结构》图、查找、排序专题考点(含解析)

目录 Δ前言 六、图 6.1 图的基本概念 6.2 图的存储及基本操作 6.3 图的遍历 6.4 图的应用 七、查找 7.2 顺序查找和折半查找 7.3 树型查找 7.4 B树和B树 7.5 散列表 八、排序 8.2 插入排序 8.3 交换排序 8.4 选择排序 8.5 归并排序和基数排序 8.6 各种内部排序算法的比较及…

33.基础乐理-原调、移调、转调、离调

原调、移调、转调、离调分为两类:原调是一个定义、一个名词,移调、转调、离调可以称之为是技术或者操作,是一种动词。也就是分为名词和动词两类。 原调: 一种音乐原本的调,就是它的原调,或者说按照简谱的调…

Codeforces Round 941 (Div. 2) (A~D)

1966A - Card Exchange 题意&#xff1a; 思路&#xff1a;手玩一下发现当存在某个数字个数超过k个&#xff0c;那么就能一直操作下去。那么答案就是k-1. void solve() {cin >> n >> m;map<int,int>mp;int maxx 1;for(int i 0 ; i < n ; i ){int x;c…

【热闻速递】Google 裁撤 Python研发团队

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 【&#x1f525;热闻速递】Google 裁撤 Python研发团队引入研究结论 【&#x1f5…

Android AOSP探索之Ubantu下Toolbox的安装

文章目录 概述安装Toolbox解决运行的问题 概述 由于最近需要进军android的framework,所以需要工具的支持&#xff0c;之前听说江湖上都流传source insight,我去弄了一个破解版&#xff0c;功能确实强大&#xff0c;但是作为多年android开发的我习惯使用android studio。虽然使…

SpringWebFlux RequestBody多出双引号问题——ProxyPin抓包揪出真凶

缘起 公司有个服务做埋点收集的&#xff0c;可以参考我之前的文章埋点日志最终解决方案&#xff0c;今天突然发现有些数据日志可以输出&#xff0c;但是没法入库。 多出的双引号 查看Flink日志发现了JSON解析失败&#xff0c;Flink是从Kafka拿数据&#xff0c;Kafka本身不处…

2024深圳杯数学建模竞赛D题(东三省数学建模竞赛D题):建立非均质音板振动模型与参数识别模型

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓&#xff08;浏览器打开&#xff09; https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 2024深圳杯数学建模竞赛D题&#xff08;东三省数学建模竞赛D题&#xff0…

深入理解多层感知机MLP

1. 基础理论 神经网络基础&#xff1a; 目标&#xff1a;了解神经网络的结构&#xff0c;包括神经元、权重、偏置和激活函数。 神经网络是由多个层次的神经元组成的网络&#xff0c;它模拟了人脑处理信息的方式。每个神经元可以接收输入、处理输入并生成输出。这一过程涉及到…

Vue项目打包APK----Vue发布App

时隔多年我又来跟新了&#xff0c;今天给大普家及下前端Vue傻瓜式发布App&#xff0c;话不多说直接上干货。 首先准备开发工具HBuilder X&#xff0c;去官网直接下载即可&#xff0c;算了直接给你们上地址吧HBuilderX-高效极客技巧。 打开软件&#xff0c;文件-->新建--&g…

通用漏洞评估系统CVSS4.0简介

文章目录 什么是CVSS&#xff1f;CVSS 漏洞等级分类历史版本的 CVSS 存在哪些问题&#xff1f;CVSS 4.0改进的“命名法”改进的“基本指标”考虑“OT/IOT”新增的“其他指标”CVSS 4.0存在的问题 Reference: 什么是CVSS&#xff1f; 在信息安全评估领域&#xff0c;CVSS为我们…

可视化大屏也在卷组件化,组件绝对是效率利器呀。

组件化设计在B端上应用十分普遍&#xff0c;其实可视化大屏组件更为规范&#xff0c;本期分享组件化设计的好处&#xff0c;至于组件源文件如何获取&#xff0c;大家都懂的。 组件化设计对可视化大屏设计有以下几个方面的帮助&#xff1a; 提高可重用性&#xff1a; 组件化设…

打印x型图案Java

KiKi学习了循环&#xff0c;BoBo老师给他出了一系列打印图案的练习&#xff0c;该任务是打印用“*”组成的X形图案。 输入描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线…

Codeforces Round 942 (Div. 2)

Codeforces Round 942 (Div. 2) Codeforces Round 942 (Div. 2) A. Contest Proposal 题意&#xff1a;给出两个长度为n的非递减排序的ab序列&#xff0c;通过向a序列中插入新元素&#xff0c;然后排序后删除最大元素&#xff0c;使得两个长度为n的排列中每一个 a i a_i ai​…

软件定义汽车落地的五大关键要素

1、架构升级 1.1 软件架构&#xff1a;分层解耦、服务化、API 接口标准化 随着企业向软件定义汽车开发方法的转变&#xff0c;软件架构也需要同步进行升级&#xff0c;引入面向服务的架构&#xff08;Service-Oriented Architecture&#xff0c;简称 SOA&#xff09;方法论。…

探索Plotly交互式数据可视化

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 探索Plotly交互式数据可视化 在数据科学和数据分析领域&#xff0c;可视化是一种强大的工具…

LeetCode 105.从前序与中序遍历构造二叉树

题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,nul…

Window(Qt/Vs)软件添加版本信息

Window&#xff08;Qt/Vs&#xff09;软件添加版本信息 文章目录 Window&#xff08;Qt/Vs&#xff09;软件添加版本信息VS添加版本信息添加资源文件添加版本定义头自动更新版本添加批处理脚本设置生成事件 Qt添加版本信息添加资源文件文件信息修改自动更新版本 CMake添加版本信…

HR招聘测评,什么是好用的在线人才测评工具?

选择哪一种人才测评工具&#xff1f;特别是每年的招聘高峰季节。根据以往的工作经验&#xff0c;一个好用的在线人才工具&#xff0c;可以起到事半功倍的效果&#xff0c;带给人力资源工作者一个轻松的工作体验。因此&#xff0c;我们必须对好用的人才测评工具有一个基本的认识…