Docker 数据卷管理及优化
Docker 数据卷是一个可供容器使用的特殊目录,它绕过了容器的文件系统,直接将数据存储在宿主机上。通过数据卷,可以实现数据的持久化、共享以及独立于容器生命周期的管理。
1.1 为什么要用数据卷
Docker 分层文件系统的特点
-
性能差:Docker 的分层文件系统(Union File System)在写入操作时会创建新的层,导致性能下降。
-
生命周期与容器相同:容器删除后,其文件系统中的数据也会丢失。
Docker 数据卷的优势
-
绕开分层文件系统:数据卷直接挂载到宿主机的文件系统中,性能与宿主机磁盘相同。
-
数据持久化:即使容器被删除或重新创建,数据卷中的数据仍然存在,不会丢失。
-
数据共享:多个容器可以同时挂载同一个数据卷,实现数据的共享和交互。
-
独立于容器生命周期:数据卷的生命周期独立于容器,不受容器的启动、停止和删除的影响。
Docker 提供了两种卷类型:
-
Bind Mount:将主机上的目录或文件挂载到容器中。
-
Docker Managed Volume:由 Docker 自动管理的数据卷,不需要指定挂载源。
1.2 Bind Mount 数据卷
特点
-
将主机上的目录或文件挂载到容器中。
-
使用直观高效,易于理解。
-
使用
-v选项指定路径,格式为<host path>:<container path>。 -
如果
-v选项指定的路径不存在,挂载时会自动创建。
注意事项
1. “如果挂载的路径在宿主机上不存在,Docker 会自动创建该路径。”
这句话的意思是:当你使用绑定挂载(bind mount)时,如果宿主机上的目录路径不存在,Docker 会自动创建这个目录。
举例说明:
假设你运行以下命令:
docker run -d --name my_container -v /haha/test:/container/path nginx:1.23
-
如果宿主机上
/haha/test目录不存在,Docker 会自动创建/haha/test目录。 -
这个行为是为了确保挂载操作能够成功执行,因为挂载需要一个有效的宿主机路径。
2. “如果需要挂载的文件或目录在宿主机上不存在,可能会导致容器启动失败。”
这句话的意思是:如果你尝试挂载一个文件,而这个文件在宿主机上不存在,Docker 会报错并导致容器启动失败。
举例说明:
假设你运行以下命令:
docker run -d --name my_container -v /haha/test/file.txt:/container/file.txt nginx:1.23
-
如果宿主机上
/haha/test/file.txt文件不存在,Docker 会报错,因为 Docker 不会自动创建文件。它只会自动创建目录,而不会创建文件。 -
错误信息可能类似于:
lstat /haha/test/file.txt: no such file or directory -
这种情况下,容器无法启动,因为挂载操作失败了。
总结:(自动创建的是目录,而不是文件)
-
目录:如果挂载的路径(目录)在宿主机上不存在,Docker 会自动创建该目录。
-
文件:如果挂载的文件在宿主机上不存在,Docker 不会自动创建文件,而是会报错并可能导致容器启动失败。
1.3 Docker Managed 数据卷
特点
-
不需要指定挂载源,Docker 自动为容器创建数据卷目录。
-
默认创建的数据卷目录位于
/var/lib/docker/volumes中。 -
如果挂载时指向容器内已有的目录,原有数据会被复制到数据卷中。
示例
1. 不需要指定挂载源,Docker 自动为容器创建数据卷目录
命名卷由 Docker 自动管理,不需要指定宿主机上的路径。当你在运行容器时使用命名卷时,Docker 会自动创建一个卷,并将其挂载到容器内的指定路径。
举例说明:
docker run -d --name my_container -v my_volume:/container/path nginx:1.23
-
在这个例子中,
my_volume是一个命名卷的名称。 -
Docker 会自动在内部存储中创建一个名为
my_volume的卷,并将其挂载到容器内的/container/path。 -
你不需要指定宿主机上的路径,Docker 会管理这个卷的存储位置。
2. 默认创建的数据卷目录位于 /var/lib/docker/volumes 中
Docker 管理的命名卷默认存储在宿主机的 /var/lib/docker/volumes 目录下。每个命名卷都有一个独立的目录,用于存储数据。
举例说明:
假设你创建了一个名为 my_volume 的命名卷,Docker 会在 /var/lib/docker/volumes 下创建一个对应的目录:
/var/lib/docker/volumes/my_volume/_data
-
_data目录是实际存储卷数据的地方。 -
你可以通过以下命令查看所有命名卷:
docker volume ls -
如果需要查看卷的具体存储位置,可以运行:
docker volume inspect my_volume
3. 如果挂载时指向容器内已有的目录,原有数据会被复制到数据卷中
当你将一个命名卷挂载到容器内的某个路径时,如果该路径在容器中已经存在并且包含数据,Docker 会将这些数据复制到命名卷中。这个过程称为“数据初始化”。
举例说明:
假设你运行以下命令:
docker run -d --name my_container -v my_volume:/container/existing/path nginx:1.23
-
如果
/container/existing/path在容器中已经存在,并且包含一些文件或目录,Docker 会在第一次挂载时将这些内容复制到my_volume中。 -
之后,无论何时重新挂载该卷,容器内的
/container/existing/path都会指向my_volume,并且数据会保持一致。
注意:
-
这个数据复制的过程只会在第一次挂载时发生。
-
如果命名卷已经存在并且包含数据,Docker 不会覆盖卷中的数据,而是会直接使用卷中的数据。
清理未使用的 Docker 数据卷
[root@docker ~]# docker volume prune
注意:
在执行
docker volume prune命令之前,请确保你确实不再需要这些数据卷中的数据,因为该操作是不可逆的,一旦删除数据将无法恢复。如果有重要的数据存储在数据卷中,建议先进行备份,或者确保数据已经被妥善保存到其他地方。
建立数据卷
[root@docker ~]# docker volume create leevol1
[root@docker ~]# ls -l /var/lib/docker/volumes/leevol1/_data/
查看卷
[root@docker ~]# docker volume ls
DRIVER VOLUME NAME
local leevol1
使用建立的数据卷
[root@docker _data]# docker run -d --name web1 -p 80:80 -v leevol1:/usr/share/nginx/html nginx
e76706848323d6c329c41c4140903f8cc441458daf1459d9016bd1ed0ab3360a
root@docker _data]# cd /var/lib/docker/volumes/leevol1/_data
[root@docker _data]# ls
[root@docker _data]# echo leevol1 > index.html
[root@docker _data]# curl 172.25.254.100
leevol1
1.4 数据卷容器(Data Volume Container)
数据卷容器(Data Volume Container)是 Docker 中一种特殊的容器,主要用于方便地在多个容器之间共享数据卷。
建立数据卷容器
[root@docker ~]# docker run -d --name datavol \
-v /tmp/data1:/data1:rw \
-v /tmp/data2:/data2:ro \
-v /etc/resolv.conf:/etc/hosts busybox
使用数据卷容器
[root@docker ~]# docker run -it --name test --rm --volumes-from datavol busybox
/ # ls
bin data1 data2 dev etc home lib lib64 proc root sys tmp usr var
/ # cat /etc/resolv.conf
# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.nameserver 114.114.114.114
search timinglee.org# Based on host file: '/etc/resolv.conf' (legacy)
# Overrides: []
/ # touch data1/leefile1
/ # touch /data2/leefile1
touch: /data2/leefile1: Read-only file system
/ #
数据卷容器的优势
-
方便共享:通过数据卷容器,可以在多个容器之间轻松共享数据卷。
-
简化管理:数据卷容器可以集中管理数据卷,便于维护和迁移。
1.5 Bind Mount 数据卷和 Docker Managed 数据卷的对比
相同点
-
两者都是基于宿主机文件系统中的某个路径。
不同点
| 特性 | Bind Mount 数据卷 | Docker Managed 数据卷 |
|---|---|---|
| 路径指定 | 必须指定宿主机路径 | 不需要指定宿主机路径,由 Docker 自动管理 |
| 移植性 | 依赖宿主机路径,移植性较差 | 独立于宿主机路径,移植性较好 |
| 管理方式 | 需要手动管理宿主机路径 | 由 Docker 自动管理,支持 docker volume 命令 |
| 性能 | 与宿主机磁盘性能相同 | 与宿主机磁盘性能相同 |
| 适用场景 | 适合需要直接访问宿主机文件的场景 | 适合需要在多个容器之间共享数据的场景 |
1.6 备份与迁移数据卷
备份数据卷
# 建立容器并指定使用卷到要备份的容器
[root@docker ~]# docker run --volumes-from datavol \
-v `pwd`:/backup busybox \ # 把当前目录挂载到容器中用于保存备份数据
tar zcf /backup/data1.tar.gz /data1 # 备份数据到本地
数据恢复
docker run -it --name test -v leevol1:/data1 -v `pwd`:/backup busybox /bin/sh -c "tar zxf /backup/data1.tar.gz;/bin/sh"
/ # ls
backup data1 etc lib proc sys usr
bin dev home lib64 root tmp var
/ # cd data1/ # 查看数据迁移情况
/data1 # ls
index.html leefile1
注意事项
-
在备份和恢复数据卷时,确保路径正确,避免数据丢失。
-
如果数据卷较大,备份和恢复过程可能需要较长时间,请耐心等待。
相关文章:
Docker 数据卷管理及优化
Docker 数据卷是一个可供容器使用的特殊目录,它绕过了容器的文件系统,直接将数据存储在宿主机上。通过数据卷,可以实现数据的持久化、共享以及独立于容器生命周期的管理。 1.1 为什么要用数据卷 Docker 分层文件系统的特点 性能差ÿ…...
Hi3516CV610车牌识别算法源码之——车牌识别算法初体验
本文讲述如何使用Hi3516CV610开发板读取本地图片,运行车牌识别算法推理,得到车牌信息并打印; 下一篇将介绍Hi3516CV610开发板如何从sensor摄像头获取图像,运行车牌识别算法推理,得到车牌信息并打印; 一、准…...
使用内置命令查看笔记本电池健康状态
如何使用powercfg /batteryreport命令查看笔记本电池健康状态 在Windows系统中,了解笔记本电池的健康状态对于维护电脑性能和预测电池寿命至关重要。Windows 10和Windows 11系统提供了一个内置命令powercfg /batteryreport,可以生成一份详细的电池使用情…...
HONOR荣耀MagicBook 15 2021款 独显(BOD-WXX9,BDR-WFH9HN)原厂Win10系统
适用型号:【BOD-WXX9】 MagicBook 15 2021款 i7 独显 MX450 16GB512GB (BDR-WFE9HN) MagicBook 15 2021款 i5 独显 MX450 16GB512GB (BDR-WFH9HN) MagicBook 15 2021款 i5 集显 16GB512GB (BDR-WFH9HN) 链接:https://pan.baidu.com/s/1S6L57ADS18fnJZ1…...
transformer架构的语言模型保存的内容与格式详解
前文我们已经详细讲述了基于pytorch框架下的transformer架构如何从零开始构建一个小型字符级语言模型,构建过程中涵盖数据准备、模型架构设计、训练、评估与生成的整个流程。我们已经了解了各个部分的细节,而且已经提供了完整的python代码。现在需要了解我们构建好的模型如何…...
win本地vscode通过代理远程链接linux服务器
时间:2025.2.28 1. win本地下载nmap.exe nmap官网 https://nmap.org/或者 https://nmap.org/download#windows下载win版本并安装。 2. vscode插件Remote-SSH 插件下载Remote-SSH 3. 配置 按照图中顺序配置ssh 1.点击左侧工具栏的“小电视”图标 2.点击ssh的…...
【C++编程探索】01前缀和来临!优点多多!八千字详解
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 【PingdiGuo_guo:一名C、数据结构、算法等爱好者,用所学帮助大家,感谢关注!】 新年刚过,在这里先祝各位 新年快乐!!…...
文件下载技术的终极选择:`<a>` 标签 vs File Saver.js
文件下载技术的终极选择:<a> 标签 vs File Saver.js 在 Web 开发中,文件下载看似简单,实则暗藏玄机。工作种常纠结于 <a> 标签的原生下载和 File Saver.js 等插件的灵活控制之间。本文将从原理、优缺点、场景对比到实战技巧&…...
《机器学习数学基础》补充资料:矩阵的LU分解
本文是对《机器学习数学基础》第2章2.3.3节矩阵LU分解的拓展。 判断是否可LU分解 并非所有矩阵都可以实现LU分解。 定理1: 若 n n n 阶可逆矩阵 A \pmb{A} A 可以进行LU分解,则 A \pmb{A} A 的 k k k 阶顺序主子阵(leading principal s…...
[笔记.AI]AI知识科普提纲
仅供参考 1.AI基础认知 1.1什么是什么AI 1.2核心概念 1.2.1机器学习、深度学习、神经网络 1.2.2模型:模型、大模型、模型参数 1.2.3多模态 1.2.4生成式AI & 判别式AI 1.3发展与现状 2.大模型 2.1主流大模型 2.1.1分类 2.1.2各…...
Spring Security 如何防止 CSRF 攻击?
目录 一、CSRF 攻击简介二、Spring Security 防止 CSRF 攻击的机制1. 默认启用 CSRF 保护2. CSRF 令牌的生成与验证3. 配置与自定义4. 在请求中包含 CSRF 令牌 三、最佳实践四、总结 一、CSRF 攻击简介 CSRF(Cross-Site Request Forgery)攻击࿰…...
使用 Kubeflow 和 Ray 构建机器学习平台
使用 Kubeflow 和 Ray 构建一个稳健的 ML 平台。我们将深入讨论 Kubeflow 和 Ray 的独特功能,以及它们如何互补,共同创建一个强大的 ML 生态系统 集中化 ML 平台的需求 随着企业在 ML 旅程中的成熟,初始 ML 项目的临时性质逐渐让位于对更结构化和可扩展方法的需求。集中化…...
SEO炼金术(4)| Next.js SEO 全攻略
在上一篇文章 SEO炼金术(3)| 深入解析 SEO 关键要素 中,我们深入解析了 SEO 关键要素,包括 meta 标签、robots.txt、canonical、sitemap.xml 和 hreflang,并探讨了它们在搜索引擎优化(SEO)中的作…...
每日十个计算机专有名词 (7)
Metasploit 词源:Meta(超越,超出) exploit(漏洞利用) Metasploit 是一个安全测试框架,用来帮助安全专家(也叫渗透测试人员)发现和利用计算机系统中的漏洞。你可以把它想…...
StarRocks 在爱奇艺大数据场景的实践
作者:林豪,爱奇艺大数据 OLAP 服务负责人 小编导读: 本文整理自爱奇艺工程师在 StarRocks 年度峰会的分享,介绍了爱奇艺 OLAP 引擎演化及引入 StarRocks 后的效果。 在广告业务中,StarRocks 替换 ImpalaKudu 后&#x…...
蓝桥杯好题推荐----高精度乘法
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 题目链接 P1303 A*B Problem - 洛谷https://www.luogu.com.cn/problem/P1303 解题思路 这道题的思路,其实和前面差不多,我们主要说一下最为关键的部分&…...
Linux网络 数据链路层
在Linux网络中,数据链路层位于物理层之上,网络层之下,其主要职责是将网络层的IP数据包封装成帧,并通过物理链路发送到目标设备。同时,它还负责接收来自物理层的帧,并将其解封装为数据包,传递给网…...
量子计算可能改变世界的四种方式
世界各地的组织和政府正将数十亿美元投入到量子研究与开发中,谷歌、微软和英特尔等公司都在竞相实现量子霸权。 这其中的利害关系重大,有这么多重要的参与者,量子计算机的问世可能指日可待。 为做好准备,,我们必须了…...
React 组件基础介绍
基本概念:一个组件就是用户界面的一部分,可以有自己的逻辑和外观,组件之间可以互相嵌套、复用多次。每个组件就是一个首字母大写的函数,内部存放了组件的逻辑和试图UI,渲染组件只需要把组件 当成 标签 书写。App 可以视…...
ETL系列-数据抽取(Extract)
ETL的过程 1、数据抽取:确定数据源,定义数据接口,选择数据抽取方法(主动抽取或由源系统推送)。 2、数据清洗:处理不完整数据、错误数据、重复数据等,确保数据的准确性和一致性。(是…...
DLSS-G转FSR3:突破性技术革命让老款RTX显卡重获新生
DLSS-G转FSR3:突破性技术革命让老款RTX显卡重获新生 【免费下载链接】dlssg-to-fsr3 Adds AMD FSR 3 Frame Generation to games by replacing Nvidia DLSS Frame Generation (nvngx_dlssg). 项目地址: https://gitcode.com/gh_mirrors/dl/dlssg-to-fsr3 在图…...
从零到一:用JavaScript在Screeps Arena中构建你的首个RTS AI
1. 初识Screeps Arena:编程与策略的完美结合 Screeps Arena是一款独特的编程策略游戏,它将即时战略(RTS)的核心玩法与JavaScript编程完美融合。与传统RTS游戏不同,在这里你不是通过鼠标点击来指挥单位,而是…...
释放CPU潜能:CPUDoc智能优化全攻略
释放CPU潜能:CPUDoc智能优化全攻略 【免费下载链接】CPUDoc 项目地址: https://gitcode.com/gh_mirrors/cp/CPUDoc 你是否曾遇到过这样的困境:花高价配置的电脑,却在运行大型软件或游戏时表现平平?明明是八核处理器&#…...
Android应用集成AI:调用MiniCPM-o-4.5-nvidia-FlagOS实现移动端智能对话
Android应用集成AI:调用MiniCPM-o-4.5-nvidia-FlagOS实现移动端智能对话 你有没有想过,给自己的手机App装上一个“大脑”,让它能像朋友一样跟你聊天、解答问题?过去,这听起来像是科幻电影里的情节,但今天&…...
s2-pro开源TTS价值:填补中文专业级开源语音合成模型空白
s2-pro开源TTS价值:填补中文专业级开源语音合成模型空白 1. 为什么我们需要专业级中文TTS 在语音技术领域,中文语音合成(TTS)长期面临一个尴尬局面:虽然商业解决方案众多,但高质量的开源模型却寥寥无几。这种状况直到s2-pro的出…...
OpenClaw未来展望:Qwen3-4B模型与自动化生态的演进方向
OpenClaw未来展望:Qwen3-4B模型与自动化生态的演进方向 1. 从个人实践看OpenClaw的现状与挑战 去年冬天,当我第一次在本地MacBook上部署OpenClaw时,那种"让AI直接操控我的电脑"的新奇感至今难忘。通过简单的自然语言指令…...
零基础玩转OpenClaw:Qwen3-32B镜像云端体验与技能市场探索
零基础玩转OpenClaw:Qwen3-32B镜像云端体验与技能市场探索 1. 为什么选择云端体验OpenClaw 第一次接触OpenClaw时,我被它的自动化能力深深吸引,但本地安装的复杂程度让我望而却步。直到发现星图平台的Qwen3-32B镜像,才真正打开了…...
图图的嗨丝造相-Z-Image-Turbo作品集:多场景渔网袜AI图像生成,每一张都惊艳
图图的嗨丝造相-Z-Image-Turbo作品集:多场景渔网袜AI图像生成,每一张都惊艳 1. 模型核心能力展示 1.1 专业领域定位 图图的嗨丝造相-Z-Image-Turbo是专精于大网渔网袜图像生成的AI模型,基于Z-Image-Turbo框架开发,通过LoRA技术…...
从Proteus 8.13升级到8.15:为了串口通信,我做了这些事(附完整迁移与配置指南)
从Proteus 8.13升级到8.15:串口通信修复与平滑迁移实战指南 当你的电路仿真项目频繁遭遇串口通信异常,调试窗口不断弹出"COM Port Error"时,很可能是Proteus 8.13版本的已知缺陷在作祟。作为深度使用者,我经历过三次关键…...
Free RTOS:任务状态,任务管理与调度理论
目录 1.任务状态 1.1 FreeRTOS的任务状态: 1.2 阻塞状态(Blocked) 1.3 暂停状态(Suspended) 原型如下: 1.4 就绪状态(Ready) 1.5 完整的状态转换图 1.6 代码 2.任务管理与调度理论 2.1 调度 2.2 FreeRTOS调度 STM32CubeMX FreeRTOS源码 代…...
