Docker--Docker Volume(存储卷)

什么是存储卷?

Docker的存储卷是一种将宿主机的本地文件系统中的某个目录与容器内部的文件系统中的某个目录建立绑定关系的机制。这种绑定关系意味着,当在容器的这个目录下写入数据时,会同步到宿主机的这个目录中;同样,在宿主机的这个目录下写入数据也会同步到容器的这个目录下。

存储卷的作用

  • 数据持久化:存储卷使得数据可以独立于容器的生命周期存在。即使容器被删除,只要存储卷不被删除,数据就不会丢失。
  • 数据共享:多个容器可以共享同一个存储卷,从而实现数据共享。
  • 提高数据访问效率:通过存储卷,容器可以直接访问宿主机上的数据,避免了通过镜像层访问数据的低效率问题。

存储卷的类型

  • Bind mount volume(绑定挂载卷):指向主机文件系统上用户指定位置的卷。使用-v--volume命令时,需要指定宿主机上卷的名称或完整路径,以及容器内的挂载点。如果指定的卷不存在,Docker会自动创建它。
  • Docker-managed volume(Docker管理卷):由Docker守护进程在主机文件系统的一部分中创建的托管卷。使用docker volume create命令可以创建一个新的Docker管理卷。这些卷存储在主机文件夹中(在Linux系统中,通常位于/var/lib/docker/volumes/路径下),并由Docker进行管理。
  • tmpfs mount (临时数据卷):映射到于宿主机内存中,一旦容器停止运行,tmpfs mounts 会被移除,数据就会丢失,用于高性能的临时数据存储。

命令操作

创建卷 docker create volume

docker volume create [OPTIONS] [VOLUME]

创建一个存储卷;

参数:

  • -d, --driver:指定驱动,默认是 local
  • –label:指定元数据

例如:

root@VM-8-12-ubuntu:~#docker volume create my-vol 
my-vol

docker volume inspect

查看卷的详细信息

docker volume inspect [OPTIONS] VOLUME [VOLUME...]

参数:

  • -f:指定相应个格式,如 json

例如:
在这里插入图片描述

docker volume ls

列出存储卷的列表

docker volume ls [OPTIONS]

参数:

  • –format:指定相应个格式,如 json,table
  • –filter,-f: 过滤
  • -q: 仅显示名称

例如
在这里插入图片描述

docker volume rm

删除存储卷,需要让容器不使用对应卷才可以删除

docker volume rm [OPTIONS] VOLUME [VOLUME...]

参数:

  • -f,–force:强制删除

docker volume prune

删除不使用的卷

docker volume prune [OPTIONS]

参数:

  • -f,–force:强制删除
  • –filter:过滤

通过 docker run 命令 选项 -v 进行创建卷

docker run -v name:directory[:options]

第一个参数:卷名称
第二个参数:卷映射到容器的目录
第三个参数:选项,如 ro 表示 readonly

例如:

docker run -d --name devtest -v myvol2:/app nginx:1.23.4

在这里插入图片描述
通过命令查看:

docker container inspect devtest

在这里插入图片描述

通过 docker run 命令 选项–mount进行创建卷

目的:完成目录映射

--mount '<key>=<value>,<key>=<value>'

参数:

  • type : 类型表示 bind, volume, or tmpfs
  • source ,src :对于命名卷,这是卷的名称。对于匿名卷,省略此字段。
  • destination,dst,target:文件或目录挂载在容器中的路径
  • ro,readonly: 只读方式挂载

例如:

docker run -d --name devtest2 --mount source=myvol2,target=/app nginx:1.23.4

通过命令查看:

docker container inspect devtest2

在这里插入图片描述

操作实例:docker -v 创建管理卷

创建一个nginx容器,映射端口8080,创建管理卷为test_volume :

docker run --name mynginx1 -d -p 8080:80 -v test_volume:/usr/share/nginx/html:ro nginx:1.23.4

查看对应信息:

docker inspect test_volume

在这里插入图片描述
进入挂载点的对应目录里

cd /data/var/lib/docker/volumes/test_volume/_data

在这里插入图片描述
修改对应的内容:

echo "Test Volume " > index.html

浏览器查看:
在这里插入图片描述

进入到容器中,并且进入到对应的html目录下

docker exec -it mynginx1 bash
cd /usr/share/nginx/html

在这里插入图片描述
无法对其进行删除
指定 ro 的话宿主机可以修改,但是容器里面无法修改

卷的生命周期:如果卷没有被删除,那么不管容器怎么样,卷仍然存在;只有卷被删除了,那么卷的生命周期才会结束.
如果两个容器指定同一个卷,那么卷可以被共享;

利用docker run 参数-v创建绑定卷

docker run -v name:directory[:options] .........

第一个参数:宿主机目录,这个和管理卷是不一样的
第二个参数:卷映射到容器的目录
第三个参数:选项,如 ro 表示 readonly

例如:

docker run -d -it --name mynginx2 -v "$(pwd)"/target:/app nginx:latest

如果 target 目录不存在,启动不会报错,这是-v 和–mount 方式的区别
这样 当前目录下target目录就与容器的app目录绑定好了。

利用docker run 参数 --mount 参数创建绑定卷

--mount '<key>=<value>,<key>=<value>'

参数:

  • type : 类型表示 bind, volume, or tmpfs
  • source ,src :宿主机目录,这个和管理卷是不一样的。
  • destination,dst,target:文件或目录挂载在容器中的路径
  • ro,readonly: 只读方式挂载

例如:
创建一个容器,端口映射为8081,将宿主机的webapp1/挂载到容器指定目录中

docker run -d -p 8081:80 --name mynginx4 --mount type=bind,source=/data/ahri/webapp1,target=/usr/share/nginx/html nginx:1.23.4

如果 webapp1 目录不存在会启动报错

查看容器的详细内容,可以看到对应的挂载信息:

docker inspect mynginx4

在这里插入图片描述
查看容器的html目录下的内容,发现为空:

docker exec -it mynginx4 ls /usr/share/nginx/html

这是 bind mount 模式和 volume 模式最大的不同点

进入宿主机的webapp1目录中,向index.html目录写入内容:

cd webapp1
echo "Test Bind Volume" >>index.html

通过浏览器可以看到相对应的内容:
在这里插入图片描述

操作实例 绑定卷的共享

再次创建一个容器绑定相同的卷:

docker run -d --name mynginx5 -p 8082:80 -v /data/ahri/webapp1:/usr/share/nginx/html nginx:1.23.4
curl 127.0.0.1:8081
curl 127.0.0.1:8082

在这里插入图片描述
可以看到内容相同;

改变文件内容,结果随之改变:

echo "bind mount after edit" > index.html

在这里插入图片描述

临时卷 tmpfs 的创建 -v

不同于其他卷,tmpfs临时卷无法共享;且这个功能只能在Linux上使用.

创建一个容器,并且有一个临时卷挂载在html目录下:

docker container run --name tmpfs1 -d -p 8080:80 --tmpfs /usr/share/nginx/html nginx:1.23.4

进入到容器中的html目录下,并查看目录下的内容,发现tmpfs 也会覆盖容器里面的文件:

docker exec -it tmpfs1 bash
cd /usr/share/nginx/html
ls -l

向index.html写入内容,并通过浏览器查看:

echo "Hello World from tmpfs" > index.html

在这里插入图片描述
退出容器并停止运行,再次启动容器并进入到html目录下,发现目录为空,也就是说内容是存在内存里面的:

exit
docker stop tmpfs1
docker start tmpfs1
docker exec -it tmpfs1 bash
ls /usr/share/nginx/html/

临时卷 tmpfs 的创建 --mount

不同于其他卷,tmpfs临时卷无法共享;且这个功能只能在Linux上使用.

docker  run --name tmpfs1 -d -p 8080:80 --mount type=tmpfs,destination=/usr/share/nginx/thml,tmpfs-size=1m nginx:1.23.4

–mount还能指定参数来限制内存的大小.

实例 tmpfs失踪

创建一个容器,并进入:

docker run -d -it --name tmptest nginx:1.23.4
docker exec -it tmptest bash

创建一个app目录向该目录创建一个新文件mylabel.txt ,然后在宿主机查看:

mkdir -p /app
echo 1 > /app/mylabel.txt
exit
find / -name mylabel.txt

在这里插入图片描述
可以看到,文件被找到了,是因为他在容器的可写层.

创建一个有临时卷的容器,挂载点是/app,然后进入到容器中:

docker run -d --name tmptest2 --tmpfs /app nginx:1.23.4
docker exec -it tmptest2 bash

向该目录写入新文件,退出到宿主机,并查看,发现查看不到对应文件,所以 tmpfs 的内容不是存储在我们的容器的可写层里面的。

echo 222 > /app/mynewlabel.txt
exit
find / -name mynewlabel.txt

实例 mysql的灾难性恢复

创建一个mysql容器,并且将宿主机的mysql-data挂载到容器中,设置初始密码123456

docker run --name mysql-demo -e MYSQL_ROOT_PASSWORD=123456 -it -d -v /data/ahri/mysql-data:/var/lib/mysql mysql:5.7

查看容器的挂载详情:

docker container inspect mysql-demo | grep "Mounts" -A 10

在这里插入图片描述
进入容器并启动MySQL客户端:

docker exec -it mysql-demo /bin/bash
mysql -u root -p

创建一个数据库:
在这里插入图片描述

create database user;

创建一个表并写入数据:

use user;
create table student(sno char(3),sname varchar(10));
insert into student values('1','zs'),('2','ls');

退出容器,并查看mysql-data挂载的内容:

exit

在这里插入图片描述
停止容器的运行并删除:

docker stop mysql-demo
docker rm mysql-demo

虽然容器被删除了,但数据仍然保存在mysql-data目录下.
我们重新启动容器

docker run --name mysql-demo-new -e MYSQL_ROOT_PASSWORD=123456 -it -d -v /data/ahri/mysql-data:/var/lib/mysql mysql:5.7
docker exec -it mysql-demo-new bash
mysql -u root -p

进入到user数据库中,并查看列表:
在这里插入图片描述

use user;

在这里插入图片描述

常见问题:什么时候用 Volume,什么时候用 bind、tmpfs?

Volume

**Volume是Docker管理的一个存储卷,独立于容器的生命周期。**当容器被删除时,Volume中的数据不会丢失,除非显式地删除Volume。

适用场景:

  • 数据持久化:需要确保数据在容器删除或重新创建后仍然可用。
  • 数据共享:多个容器之间需要共享数据。
  • 数据管理:利用Docker的Volume管理功能,可以更方便地进行数据的备份、恢复和迁移。

Bind mounts

Bind mounts是将宿主机上的文件或目录直接挂载到容器中,实现数据的共享和访问。这种方式的数据由宿主机管理,而不是Docker

适用场景:

  • 灵活的数据挂载:需要指定宿主机上的任意文件或目录作为挂载目标。
  • 现有数据的集成:容器需要访问宿主机上已经存在的数据,例如配置文件、日志文件等。
  • 性能要求:在某些情况下,Bind mounts可能比Volume具有更好的性能,因为它们直接访问宿主机的文件系统。

Tmpfs

Tmpfs是一种特殊的挂载方式,它将数据存储在宿主机的内存中,而不是持久化存储。当容器停止时,Tmpfs中的数据将被删除。

适用场景:

  • 临时存储:需要临时存储数据,例如在处理请求时生成的中间结果。
  • 提高性能:需要频繁读写临时数据的场景,因为Tmpfs的数据存储在内存中,读写速度更快。
  • 安全性:不希望数据在容器停止后仍然保留在宿主机上。

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

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

相关文章

STM32裸机开发转FreeRTOS教程

目录 1. 简介2. RTOS设置&#xff08;1&#xff09;分配内存&#xff08;2&#xff09;查看任务剩余空间&#xff08;3&#xff09;使用osDelay 3. 队列的使用&#xff08;1&#xff09;创建队列&#xff08;1&#xff09;直接传值和指针传值&#xff08;2&#xff09;发送/接收…

用豆包MarsCode IDE打造精美数据大屏:从零开始的指南

原标题&#xff1a;用豆包MarsCode IDE&#xff0c;从0到1画出精美数据大屏&#xff01; 豆包MarsCode IDE 是一个云端 AI IDE 平台&#xff0c;通过内置的 AI 编程助手&#xff0c;开箱即用的开发环境&#xff0c;可以帮助开发者更专注于各类项目的开发。 作为一名前端开发工…

PCB原理图的编译设置

设置步骤&#xff1a; 进入-->Project Options...&#xff0c;对照设置“致命错误”部分来设置即可

LInux单机安装Redis

1. 安装gee工具包 由于Redis是基于c语言编写的所以安装的时候需要先安装gee以及gcc的依赖,yum云用不了可以看一下这个 linux 替换yum源镜像_更换yum镜像源-CSDN博客 yum install -y gcc tcl 2. 添加redis的压缩包 3. 上传到Linux 上传到 /usr/local/src 目录、这个目录一般用于…

黄仁勋演讲总结(2种显卡,1个开源大模型,1个数据采集平台)

研发算力显卡RTX50系列&#xff0c;PC端显卡GB10&#xff0c;开源大模型Cosmos&#xff08;用于机器人和自动驾驶&#xff09;&#xff0c; Isaac GR00T&#xff08;人形机器人的数据采集平台&#xff09;。 新一代 RTX 50 系列显卡 RTX 50 系列 GPU&#xff0c;相对之前系列&a…

初学Linux电源管理

学习文档出处&#xff1a; 万字整理 | 深入理解Linux电源管理&#xff1a;万字整理 | 深入理解Linux电源管理-CSDN博客 电源管理 因为设备需要用电&#xff0c;而且设备中的各个硬件所需要的电压是不一样的。故计算机需要对硬件的电源状态管理。但是电能并不是免费的&#x…

基于开发/发布/缺陷分离模型的 Git 分支管理实践20250103

基于开发/发布/缺陷分离模型的 Git 分支管理实践 引言 在现代软件开发中&#xff0c;合理的分支管理策略是保证项目成功的关键因素之一。本文将详细介绍一种基于开发/发布/缺陷分离的 Git 分支管理模型&#xff0c;这种模型不仅能提升团队协作效率&#xff0c;还能确保代码质…

数据库回滚:大祸临头时

原文地址 什么是数据库回滚&#xff1f; 数据库技术中&#xff0c;回滚是通过撤销对数据库所做的一项或多项更改&#xff0c;将数据库返回到先前状态的操作。它是维护数据完整性和从错误中恢复的重要机制。 什么时候需要数据库回滚&#xff1f; 数据库回滚在以下几个场景中很…

1月7日星期二今日早报简报微语报早读

1月7日星期二&#xff0c;农历腊月初八&#xff0c;早报#微语早读。 1、公安部&#xff1a;已为一线民警配备执法记录仪130万余部&#xff0c;规范现场执法&#xff1b; 2、浙江提出2035年全省域基本实现共同富裕&#xff1b; 3、“汕头牛肉丸”有新标准&#xff01;1月6日起…

数据结构:时间复杂度和空间复杂度

我们知道代码和代码之间算法的不同&#xff0c;一定影响了代码的执行效率&#xff0c;那么我们该如何评判算法的好坏呢&#xff1f;这就涉及到了我们算法效率的分析了。 &#x1f4d6;一、算法效率 所谓算法效率的分析分为两种&#xff1a;第一种时间效率&#xff0c;又称时间…

Clisoft SOS设置Workarea

Clisoft SOS设置Workarea 本人也是刚刚接触这个软件&#xff0c;可能有些方面不够完善&#xff0c;欢迎大佬指点。 这里就不演示创建创建Server和Project&#xff0c;可以参考Clisoft SOS设置Server和Project 创建Workarea 创建好目录并设置好权限 # 创建组 [bhlumaster ~]$…

安徽省乡镇界面图层+arcgis数据shp格式-乡镇名称和编码2020年+wgs84坐标内容测评

最新安徽省乡镇界面图层arcgis数据shp格式-乡镇名称和编码2020年wgs84坐标无偏移

LabVIEW软件Bug的定义与修改

在LabVIEW软件开发过程中&#xff0c;bug&#xff08;程序错误或缺陷&#xff09;指的是程序中导致不符合预期行为的任何问题。Bug可能是由于编码错误、逻辑漏洞、硬件兼容性问题、系统资源限制等因素引起的。它可能会导致程序崩溃、功能无法正常执行或输出结果不符合预期。理解…

WebRTC 在视频联网平台中的应用:开启实时通信新篇章

在当今这个以数字化为显著特征的时代浪潮之下&#xff0c;实时通信已然稳稳扎根于人们生活与工作的方方面面&#xff0c;成为了其中不可或缺的关键一环。回首日常生活&#xff0c;远程办公场景中的视频会议让分散各地的团队成员能够跨越地理距离的鸿沟&#xff0c;齐聚一堂共商…

oracle位运算、左移右移、标签算法等

文章目录 oracle基础函数创建bitor(按位或)函数bitnot(按位非)函数bitxor(按位异或)函数左移函数BITSHIFT()函数(实测不可用&#xff0c;废弃掉该方案)右移函数(略&#xff0c;有此场景吗?) 实际应用资质字典增删改查分别对应什么操作新增对应操作查询对应的操作修改删除(正向…

【银河麒麟高级服务器操作系统实例】tcp半链接数溢出分析及处理全过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://document.kylinos.cn 服务器环境以及配置 系统环境 物理机/虚拟机/云…

[文献精汇]使用PyCaret预测 Apple 股价

2024年专题 量化专题 共计 102 篇 涵盖量化框架、数据篇、风险与收益、策略篇、多因子模型、编程篇、图形篇、机器学习、Backtrader等主题&#xff0c;全方面了解量化领域知识。机器学习共计29篇 涵盖机器学习基本介绍、监督学习、集成算法、无监督学习以及机器学习实战。研报…

新一代智能工控系统网络安全合规解决方案

01.新一代智能工控系统概述 新一代智能工控系统是工业自动化的核心&#xff0c;它通过集成人工智能、工业大模型、物联网、5G等技术&#xff0c;实现生产过程的智能化管理和控制。这些系统具备实时监控、自动化优化、灵活调整等特点&#xff0c;能够提升生产效率、保证产品质量…

【简博士统计学习方法】第1章:1. 统计学习的定义与分类

自用笔记 1. 统计学习的定义与分类 1.1 统计学习的概念 统计学习&#xff08;Statistical Machine Learning&#xff09;是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科。 以计算机和网络为平台&#xff1b;以数据为研究对象&#xff1b;以…

PS 解析成ES流

最近做ps 解析&#xff0c;整理了一下&#xff1a; 解析如下&#xff1a; 这里理解为&#xff0c;后面会跟着pes头&#xff0c;在长度F00D-2-0A字节以后。