docker 数据卷 (二)

news2024/11/18 14:46:54

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.coloradmin.cn/o/1540426.html

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

相关文章

下载最新VMware,社区版本(免费)

VMware - Delivering a Digital Foundation For BusinessesRun any app on any cloud on any device with a digital foundation built on VMware solutions for modern apps, multi-cloud, digital workspace, security & networking.https://www.vmware.com/ 官网地址

高等数学基础篇(数二)之微分方程

微分方程: 一、常微分方程的基本概念 二、一阶微分方程 三、可降阶的高阶方程 四、高阶线性微分方程 目录 一、常微分方程的基本概念 二、一阶微分方程 三、可降阶的高阶方程 四、高阶线性微分方程 一、常微分方程的基本概念 二、一阶微分方程 帮助理解&…

适用于存储卡数据恢复的最佳 SD 卡恢复软件

在当今的数字时代,我们对 SD 卡存储关键数据的 依赖显着增加。由于其便携性和巨大的存储容量,这些紧凑的便携式存储设备越来越受欢迎。 选择最佳 SD 卡恢复软件时要考虑的事项: 兼容性: 选择最好的 SD 卡恢复软件时&#xff0c…

IPMI开源库pyghmi基本使用

简介:Pyghmi是一个纯Python(主要是IPMI)服务器管理库。IPMI(Intelligent Platform Management Interface,智能平台管理接口)是一种开放的标准,旨在帮助系统管理员在本地和远程管理服务器系统。而…

MySQL表内容的增删查改

在前面几章的内容中我们学习了数据库的增删查改,表的增删查改,这一篇我们来学习一下对表中的内容做增删查改。 CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 1.创建Create 我们先创建…

C语言——字符函数

前言 字符函数是C语言中专门用来处理字符的函数,再C语言中,我们有时需要大量的处理有关字符的问题,所以字符函数就由此应运而生,接下来我来为大家简单介绍一下字符函数。 一.字符分类函数 函数如果它的参数满足下列条件就返回真…

jmeter断言使用方法

断言主流的有两种:响应断言、JSON断言 响应断言 1、http请求添加响应断言 2、三种作用域:第一种既作用主请求又作用子请求、只作用主请求、只作用子请求。我们默认选中间的仅作用主请求即可。 3、测试字段和匹配规则 测试字段一般选择响应文本即可&am…

[RootersCTF2019]I_<3_Flask -不会编程的崽

又是一个新东西哦。先看界面 源代码没提示,抓包没特别数据,没有交互界面,后台扫描也没文件。我知道是python模板,但是注入点???看来wp才知道原来还有参数爆破,哈哈哈。整笑了。有一…

深度学习(过拟合 欠拟合)

过拟合: 深度学习模型由于其复杂性,往往容易出现过拟合的问题。以下是一些深度学习中常见的过拟合原因和解决方法: 1. 数据量不足:深度学习模型通常需要大量的数据来进行训练,如果数据量不足,模型容易过度…

使用Python抓取抖音直播间数据的简易指南【第152篇—抓取数据】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python抓取抖音直播间数据的简易指南 说明:本文已脱敏,隐去地址…

JVM快速入门(1)JVM体系结构、运行时数据区、类加载器、线程共享和独享、分区、Java对象实例化

5.1 JVM体系结构 线程独占区-程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器;在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数…

如何解决Layui后台接口返回数据,但是table.render不渲染表格数据的问题

我这边进行了pareData数据格式转换,response重新定义了layui的参数格式规范 接口正常返回了数据 但是就是不渲染,我这个郁闷啊!! 忽然,我把后台重新定义的layui规定的格式参数,有个参数名叫data&#xff0…

Day 1 二分算法(C++)

算法简介 二分查找(Binary Search)是一种常见的查找算法,它适用于已经排序好的数组或列表。它的基本思想是不断地将待查找区间分成两半,并通过比较目标值与中间元素的大小关系来确定目标值在哪一半中,从而缩小查找范围…

【leetcode热题】 位1的个数

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 1 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(如 Java)中…

2024.03.23 健身打卡第 34 天

君之英才,实乃盖世无双,渴求统一大业却属鲲鹏之志。然涓滴之水汇成江河,已属不易,奔流向前,汇入大海之时,更会倍感自身之渺茫。 2024.03.23 健身打卡第 34 天

架构整洁之道-读书总结

1 概述 1.1 关于本书 《架构整洁之道》(Clean Architecture: A Craftsman’s Guide to Software Structure and Design)是由著名的软件工程师Robert C. Martin(又称为Uncle Bob)所著。这本书提供了软件开发和架构设计的指导原则…

王道C语言督学营OJ课后习题(课时14)

#include <stdio.h> #include <stdlib.h>typedef char BiElemType; typedef struct BiTNode{BiElemType c;//c 就是书籍上的 datastruct BiTNode *lchild;struct BiTNode *rchild; }BiTNode,*BiTree;//tag 结构体是辅助队列使用的 typedef struct tag{BiTree p;//树…

文件包含一-WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

演示案例&#xff1a; 文件包含-原理&分类&利用&修复黑盒利用-VULWEB-有无包含文件白盒利用-CTFSHOW-伪协议玩法 #文件包含-原理&分类&利用&修复 1、原理 程序开发人员通常会把可重复使用的函数写到单个文件中&#xff0c;在使用某些函数时&#xff0c…

MySQL---视图

目录 一、介绍 二、语法 三、视图的更新 四、视图作用 一、介绍 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#…

CSS时钟案例

文章目录 1. 演示效果2. 分析思路3. 代码实现 1. 演示效果 2. 分析思路 背景是表盘&#xff0c;不用自己制作然后用CSS的定位做时针&#xff0c;分针和秒针黑点用伪元素::after生成转动用animation实现 3. 代码实现 <!DOCTYPE html> <html lang"en">&…