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

注意

  1. 在执行 docker volume prune 命令之前,请确保你确实不再需要这些数据卷中的数据,因为该操作是不可逆的,一旦删除数据将无法恢复。

  2. 如果有重要的数据存储在数据卷中,建议先进行备份,或者确保数据已经被妥善保存到其他地方。

建立数据卷

[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

注意事项

  • 在备份和恢复数据卷时,确保路径正确,避免数据丢失。

  • 如果数据卷较大,备份和恢复过程可能需要较长时间,请耐心等待。

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

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

相关文章

【星云 Orbit • STM32F4】04.一触即发:GPIO 外部中断

【星云 Orbit- • STM32F4】04. 一触即发&#xff1a;外部中断控制 摘要 本文详细介绍了如何使用STM32F407微控制器的HAL库实现外部中断功能。通过配置GPIO引脚作为外部中断源&#xff0c;并在中断回调函数中处理按键事件&#xff0c;实现了按键控制LED状态翻转的功能。本文旨…

探索Elasticsearch:索引的CRUD

在企业环境中&#xff0c;Elasticsearch的索引CRUD&#xff08;创建Create、读取Read、更新Update、删除Delete&#xff09;操作是非常基础且频繁使用的功能。这些操作对于管理和维护数据至关重要&#xff0c;尤其是在处理大规模数据集和需要实时搜索与分析的应用场景中。 目录…

React antd的datePicker自定义,封装成组件

一、antd的datePicker自定义 需求&#xff1a;用户需要为日期选择器的每个日期单元格添加一个Tooltip&#xff0c;当鼠标悬停时显示日期、可兑换流量余额和本公会可兑流量。这些数据需要从接口获取。我需要结合之前的代码&#xff0c;确保Tooltip正确显示&#xff0c;并且数据…

NVIDIA GPU 架构详解:Pascal、Volta、Turing、Ampere、Ada、Hopper、Blackwell

目录 1. Pascal&#xff08;帕斯卡&#xff09;架构&#xff08;2016&#xff09;关键技术性能特性代表产品应用场景 2. Volta&#xff08;伏特&#xff09;架构&#xff08;2017&#xff09;关键技术性能特性代表产品应用场景 3.Turing&#xff08;图灵&#xff09;架构&#…

Linux 命令行的基本命令(生信)

常见的操作系统包括 Windows、Mac OS X 和 Unix 。Linux 是类 Unix 操作系 统&#xff0c; 可安装在各种各样的电脑硬件设备&#xff0c; 从手机、平板电脑、路由器到超级计算 机。Linux 是一个领先的操作系统&#xff0c;世界上最快的十台超级计算机运行的都是 Linux 操作系统…

ECharts--中国地图(无敌详细)

前段时间需要做一个中国地图的页面&#xff0c;要求是展示各地产品的销量&#xff0c;我就在网上搜了很多ECharts的资料&#xff0c;学习了一下怎么使用。 本着互相学习&#xff0c;共同进步的原则&#xff0c;特此分享一下自己的学习经验以及使用技巧。如果有用的话可以给老弟…

QwenVL 2.5-本地安装编译布署全教程

开篇 DeepSeek开源后我国又开源了一个震撼大模型,QwenVL2.5,这是一个多模态的模形,它可以认图、识图、更能作图,还能读懂video。 Qwen2.5-VL 的主要特点如下所示: 感知更丰富的世界:Qwen2.5-VL 不仅擅长识别常见物体,如花、鸟、鱼和昆虫,还能够分析图像中的文本、图表…

【含文档+PPT+源码】基于SpringBoot电脑DIY装机教程网站的设计与实现

项目介绍 本课程演示的是一款 基于SpringBoot电脑DIY装机教程网站的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…

React高级内容探索

flushSync确保了DOM立即更新 flushSync让你强制React同步刷新提供回调中的任何更新&#xff0c;这确保了DOM立即更新 flushSync是DOM更新之后的&#xff0c;像vue中的nextTick&#xff1a; import { useState,useRef} from "react" import { flushSync} from &quo…

基于 MetaGPT 自部署一个类似 MGX 的多智能体协作框架

MGX&#xff08;由 MetaGPT 团队开发的 mgx.dev&#xff09;是一个收费的多智能体编程平台&#xff0c;提供从需求分析到代码生成、测试和修复的全流程自动化功能。虽然 MGX 本身需要付费&#xff0c;但您可以通过免费服务和开源项目搭建一个类似的功能。以下是一个分步骤的实现…

主时钟与虚拟时钟约束

1、主时钟约束 1.1、主时钟约束语法&#xff1a; create_clock -name< clock_name > -period <period> -waveform{ <rise_time> <fall_time> } [get_ports< port_name >] 说明&#xff1a; name 之后的<clock_name> 是clk 的name&a…

CyberRT(apollo) 定时器模块简述及bug分析

timer 模块 timer的定义&#xff0c;cyberrt中timer模块用于设置定时器任务&#xff0c;字面意思&#xff0c;设置设置定时周期及出发频次&#xff08;周期 or oneshot)&#xff0c;到达指定时间时间触发callback time wheel 时钟节拍轮&#xff0c;常见的定时器设计&#x…

网络安全月度报告

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 3.1.1网络安全现状及安全挑战 网络的出现给人们的工作和生活带来了极大的便利&#xff0c;但同时也带来了极大的安全风险。在信息传输和交换时&#xff0c;需要对…

nio多线程版本

多线程多路复用 多线程NIO&#xff0c;&#xff0c;就是多个线程&#xff0c;每个线程上都有一个Selector&#xff0c;&#xff0c;&#xff0c;比如说一个系统中一个线程用来接收请求&#xff0c;&#xff0c;剩余的线程用来读写数据&#xff0c;&#xff0c;每个线程独立干自…

一周学会Flask3 Python Web开发-Flask3之表单处理WTForms安装与定义WTForms表单类

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们平时开发项目&#xff0c;都会用到表单&#xff0c;编写表单&#xff0c;提交表单&#xff0c;验证表单&#xff0c;如果…

基于NI USRP 硬件的下一代O-RAN研究测试台​

目录 基于NI SDR硬件的下一代O-RAN研究测试台​挑战&#xff1a;解决方案&#xff1a; 基于NI SDR硬件的下一代O-RAN研究测试台​ “OAIC提供了一个开放平台&#xff08;包括软件架构、库和工具集&#xff09;&#xff0c;用于对基于AI的无线接入网(RAN)控制器进行原型开发和测…

【开源-鸿蒙土拨鼠大理石系统】鸿蒙 HarmonyOS Next App+微信小程序+云平台

✨本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✨踩坑不易&#xff0c;还希望各位大佬支持一下&#xff0c;在GitHub给我点个 Start ⭐⭐&#x1f44d;&#x1f44d; ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/HarmonyOS-groundhog-mar…

笔记本电脑本地部署ollama大模型(显存不足调用CUDA Unified Memory方法)

软硬件&#xff1a;win11,NVIDIA GeForce RTX 3050 显存4g 一.ollama模型最低要求 1. Llama 3.1 (8B) 模型 GPU: 至少需要 1 张具有 16 GB 显存的 GPU&#xff08;例如 NVIDIA Tesla V100 或 A100&#xff09;。CPU: 高性能的多核处理器&#xff08;例如 Intel Xeon 或 AMD …

【Rancher】简化Kubernetes容器管理与部署的开源平台

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是Rancher 2、Rancher诞生里程 …

vscode通过ssh远程连接(linux系统)不能跳转问题

1.问题描述 unbantu中的vscode能够通过函数跳转到函数定义&#xff0c;而windows通过ssh连接unbantu的vscode却无法跳转 2.原因&#xff1a; 主要原因是这里缺少插件&#xff0c;这里是unbantu给主机的服务器&#xff0c;与ubantu本地vscode插件相互独立&#xff0c;能否跳转…