Docker 数据卷管理及优化

news2024/11/15 4:50:06

目录

1 数据卷实现的目的

2 为什么要用数据卷

3 docker的两种数据卷

3.1 bind mount 数据卷

实践实例:

3.2 docker managed 数据卷

实验实例:

3.3 bind mount 数据卷和docker managed 数据卷的对比

3.3.1 相同点:

3.3.2 不同点:

3.4 数据卷容器(Data Volume Container)

3.5 备份与迁移数据卷


1 数据卷实现的目的

Docker 数据卷是一个可供容器使用的特殊目录,它绕过了容器的文件系统,直接将数据存储在宿主机上。

这样可以实现以下几个重要的目的:

  • 数据持久化:即使容器被删除或重新创建,数据卷中的数据仍然存在,不会丢失。
  • 数据共享:多个容器可以同时挂载同一个数据卷,实现数据的共享和交互。
  • 独立于容器生命周期:数据卷的生命周期独立于容器,不受容器的启动、停止和删除的影响。

2 为什么要用数据卷

docker分层文件系统

  • 性能差
  • 生命周期与容器相同

docker数据卷

  • mount到主机中,绕开分层文件系统
  • 和主机磁盘性能相同,容器删除后依然保留
  • 仅限本地磁盘,不能随容器迁移

docker提供了两种卷:

  • bind mount
  • docker managed volume

3 docker的两种数据卷

3.1 bind mount 数据卷

Docker的bind mount是一种数据持久化的方式,它允许将主机文件系统的目录或文件直接挂载到容器中。通过这种方式,可以将数据存储在宿主机上,从而避免了数据仅存在于容器内的局限性,这对于需要数据持久化或者跨容器共享数据的场景特别有用。

实践实例:

[root@node-3 ~]# docker run -it --rm --name=test \
           -v /root/shuyan:/data1:rw \
           -v /etc/hosts:/data2/hosts:ro \
           busybox
/ # ls
bin    data2  etc    lib    proc   sys    usr
data1  dev    home   lib64  root   tmp    var

/ # ls data1/
shuyanfile1  shuyanfile2  shuyanfile3  shuyanfile4  shuyanfile5
/ # ls data2/
hosts

/ # touch data1/shuyanfile{6..10}
/ # ls data1/
shuyanfile1        shuyanfile3        shuyanfile5
shuyanfile2        shuyanfile4        shuyanfile{6..10}

# 发现无法删除,因为是只读文件
/ # rm data2/hosts 
rm: remove 'data2/hosts'? y
rm: can't remove 'data2/hosts': Device or resource busy

# 查看是否创建新文件
[root@node-3 ~]# ls shuyan/
shuyanfile1  shuyanfile2  shuyanfile3  shuyanfile4  shuyanfile5  shuyanfile{6..10}

3.2 docker managed 数据卷

  • bind mount必须指定host文件系统路径,限制了移植性
  • docker managed volume 不需要指定mount源,docker自动为容器创建数据卷目录
  • 默认创建的数据卷目录都在 /var/lib/docker/volumes
  • 如果挂载时指向容器内已有的目录,原有数据会被复制到volume

一般在不建立数据卷的时候再关闭或者说停止容器的时候,数据也是会随着容器关闭删除而删除

清理未使用的 Docker 数据卷

 docker volume prune

1. 在执行 docker volume prune 命令之前,请确保你确实不再需要这些数据卷中的数据,因为

该操作是不可逆的,一旦删除数据将无法恢复。

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

方。

实验实例:

# 创建的逻辑卷默认放在/var/lib/docker/volumes/

[root@rockynode-1 ~]# ls /var/lib/docker/volumes/
backingFsBlockDev  metadata.db  
[root@rockynode-1 ~]# docker volume create mysqldate
mysqldate

[root@rockynode-1 ~]# docker volume ls 
DRIVER    VOLUME NAME
local     mysqldate

# 查看逻辑卷存放路径
[root@rockynode-1 ~]# ls /var/lib/docker/volumes/
backingFsBlockDev  metadata.db  mysqldate

 ~]# docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=shuyan \
# 将mysqldate挂载到容器内mysql的数据目录
-v mysqldate:/var/lib/mysql mysql:5.7

~]# docker ps 
CONTAINER ID   IMAGE       COMMAND                   CREATED          STATUS          PORTS                 NAMES
5c48f5ce89ba   mysql:5.7   "docker-entrypoint.s…"   14 seconds ago   Up 13 seconds   3306/tcp, 33060/tcp   mysql

查看宿主机上磁盘空间

[root@rockynode-1 ~]# ls /var/lib/docker/volumes/
backingFsBlockDev  metadata.db  mysqldate  
[root@rockynode-1 ~]# ls /var/lib/docker/volumes/mysqldate/
_data
[root@rockynode-1 ~]# ls /var/lib/docker/volumes/mysqldate/_data/
auto.cnf    client-cert.pem  ibdata1      ibtmp1      performance_schema  server-cert.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql       private_key.pem     server-key.pem
ca.pem      ib_buffer_pool   ib_logfile1  mysql.sock  public_key.pem      sys

发现都是MySQL数据目录之下的东西 

 ~]# docker inspect mysql | grep -A 6 Mounts

        "Mounts": [
            {
                "Type": "volume",
                "Name": "mysqldate",
                "Source": "/var/lib/docker/volumes/mysqldate/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",

 

在删除掉容器之后,数据也还是存在的

3.3 bind mount 数据卷和docker managed 数据卷的对

3.3.1 相同点:

两者都是 host 文件系统中的某个路径

3.3.2 不同点:

特性/功能bind mountdocker managed volume
volume 位置可任意指定/var/lib/docker/volumes/...
对已有mount point 影响隐藏并替换为 volume原有数据复制到 volume
是否支持单个文件支持不支持,只能是目录
权限控制可设置为只读,默认为读写权限无控制,均为读写权限
移植性移植性弱,与 host path 绑定移植性强,无需指定 host 目录
 ~]# docker run -it --rm --name=test -v datavolume:/etc:rw busybox
/ # ls
bin    dev    etc    home   lib    lib64  proc   root   sys    tmp    usr    var
/ # cd etc/
/etc # ls
group          hosts          mtab           nsswitch.conf  resolv.conf
hostname       localtime      network        passwd         shadow

多开一个ssh会话

[root@rockynode-1 _data]# cd /var/lib/docker/volumes/datavolume/_data/
[root@rockynode-1 _data]# ls
group  hostname  hosts  localtime  mtab  network  nsswitch.conf  passwd  resolv.conf  shadow
[root@rockynode-1 _data]# touch shuyanfile

回到容器的会话发现多了一个文件

退出容器删除,在数据卷中数据是有保存的
/etc # [root@rockynode-1 ~]# 
[root@rockynode-1 ~]# 
[root@rockynode-1 ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
58e9f5c2cd7d   busybox   "sh"      4 minutes ago   Up 4 minutes             test
[root@rockynode-1 ~]# docker rm -f test 
test


[root@rockynode-1 _data]# cd /var/lib/docker/volumes/datavolume/_data/
[root@rockynode-1 _data]# ls
group     hosts      mtab     nsswitch.conf  resolv.conf  shuyanfile
hostname  localtime  network  passwd         shadow

再等我们去创建这个数据卷的时候,他不会替换掉目录下的内容,而是对逻辑卷进行一个复制,相当于做了一个融合

[root@rockynode-1 _data]# cd /var/lib/docker/volumes/datavolume/_data/
[root@rockynode-1 _data]# ls
group     hosts      mtab     nsswitch.conf  resolv.conf  shuyanfile
hostname  localtime  network  passwd         shadow

 _data]# docker run --rm -it --name=test -v datavolume:/etc:ro busybox
/ # cd etc/
/etc # ls
group          hosts          mtab           nsswitch.conf  resolv.conf    shuyanfile
hostname       localtime      network        passwd         shadow

3.4 数据卷容器(Data Volume Container

数据卷容器(Data Volume Container)是 Docker 中一种特殊的容器,主要用于方便地在多个容器之间 共享数据卷。

[root@rockynode-1 ~]# docker run --rm -it --name=test \
-v datavolumes:/data:rw busybox


/ # [root@rockynode-1 ~]# 

# 使用--volumes-from引用test容器的数据卷
[root@rockynode-1 ~]# docker run --rm -it --name=new_test \
--volumes-from test  busybox

/ # ls 
bin    data   dev    etc    home   lib    lib64  proc   root   sys    tmp    usr    var
/ # ls data/
group          hosts          mtab           nsswitch.conf  resolv.conf
hostname       localtime      network        passwd         shadow

3.5 备份与迁移数据卷

备份数据卷

[root@rockynode-1 ~]# docker run --rm -it --name=test -v datavolumes:/data:rw busybox
/ # ls 
bin    data   dev    etc    home   lib    lib64  proc   root   sys    tmp    usr    var
/ # ls data/
group          hosts          mtab           nsswitch.conf  resolv.conf
hostname       localtime      network        passwd         shadow
/ # [root@rockynode-1 ~]# 

# 使用--volumes-from参数引用 test 容器的数据卷
# 再使用 pwd 将当前工作目录进行挂载,来接收在容器内打包数据的操作
# 其实开启new_test 容器就是作为一个备份的媒介 为将 test容器内的data数据进行备份
# 打包之后放在容器内的挂载点,实现与宿主机的数据共享
[root@rockynode-1 ~]# docker run --rm -it --name=new_test 
--volumes-from test -v `pwd`:/mount busybox

/ # ls
bin    dev    home   lib64  proc   sys    usr
data   etc    lib    mount  root   tmp    var
/ # ls mount/
anaconda-ks.cfg      dockerfile           script               ??
auth                 harbor               ??                   ??
certs                images.tar.gz        ??                   ??
certsshuyan.crt      nginx-latest.tar.gz  ??                   ??
certsshuyan.key      registry.tag.gz      ??
/ # ls data/
group          hosts          mtab           nsswitch.conf  resolv.conf
hostname       localtime      network        passwd         shadow

# 将镜像进行打包
/ # tar czf /mount/data.tar.gz /data/*
tar: removing leading '/' from member names

# ctrl + pq 退出容器
/ # [root@rockynode-1 ~]# 

查看被挂载的目录从容器内共享的 打包的tar包

[root@rockynode-1 ~]# ls
公共  文档  anaconda-ks.cfg  certsshuyan.key  images.tar.gz
模板  下载  auth             data.tar.gz      nginx-latest.tar.gz
视频  音乐  certs            dockerfile       registry.tag.gz
图片  桌面  certsshuyan.crt  harbor           script

解压测试是否实现

[root@rockynode-1 ~]# tar xzf data.tar.gz 
[root@rockynode-1 ~]# ls data
group  hostname  hosts  localtime  mtab  network  
nsswitch.conf  passwd  resolv.conf  shadow

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

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

相关文章

Ubuntu安装android studio(压缩包版)

#这里适用于linux版压缩版# 1、官网下载Linux版本压缩包 2、下载的文件 .gz,将这个包双击解压出来 3、直接进入解压包的bin目录下,右击在终端打开 3.1、输入 ./studio.sh ./studio.sh 如图所示: 后续操作见图片 下载的时候,直接cancel&…

HIVE 数据仓库工具之第二部分(数据库相关操作)

HIVE 数据仓库工具之第二部分(数据库相关操作) 一、Hive 对数据库的操作1.1 创建数据库1.1.1 创建数据库语法1.1.3 示例 1.2 使用数据库1.2.1 使用数据库语法1.2.2 示例 1.3 修改数据库1.3.1 修改数据库的语法1.3.2 示例 1.4 删除数据库1.4.1 删除数据库…

STM32基于HAL库串口printf使用和接收

我们这里使用HAL库直接用cubemx生成代码配置串口 1.打开cubemx,选择MCU型号 2.我这里使用的是STM32F103C8T6,根据自己的型号选择,这里不限制型号 3.选择时钟源 4.系统设置 5时钟配置 5.选择和配置串口 5.配置中断和中断优先级 6.工程设置…

ElasticSearch 集群的索引别名管理

一、索引别名 (一)添加索引别名 1.给单个索引添加别名 POST http://10.0.0.101:9200/_aliases{"actions":[{"add":{"index":"yedu-linux85","alias":"Linux容器运维"} },{"add&q…

Xinstall赋能,H5与App完美融合,打造极致用户体验

随着移动互联网的迅猛发展,App已经成为我们日常生活中不可或缺的一部分。然而,在App推广和运营的过程中,推广者们常常面临着一个难题:如何将H5网页上的用户顺利引导至App内,实现用户增长和活跃度提升?今天&…

ShenNiusModularity项目源码学习(3:用户登录)

第一篇文章中搞错了一件事,ShenNiusModularity项目启动并非需要同时启动ShenNius.Admin.Mvc和ShenNius.Admin.Hosting两个项目,仅需启动前者即可登录后台管理系统,而后者是支持前后端分离的API宿主项目,供其它前后端分离的项目调用…

uniapp组件中的emit声明触发事件

emit解析 在 uniapp 中,emit 主要用于组件间通信,特别是在子组件需要向父组件或者其他组件发送消息的时候。具体用途包括: 子传父数据:子组件通过 $emit 触发一个事件,并携带参数,父组件监听这个事件并对参…

uniapp 封装uni.login 实现全局调用

封装utils app.vue中 使用globalData 注册 utils 页面中使用方法 定义app 调用方法

GAMES202——作业3 Screen Space Ray Tracing

任务 为场景实现屏幕空间的全局光照效果 1.直接光照: 实现ssrFragmentShader中的EvalDiffuse(wi, wo, uv) 和EvalDirectionalLight(uv) 函数,并在 main 函数中实现直接光照的效果。 2.屏幕空间光线求交:实现RayMarch(ori, dir, out hitPos) …

Open3D mesh 网格简化(顶点聚类)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始mesh 3.2聚类后的mesh Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新&#xff0…

开源 AI 智能名片 O2O 商城小程序:引入淘汰机制,激发社交电商新活力

摘要:本文深入探讨在社交电商领域中,开源 AI 智能名片 O2O 商城小程序如何通过设置淘汰机制,实现“良币驱逐劣币”,激励士气,为社交电商企业注入新的活力。通过分析缺乏淘汰机制的弊端以及设置淘汰机制的优势&#xff…

sickos 靶机渗透(wolf cms 渗透,squid 代理)

靶机信息 vulnhub靶机 主机发现 192.168.50.152 为靶机Ip ┌──(kali㉿kali)-[~/testSickos] └─$ sudo nmap -sn 192.168.50.0/24 [sudo] password for kali: Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-30 09:56 CST Nmap scan report for 192.168.50.1 …

Linux 下查找运行中的 Java 进程及 .jar 文件位置

在 Linux 环境中,有时我们需要查找正在运行的 Java 进程以及它们对应的 .jar 文件位置。本文将介绍如何使用命令行工具来实现这一目标。 前言 在 Linux 系统中,我们经常需要监控正在运行的应用程序,特别是在出现问题时,了解应用程…

使用API有效率地管理Dynadot域名,添加账户中的联系人信息

前言 Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮箱&…

Android 移除最近任务列表展示

Android 设置应用在最近任务列表不展示 android 中想要实现在最近任务列表中不展示,实现的方式很简单. 在Mainifests的MainActivity中添加: android:excludeFromRecents“true” 如下所示: <activity android:name".MainActivity"android:excludeFromRecents&…

Nvidia股价前景引投资者情绪波动:杠杆ETF数据透视市场风向

一、Nvidia业绩前瞻&#xff1a;看跌情绪升温 随着Nvidia&#xff08;NVDA&#xff09;季度业绩发布日的临近&#xff0c;市场中的投资者情绪似乎正经历着微妙的变化。据多家发行杠杆型交易所交易基金&#xff08;ETF&#xff09;的机构数据显示&#xff0c;投资者对看跌Nvidia…

【机器学习】支持向量机(SVM)的对偶性、核方法以及核技巧

引言 在SVM中&#xff0c;通过引入拉格朗日乘子&#xff0c;可以将原始问题转化为对偶问题&#xff0c;这种转换具有几个重要的优点&#xff0c;包括简化计算和提供更直观的优化问题的解释 文章目录 引言一、支持向量机&#xff08;SVM&#xff09;的对偶性1.1 原始问题&#x…

【知识库系列】MPR/多模态方向观察:图像视频与3D生成

多模态背后的backbone会长成什么样&#xff1f; 各种模态到梯度下降到最后会不会都差不多&#xff1f; Sora 是不是已经被追上了? 我们真的把视频数据都用好了吗&#xff1f; 知识库完整文档&#xff1a; MPR/多模态方向观察&#xff1a;图像视频与3D生成&#xff1a;https…

【Unity3D优化】优化内置shader的内存占用

一、性能分析 监控项目线上的崩溃情况&#xff0c;绝大多数崩溃都是因为低端设备&#xff0c;运行时内存不足&#xff0c;在运行过程中申请开辟新的内存时Crash了。因此&#xff0c;不定期继续优化内存占用。 性能分析首先主要靠Unity3d的Memory Profiler监控一些可追踪到的内存…

初识redis:学习Java客户端

Redis服务器在官网公开了使用的协议&#xff0c;叫做RESP。任何一个第三方都可以通过上述的协议&#xff0c;来实现出一个和redis服务器通信的客户端程序。 Java生态中&#xff0c;封装好了RESP协议&#xff0c;实现的redis客户端是有很多的&#xff0c;此处使用的是jedis&…