docker 数据卷 (二)

1,为什么使用数据卷

卷是在一个或多个容器内被选定的目录,为docker提供持久化数据或共享数据,是docker存储容器生成和使用的数据的首选机制。对卷的修改会直接生效,当提交或创建镜像时,卷不被包括在镜像中。

总结为两个作用:

  • 持久化数据
  • 共享数据

 特点:

  • 即时生效
  • 卷的更新不影响镜像
  • 即使容器停止或被删除,卷默认也一致存在

容器示意图

2,数据卷基本操作

2.1,创建数据卷

使用如下命令可以创建一个数据卷

lisen@ubuntu:~$ sudo docker volume create db_vol
db_vol

使用这种方式创建的数据卷可也被docker volume管理,如查看,删除等。新建的数据卷被保存在/var/lib/docker/volumes目录下。

2.2,查看数据卷

使用一下命令可以查看数据卷

lisen@ubuntu:~$ sudo docker volume ls
DRIVER              VOLUME NAME
local               db_vol

2.3,查看数据卷详细信息

docker volume inspect 命令以json的格式显示数据卷的详细信息

lisen@ubuntu:~$ sudo docker volume inspect db_vol
[{"CreatedAt": "2020-02-01T11:33:52+08:00","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/db_vol/_data","Name": "db_vol","Options": {},"Scope": "local"}
]
lisen@ubuntu:~$

2.4,数据卷删除

lisen@ubuntu:~$ sudo docker volume rm db_vol
db_vol
lisen@ubuntu:~$

3,数据卷的使用

3.1,先创建数据卷在挂载

1)在使用数据卷前先创建一个,docker volume create 数据卷名称

lisen@ubuntu:~$ sudo docker volume create data-vol
data-vol

2)创建容器使用数据卷(mount)

lisen@ubuntu:~$ sudo docker run -d -it \
> --name volumetest \
> --mount source=data-vol,target=/data \
> ubuntu
1ab0c61bf24c52aeb0f3d0764f8743b9579eeb3a3b79a12a04cfa3ecf1bd50a9

注:加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车,1ab0c61bf24c52aeb0f3d0764f8743b9579eeb3a3b79a12a04cfa3ecf1bd50a9
是生成的容器id,--mount 后没有带type参数,默认为 volume

简写方式(-v):

lisen@ubuntu:~$ sudo docker run -d -it \
> --name volumetest \
> -v data-vol:/data \
> ubuntu

3)创建成功后切换到宿主机的 /var/lib/docker/volumes/data-vol/_data目录(如果没有权限,先切换为root用户), 创建一个用与测试的文件,数据卷挂载成功,则在容器中也可以看到这个文件。

root@ubuntu:/var/lib/docker/volumes/data-vol/_data# echo "hello volume" > test.txt
root@ubuntu:/var/lib/docker/volumes/data-vol/_data# ls
test.txt

为方便对比,新打开一个命令终端进入容器,查看在宿主机上创建的文件在容器的对应目录中是否存在

root@ubuntu:/# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1ab0c61bf24c        ubuntu              "/bin/bash"         21 minutes ago      Up 21 minutes                           volumetest
root@ubuntu:/# docker exec -it 1ab0 /bin/bash
root@1ab0c61bf24c:/# ls -l /data
total 4
-rw-r--r-- 1 root root 13 Feb  1 04:30 test.txt
root@1ab0c61bf24c:/# cat /data/test.txt
hello volume
root@1ab0c61bf24c:/#

4)在容器中对测试文件进行修改,然后来到宿主机的对应目录,验证文件是否修改。

root@1ab0c61bf24c:/# echo "update in container" >> /data/test.txt
root@1ab0c61bf24c:/# cat /data/test.txt
hello volume
update in container
root@1ab0c61bf24c:/#

此时容器中的文件已经改变,到宿主机的对应目录中进行查看

root@ubuntu:/var/lib/docker/volumes/data-vol/_data# cat test.txt
hello volume
update in container

3.2,直接挂载宿主机目录

通过这种方式不需要事先创建数据卷,直接指定宿主机的一个目录挂载到容器中,但宿主机中对应的目录要存在,否则会报类似于下面的异常:
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /root/vdata.
1)mount方式创建容器命令如下:

root@ubuntu:/# mkdir /home/lisen/vdata
root@ubuntu:/# docker run -d -it \
> --name volumetest02 \
> --mount type=bind,source=/home/lisen/vdata,target=/vdata \
> ubuntu
530677db6f3d9e94057e8acb389afe3d514e4df3ac4418e80eaa08567a926fa0

2)-v方式创建(可以理解为简写方式):

root@ubuntu:/# docker run -dit --name volumetest02 -v /home/lisen/vdata:/vdata ubuntu
9de51fd527dc81ddcadf47fd5b61a6969b884493b0fac710f4a2d83efbfccb33

可以使用上例类似的方面来对数据卷进行验证。具体过程不再详细描述。

注:建议使用3.1所示的方式使用数据卷,直接挂载目录的方式不被docker volume管理。

3.3,只读数据卷

创建的数据卷默认是可以读写的,这适合于绝大多数情况,也可以将卷设置为只读的,如下所示
1)mount方式创建容器命令如下:

root@ubuntu:/# mkdir /home/lisen/vdata
root@ubuntu:/# docker run -d -it \
> --name volumetest02 \
> --mount type=bind,source=/home/lisen/vdata,target=/vdata,ro \
> ubuntu
530677db6f3d9e94057e8acb389afe3d514e4df3ac4418e80eaa08567a926fa0

2)-v方式创建(可以理解为简写方式):

root@ubuntu:/# docker run -dit --name volumetest02 -v /home/lisen/vdata:/vdata:ro ubuntu
9de51fd527dc81ddcadf47fd5b61a6969b884493b0fac710f4a2d83efbfccb33

数据卷的主要作用是数据持久化和数据共享,所以一般不用只读方式。

4,数据卷容器

用途:数据卷容器主要目的是多个容器之间共享一些持续更新的数据,数据卷容器也是一个容器,专门提供数据卷给其他容器挂载。

4.1,新建数据卷容器

root@ubuntu:/# docker run -it -d --name data-volume-con -v /data ubuntu
26552f43385236a8e41ecd727ad3e4ccf9da6a99bcc5ef0fa49a81c17c49b9e5

26552f4338... 是创建的数据卷容器Id

4.2,新建一个容器来使用数据卷容器

root@ubuntu:/# docker run -it -d --name db-con-1 --volumes-from data-volume-con ubuntu
263999d5aa43dac11c619cc1f644b736339031c459644b68cab8ce044a66ab53

参数--volumes-from用于指定数据卷容器

进入新建的容器,在挂载的目录中(data目录,即创建数据卷容器时指定的目录)新建一个测试文件。

root@ubuntu:/# docker exec -it db-con-1 /bin/bash
root@263999d5aa43:/# ls
bin   data  etc   lib    media  opt   root  sbin  sys  usr
boot  dev   home  lib64  mnt    proc  run   srv   tmp  var
root@263999d5aa43:/# echo "test volume container" > /data/test.txt
root@263999d5aa43:/# ls /data
test.txt
root@263999d5aa43:/# cat /data/test.txt
test volume container
root@263999d5aa43:/#

然后来到进入数据卷容器,验证刚才新建的测试文件在数据卷容器中是否存在:

root@ubuntu:/# docker exec -it data-volume-con /bin/bash
root@26552f433852:/# ls
bin   data  etc   lib    media  opt   root  sbin  sys  usr
boot  dev   home  lib64  mnt    proc  run   srv   tmp  var
root@26552f433852:/# cd data
root@26552f433852:/data# ls
test.txt
root@26552f433852:/data# cat test.txt
test volume container
root@26552f433852:/data#

4.3,数据卷容器的备份与恢复

1)数据卷的备份
创建一个容器,该容器既挂载了需要备份的数据卷(有volumes-from参数指定),又挂载了用来备份数据的数据卷(可以用-v参数指定),通过tar压缩命令,将volumes-from参数指定的需要备份的数据卷,压缩到用来备份的数据卷中(等同于保存到了宿主机对应的目录中)。

我们将刚才创建的数据卷备份

root@ubuntu:/# docker run --rm \
> --name backup \
> --volumes-from data-volume-con \
> -v /host-backup:/con-backup \
> ubuntu tar cvf /con-backup/backup200201.tar /data
/data/
/data/test.txt
tar: Removing leading `/' from member names
root@ubuntu:/# ls
bin   dev       etc   host-backup  lib    lost+found  mnt  proc  run   snap  sys  usr  vmlinuz
boot  dump.rdb  home  initrd.img   lib64  media       opt  root  sbin  srv   tmp  var
root@ubuntu:/#
  • --rm 参数,指定了创建的容器为临时容器,运行完后将自动删除,我们只是借助这个容器完成备份,备份完成后数据存放于宿主机中,容器自然也就不需要了。
  • --volumes-from 参数,指定了需要备份的数据卷容器
  • -v 参数,指定了用来备份数据的数据卷,/host-backup为宿主机目录,/con-backup为对应的容器目录
  • tar 命令完成数据压缩,注意压缩的源为容器目录,因为压缩命令实际上实在容器中执行的,确切的说是在backup容器中执行(--name参数指定的),压缩完成后自然也会保存到宿主机目录。

2)数据还原
新建一个数据卷容器,这个容器作为存放还原数据的容器

root@ubuntu:/# docker run -it --name data-volume-con2 -v /data ubuntu

创建一个临时容器,既挂载了用于存放还原数据的数据卷容器,又挂载了存有备份数据的数据卷,然后使用tar命令,将备份的数据解压到存放还原数据的数据卷中。

root@ubuntu:/# docker run --rm \
> --name huanyuan \
> --volumes-from data-volume-con2 \
> -v /host-backup:/container-back \
> ubuntu tar xvf /container-back/backup200201.tar -C /data
data/
data/test.txt
root@ubuntu:/#
  • --rm 参数,请参见“数据备份”部分的解释
  • --volumes-from 参数,指定用于保存还原数据的容器
  • -v 参数, 用于指定存有备份数据的数据卷,/host-backup是宿主机上用来存放备份数据的目录,将其挂载到容器的/container-back目录,tar命令通过/container-back获取到备份的数据,然后解压。

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

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

相关文章

Orbit 使用指南 10|在机器人上安装传感器 | Isaac Sim | Omniverse

如是我闻: 资产类(asset classes)允许我们创建和模拟机器人,而传感器 (sensors) 则帮助我们获取关于环境的信息,获取不同的本体感知和外界感知信息。例如,摄像头传感器可用于获取环境的视觉信息&#xff0c…

ADB环境配置和基础使用

目录 一、ADB简介工作原理 二、安装ADB驱动程序配置环境变量验证ADB安装 三、启用USB调试模式四、连接设备到计算机五、使用ADB命令安装/卸载包Android 设备与电脑传输文件exit 退出目录日志操作指令系统操作指令adb ps命令 一、ADB简介 ADB全称是Android Debug Bridge&#x…

CentOS系统部署YesPlayMusic播放器并实现公网访问本地音乐资源

文章目录 1. 安装Docker2. 本地安装部署YesPlayMusic3. 安装cpolar内网穿透4. 固定YesPlayMusic公网地址 本篇文章讲解如何使用Docker搭建YesPlayMusic网易云音乐播放器,并且结合cpolar内网穿透实现公网访问音乐播放器。 YesPlayMusic是一款优秀的个人音乐播放器&am…

校园大数据平台的顶层设计与微观应用PDF下载

校园大数据平台的顶层设计与微观应用文档,是一份全面深入的解决方案,旨在构建一个集数据收集、存储、处理、分析及可视化于一体的综合平台。该设计以提升教育教学质量、优化资源配置、增强学生服务体验和提高管理效率为核心目标,通过大数据分…

c++的学习之路:3、入门(2)

一、引用 1、引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。 怎么说呢,简单点理解就是你的小名,家里人叫你小名&#…

基于springboot和vue的旅游资源网站的设计与实现

环境以及简介 基于vue, springboot旅游资源网站的设计与实现,Java项目,SpringBoot项目,含开发文档,源码,数据库以及ppt 环境配置: 框架:springboot JDK版本:JDK1.8 服务器&#xf…

谷歌seo营销服务有哪些服务?

以我们举例,如果你在做B2B外贸建站,这里有全套保姆式托管服务,让你既省心又省力,七天就能搞定网站建设,快速上线,再来就是谷歌白帽SEO,我们这边强调的是纯白帽操作,专注于高质量的原…

今天聊聊新零售

一、什么是新零售? 2016年,在杭州举行的“云栖大会”上,马云发表了讲话,首次提出了“新零售”这一概念。 1.1 新零售概念 新零售,英文是New Retailing,新零售是对人货场的重构。人是消费者、销售人员、…

CISP 4.2备考之《物理与网络通信安全》知识点总结

文章目录 第 1 节 物理与环境安全第 2 节 网络安全基础第 3 节 网络安全技术与设备第 1 部分 防火墙第 2 部分 入侵检测系统第 3 部分 其他安全产品 第 4 节 网络安全设计规划 第 1 节 物理与环境安全 1.场地选择 1.1 场地选择:自然条件、社会条件、其他条件。1.2 抗震和承重&…

【操作系统】进程基础知识

目录 1、进程的介绍 2、进程的五个基本特性 3、进程的组成 4、进程的并行和并发执行 5、进程的状态 6、进程的通信 7、线程 1、进程的介绍 进程(Process)是程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的基本单…

java设计模式(1)---总则

设计模式总则 一、概述 1、什么是设计模式 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 解释下: 分类编目:就是说可以找到一些特征去划分这些设计模式,从而进行分类。 代码设计经验:这句很重…

使用Intellij idea编写Spark应用程序(Scala+SBT)

使用Intellij idea编写Spark应用程序(ScalaSBT) 对Scala代码进行打包编译时,可以采用Maven,也可以采用SBT,相对而言,业界更多使用SBT。 运行环境 Ubuntu 16.04 Spark 2.1.0 Intellij Idea (Version 2017.1) 安装Scala插件 安…

【微服务】StackOverflow的架构学习

目录 架构基础设施网络服务器SQL 服务器Redis推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战StackOverflow 是资源需求量最大的网站之一。我们作为架构师,在进行各种微服务架构的实践的同时,也需要学习借鉴各个成熟实践的精华。 因此本…

【HarmonyOS】ArkUI - 状态管理

在声明式 UI 中,是以状态驱动视图更新,如图1所示: 图1 其中核心的概念就是状态(State)和视图(View): 状态(State):指驱动视图更新的数据&#xf…

第十一届蓝桥杯大赛第二场省赛试题 CC++ 研究生组-子串分值和

solution1&#xff08;通过40%&#xff09; 依次求子串并统计出现过的字母个数 #include<iostream> #include<string> #include<set> using namespace std; int main(){string s, subs;cin >> s;int len s.size(), ans 0;for(int j 1; j < len…

【LabVIEW FPGA入门】FPGA寄存器(Register)

当您需要从多个时钟域或设计的不同部分访问数据&#xff0c;并且需要编写可重复使用的代码时&#xff0c;可使用寄存器项来存储数据。与 FIFO 相比&#xff0c;寄存器项消耗的 FPGA 逻辑资源更少&#xff0c;而且不消耗块存储器&#xff0c;而块存储器是最有限的 FPGA 资源类型…

2024阿里云2核2G服务器租用价格99元和61元一年

阿里云2核2G服务器配置优惠价格61元一年和99元一年&#xff0c;61元是轻量应用服务器2核2G3M带宽、50G高效云盘&#xff1b;99元服务器是ECS云服务器经济型e实例ecs.e-c1m1.large&#xff0c;2核2G、3M固定带宽、40G ESSD entry系统盘&#xff0c;阿里云活动链接 aliyunfuwuqi.…

微光图像增强算法学习记录(一)

微光图像增强&#xff08;LLIE&#xff09;旨在恢复照明并提高微光图像的可见性&#xff0c;本文对阅读的文献进行记录和分享&#xff0c;帮助回顾和大家建立学习资料。 文献一摘要及前沿摘选主要贡献网络结构实验结论 文献二摘要 文献三摘要主要贡献网络架构实验 文献四摘要实…

机器学习K-means算法

K-Means 算法&#xff08;K-Means算法、K-Means 中心值计算、K-Means 距离计算公式、K-Means 算法迭代步骤、K-Means算法实例&#xff09; 问题引入 给你如下两种图片&#xff0c;快读回答2个问题&#xff0c;问 图1 中有几类五谷杂粮&#xff1f;问 图2 中有几类五谷杂粮&…

linux源配置:ubuntu、centos;lspci与lsmod命令区别

1、ubuntu源配置 1&#xff09;先查电脑版本型号: lsb_release -c2&#xff09;再编辑源更新&#xff0c;源要与上面型号对应 参考&#xff1a;https://midoq.github.io/2022/05/30/Ubuntu20-04%E6%9B%B4%E6%8D%A2%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/ /etc/apt/…