当前位置: 首页 > news >正文

docker数据卷的使用

文章目录

  • 1、数据卷产生背景
  • 2、数据卷的使用
    • 2.1、创建数据卷
    • 2.2、挂载数据卷
    • 2.3、共享数据卷
    • 2.4、删除数据卷
    • 2.5、备份和迁移数据卷
  • 总结

1、数据卷产生背景

Docker的镜像是由一系列的只读层组合而来,当启动一个容器时,Docker加载镜像的所有只读层,并在最上层加入一个读写层。这个设计使得Docker可以提高镜像构建、存储和分发的效率,节省了时间和存储空间,然而也存在一些问题:

  • 容器中的文件在宿主机上存在形式复杂,不能在宿主机上很方便地对容器中的文件进行访问。
  • 多个容器之间的数据无法共享
  • 当删除容器时,容器产生的数据将丢失。

为了解决这些问题,Docker引入了数据卷(volume)机制。Volume 是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享和持久化提供便利。

  • volume 在容器创建时就会初始化,在容器运行时就可以使用其中的文件。
  • volume 能在不同的容器之间共享和重用。
  • 对volume中数据的操作会马上生效。
  • 对volume中数据的操作不会影响镜像本身。
  • volume的生存周期独立于容器的生命周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被Docker删除。

2、数据卷的使用

Usage:  docker volume COMMANDManage volumesCommands:create      Create a volumeinspect     Display detailed information on one or more volumesls          List volumesprune       Remove all unused local volumesrm          Remove one or more volumes

2.1、创建数据卷

创建一个名为 vol_simple的存储卷:

docker volume create --name vol_simple

查看数据卷的信息:

docker volume inspect vol_simple

示例:

king@king-server:~$ docker volume inspect vol_simple 
[{"CreatedAt": "2024-01-27T11:37:11Z","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/vol_simple/_data","Name": "vol_simple","Options": null,"Scope": "local"}
]

Docker run 和 docker create 通过指定-v参数 可以为容器挂载一个数据卷。

#没有指定volume卷,只指定了容器中的挂载点/data 
docker run -d -it -v /data ubuntu /bin/bash 
# 查看随机创建的volume位置,查看mounts的内容 
docker inspect {ID}
# 创建一个指定名字的volume ,并挂载到容器中的/data目录 
docker run -d -v vol_simple:/data ubuntu

示例:

fly@fly:~$ docker run -dit -v vol_simple:/data ubuntu
e86204b7a02ccb62e6cf4f00b7246ac0d70aadf0d9915df5418ad73f0bf8f00a
fly@fly:~$ docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS          PORTS                                       NAMES
e86204b7a02c   ubuntu       "bash"                   4 seconds ago   Up 2 seconds                                                charming_bhaskara
fly@fly:~$ docker inspect charming_bhaskara 
...
"Mounts": [{"Type": "volume","Name": "vol_simple","Source": "/var/lib/docker/volumes/vol_simple/_data","Destination": "/data","Driver": "local","Mode": "z","RW": true,"Propagation": ""}],
...

测试数据持久性:

fly@fly:~$ docker exec -it charming_bhaskara bash
root@e86204b7a02c:/# ls
bin  boot  data  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e86204b7a02c:/# echo abcd >> /data/1.txt
root@e86204b7a02c:/# cat data/1.txt 
abcd
root@e86204b7a02c:/# exit
exit
fly@fly:~$ docker stop charming_bhaskara 
charming_bhaskara
fly@fly:~$ docker rm charming_bhaskara 
charming_bhaskara
fly@fly:~$ docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED       STATUS          PORTS                                       NAMES
22634e72e7a3   registry:2   "/entrypoint.sh /etc…"   3 weeks ago   Up 21 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry
fly@fly:~$ sudo cat /var/lib/docker/volumes/vol_simple/_data/1.txt
abcd

2.2、挂载数据卷

使用docker run 或者 docker create 创建新容器是,可以使用-v标签为容器添加volume。可以将自行创建或者有Docker创建的volume挂载到容器中,也可以将宿主机上的目录或者文件作为volume挂载到容器中。

将宿主机中指定目录作为volume挂载到容器中的/data目录下,文件夹必须使用绝对路径,如果宿主机中不存在指定的目录,则会创建一个空文件夹;如果宿主机文件夹已经存在,容器可以通过访问挂载点/data 从而访问宿主机文件夹中的所有内容。如果容器下原本已经存在/data文件夹,且不为空,那么容器中文件夹下原有的内容将被隐藏,来保持与宿主机中的文件夹一致。

挂载方式:

  1. 创建名为vol_simple的数据卷,并挂载到容器中的/data目录下:
docker volume create --name vol_simple 
docker run -d -v vol_simple:/data ubuntu /bin/bash
  1. 创建一个随机的ID的volume,并将其挂载到容器中的/data目录下:
docker run -d -v /data ubuntu /bin/bash
  1. 关联宿主机目录:
docker run -d -v $HOME/data:/data ubuntu /bin/bash

挂载权限,ro表示只读,rw表示读写,默认为rw:

# ro表示只读,rw表示读写,默认为rw 
docker run -it -v $HOME/data:/data:ro ubuntu /bin/bash 
# 通过修改文件验证,因为是只读,所以下面会报错
echo 123456abcdefg >> /data/test

同时挂载多个数据卷:

docker run -it -v $HOME/data:/data:ro -v /data1 -v /data2 ubuntu /bin/bash

使用dockerfile VOLUME 指令,与docker run -v 不同的是,dockerfile指令不能挂载主机中指定的文件夹。这时为了保证Dockerfile的可移植性,因为不能保证所有的宿主机都有对应的文件夹。如果镜像中存才/data文件夹,这个文件夹中的内容将全部被复制到宿主机上对应文件夹中,并且根据容器中的文件设置合适的权限和所有者。

注意:
在Dockerfile中使用VOLUME指令后的代码,如果尝试对这个volume进行修改,这些修改都不会生效。因为:volume 是独立于rootfs的存储,镜像构建过程,每一层类似docker commit 提交临时镜像为镜像层,docker commit不会对挂载的volume进行保存。

示例1:
VOLUME指定了挂载点之后,再对挂载点进行操作,由于docker commit 提交临时镜像不会对volume进行保存,所以该data下的file并没有被保存,更不会同步到宿主机。

FROM ubuntu 
RUN useradd fly2
VOLUME /data 
RUN touch /data/file 
RUN chown -R fly2:fly2 /data

构建:

docker build -t test1:v1 -f Dockerfile . 
docker run -d -it test1:v1 /bin/bash

查看挂载点信息 :

docker inspect 容器ID 

查看宿主机存储卷目录 :

sudo ls 宿主机存储卷目录

示例二:
由于挂载volume时,/data目录已经存在,所以/data中的文件以及它们的权限和所有者设置都会被复制到volume中。

FROM ubuntu 
RUN useradd fly2 
RUN mkdir /data && touch /data/file 
RUN chown -R fly2:fly2 /data 
VOLUME /data

构建:

docker build -t test1:v2 -f Dockerfile1 . 
docker run -d -it test1:v2 /bin/bash 

查看挂载点信息:

docker inspect 容器ID

查看宿主机存储卷目录 :

sudo ls 宿主机存储卷目录

示例三:
通过CMD和ENTRYPOINT指令,在容器启动时执行挂载点下文件的初始化。

FROM ubuntu 
RUN useradd fly2
VOLUME /data 
CMD touch /data/file && chown -R fly2:fly2 /data

说明:
在dockerfile中使用数据卷时,如果我们仅仅想在启动容器时有这样一个空的数据卷,那么dockerfile中关于数据卷这块怎么写都行;如果我们确确实实需要初始化一些内容到我们的数据卷里头,我们先得将内容提交到镜像(比如先创建文件),然后再去创建数据卷。

2.3、共享数据卷

在使用docker run 或docker create创建新容器时,可以使用–volumes-from 标签使得容器与已有容器共享volume。可以使用多个–volumes-from标签,使得容器与多个已有容器共享volume。

一个容器挂载了一个volume,即使这个容器停止运行,该volume仍然存在,其他容器也可以使用–volumes-from与这个容器共享volume。

共享数据卷作用:
如果有一些数据,比如配置文件、数据文件等,要在多个容器之间共享,一种常见的做法是创建一个数据容器,其他的容器与之共享volume。

示例:创建一个带数据卷的容器。
创建目录和数据卷:

mkdir $HOME/data 
mkdir $HOME/readOlny_data 
docker volume create vol_simple 
docker volume create vol_simple1 

创建一个数据容器 包含已创建数据卷,只读数据卷,私有数据卷等 :

docker run -d -it -v vol_simple:/vol_simple -v $HOME/data:/data -v $HOME/readOlny_data:/readOlny_data:ro --name share_data ubuntu /bin/bash 
docker run -d -it -v vol_simple1:/vol_simple1 --name share_data1 ubuntu /bin/bash 

进入容器查看 :

docker exec -it 容器ID /bin/bash

运行新的容器通过数据容器共享数据卷 容器名:

volume_from1 docker run -d -it --volumes-from share_data --volumes-from share_data1 --name volume_from1 ubuntu /bin/bash 

运行新的容器通过数据容器共享数据卷 容器名:

volume_from2 docker run -d -it --volumes-from share_data --volumes-from share_data1 --name volume_from2 ubuntu /bin/bash

说明:

  1. 只读共享点不能被写入。
  2. 可以同时共享多个容器的数据卷。
  3. docker inspect 查看容器元数据。

2.4、删除数据卷

如果创建容器时从容器中挂载了volume,在/var/lib/docker/volumes下会生成与volume对应的目录(可使用docker inspect 命令查看容器信息找到对应的信息)。

删除volume的三种方式:

  1. 使用docker volume rm <volume_name> 删除数据卷。
  2. 使用docker rm -v <container_name> 删除容器时一并删除它挂载的数据卷。
  3. 在运行容器时使用docker run --rm 标签会在容器停止运行时删除容器以及容器所挂载的volume。

注意:

  1. 在使用第一种docker volume rm 删除时,只有当没有任何容器使用该volume的时候,才能被删除成功。
  2. 另外两种删除方式,只会对挂载在该容器上的未指定名称(匿名的)的volume进行删除,而会对用户指定名称的(具名的)volume进行保留。
  3. 如果volume 是在创建容器时从宿主机中挂载的,无论对容器进行任何操作都不会导致其在宿主机中被删除,如果不需要这些文件,只能手动删除。(从宿主机中挂载是指 docker run -v dir:dir 这种模式)。

2.5、备份和迁移数据卷

volume 作为数据的载体,在很多情况下需要对其中的数据进行备份、迁移,或是从已有数据恢复。

最简单的备份还原的方式:

  1. 通过inspect 命令查看容器信息,找到对应的数据卷,手动打包数据;
  2. 同样的还原那就是把打包好的数据解压到对应的数据卷。

用–volumes-from实现备份与还原:

  1. 备份:启动另外一个临时容器,共享挂载数据容器share_data,同时挂载当前目录到容器的/backup。启动容器时执行打包命令,将/data挂载点下的数据打包到/backup/data.tar 文件中。–rm 表示该容器停止后会删除该容器和该容器的数据卷。
docker run --rm --volumes-from share_data -v $(pwd):/backup ubuntu tar cvf /backup/data.tar /data
  1. 恢复:创建临时容器,通过共享存储的方式与目标容器共享存储,同时挂载当前目录到容器的/backup。启动容器时从backup挂载点下的data.tar 解压文件到容器的根目录。
docker run -d -it --name vol_bck -v /data ubuntu /bin/bash
docker run --rm --volumes-from vol_bck -v $(pwd):/backup ubuntu tar xvf /backup/data.tar -C /

总结

  1. 数据卷解决的问题就是容器数据的持久化问题,比如日志、容器间共享数据、配置文件等。
  2. 容器和镜像使用的同一套文件,即依赖相同的镜像层,这是一个只读的权限;要修改底层文件内容,就需要将文件从只读层拷贝出来放到读写层进行改变;改变后会隐藏只读层的那个文件,使用读写层的文件。
  3. 一般,底层文件系统是不允许改变的,所以容器关闭之后,容器的所有改变内容都会被删除,为解决这个问题引入了数据卷。
  4. 匿名数据卷可以在删除容器的时候一并删除。

相关文章:

docker数据卷的使用

文章目录 1、数据卷产生背景2、数据卷的使用2.1、创建数据卷2.2、挂载数据卷2.3、共享数据卷2.4、删除数据卷2.5、备份和迁移数据卷 总结 1、数据卷产生背景 Docker的镜像是由一系列的只读层组合而来&#xff0c;当启动一个容器时&#xff0c;Docker加载镜像的所有只读层&…...

2024獬豸杯完整Writeup

文章目录 手机手机基本信息- 1、IOS手机备份包是什么时候开始备份的。&#xff08;标准格式&#xff1a;2024-01-20.12:12:12)手机基本信息- 2、请分析&#xff0c;该手机共下载了几款即时通讯工具。&#xff08;标准格式&#xff1a;阿拉伯数字&#xff09;手机基本信息- 3、手…...

Vue学习笔记之应用创建和基础知识

1、安装方式 CDN方式安装&#xff1a; <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> 2、创建应用 使用Vue内置对象创建一个应用&#xff0c;基本代码结构如下&#xff1a; <script src"https://unpkg.com/vue3/dist/…...

CSS3基础知识总结

目录 一、CSS3 边框 1.border-radius&#xff1a;圆角边框 2.box-shadow&#xff1a;添加阴影 3.border-image&#xff1a;图片边框 二、CSS3 渐变 1.线性渐变(Linear Gradients) a.由上到下&#xff08;默认&#xff09; b.从左到右 c.对角 d.使用角度 2.径向渐变(…...

80.网游逆向分析与插件开发-背包的获取-自动化助手显示物品数据1

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;升级Notice类获得背包基址-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;3be017de38c50653b…...

Python第三方扩展库NumPy

Python第三方扩展库NumPy NumPy(Numerical Python&#xff0c;注意使用时全部小写 numpy) 是 Python 语言的一个扩展程序库&#xff0c;支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。 在Windows平台上安装numpy&#xff0c;可在cmd命令…...

Dockerfile简介和基础实践

文章目录 1、Dockerfile简介1.1、Dockerfile解决的问题1.2、docker build 构建流程1.3、关键字介绍 2、Dockerfile 实践2.1、基本语法实践 --- golang2.1.1 问题检查 2.2、基本语法实践 --- gcc 总结 1、Dockerfile简介 Dockerfile是一个创建镜像所有命令的文本文件, 包含了一…...

3分钟 docker搭建 帕鲁服务器

1. 安装docker 1.安装依赖环境 yum -y install yum-utils device-mapper-persistent-data lvm22.设置镜像源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3.安装docker 3.1 yum makecache fast yum install docker-ce …...

[BUUCTF 2018]Online Tool(特详解)

这段代码块检查请求中是否设置了HTTP_X_FORWARDED_FOR头部。如果设置了&#xff0c;它将REMOTE_ADDR设置为HTTP_X_FORWARDED_FOR的值。这通常用于处理Web服务器位于代理后面的情况。 如果URL中未设置host参数&#xff0c;它使用highlight_file(__FILE__);来显示PHP文件的源代码…...

Qt Design Studio+Pyside项目

Qt Design Studio设计出的项目结构有多个层级的目录&#xff0c;我们直接用类似Qt Creator工具的方式加载main.qml文件时会报错提示module "content" is not installed&#xff0c;将content加入importPath后还是报同样的错误。 Qt Design Studio生成的文件包含了.qm…...

软件门槛之算法

软件门槛之算法 1.背景2.算法定义3.特征4.基本要素5.常用设计模式6.常用实现方法7.复杂度时间复杂度空间复杂度8.分类9.算法常用的一些工具10.算法的检验标准1.背景 一入行业深似海 再回首已是白发生! 工作这么多年了,感觉算法是比较难搞的。 写代码最重要的可能是框架和算法…...

第八篇【传奇开心果系列】beeware的toga开发移动应用示例:实现消消乐安卓手机小游戏

传奇开心果博文系列 系列博文目录beeware的toga开发移动应用示例系列博文目录一、项目目标二、安装依赖三、初步实现四、扩展思路五、实现游戏逻辑示例代码六、实现界面设计示例代码七、实现增加关卡和难度示例代码八、实现存档和排行榜示例代码九、实现添加特殊方块和道具示例…...

【MySQL】MySQL内置函数--日期函数/字符串函数/数学函数/其他相关函数

文章目录 1.日期函数2.字符串函数3.数学函数4.其它函数 1.日期函数 MySQL中内置了一下函数&#xff1a; 函数名称描述current_date()当前日期current_time()当前时间current_timestamp()当前时间戳date(datetime)返回datetime参数的日期部分date_add(date,interval d_value_t…...

应急响应红蓝工程师白帽子取证Linux和windows入侵排查还原攻击痕迹,追溯攻击者,以及各种木马和病毒以及恶意脚本文件排查和清除

应急响应红蓝工程师白帽子取证Linux入侵排查还原攻击痕迹,追溯攻击者,以及各种木马和病毒以及恶意脚本文件排查和清除。 一般服务器被入侵的迹象,包括但不局限于:由内向外发送大量数据包(DDOS肉鸡)、服务器资源被耗尽(挖矿程序)、不正常的端口连接(反向shell等)、服务…...

vue项目使用element-plus

介绍 1.element Plus 是一套基于 Vue.js 的组件库&#xff0c;是对饿了么团队的 Element UI 组件库的升级版本。Element Plus 的目标是提供一套更为现代、更好用的 Vue.js UI 组件。 导入 1.1 执行命令: npm install element-plus --save 1.2 在main.js中做如下配置import E…...

Fastbee物联网项目新手快速入门

一&#xff0c;前提条件 后端环境准备如下&#xff1a; 正式环境推荐硬件资源最低要求4c8G&#xff0c;硬盘40G。JDK 1.8.0_2xx (需要小版本号大于200) 。Maven3.6.3。&#xff08;IDEA启动时使用IDEA默认自带的版本即可&#xff09;。 启动fastbee之前&#xff0c;请先确定…...

Linux 网络流量相关工具

本文聚焦于网络流量的查看、端口占用查看。至于网络设备的管理和配置&#xff0c;因为太过复杂且不同发行版有较大差异&#xff0c;这里就不赘述&#xff0c;后面看情况再写。 需要注意的是&#xff0c;这里列出的每一个工具都有丰富的功能&#xff0c;流量/端口信息查看只是其…...

KMP算法关于next数组详解

j1234567abcabcdnext[j]0111234 要求j7的时候&#xff0c;next数组为多少&#xff0c;j7的时候&#xff0c;就是看i6的时候前缀和后缀的关系&#xff08;因为求7的时候&#xff0c;和7没有关系&#xff0c;和7的前面有关系&#xff09; 当i6的时候&#xff0c;j3&#xff0c;…...

【Docker】数据持久化 挂载

Docker的镜像是只读的&#xff0c;但是容器是可写的&#xff0c;我们可以将数据写入到容器&#xff0c;不过一旦容器删除数据将会丢 失&#xff0c;那么有什么办法能将数据进行持久化存储呢&#xff1f; ——在宿主机上开辟一块地方&#xff0c;存储内容和docker容器的存储内…...

redis-主从复制

1.主从复制 1.1简介 主机数据更新后根据配置和策略&#xff0c; 自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主 1.2作用 1、数据冗余&#xff1a;主从复制实现了数据的热备份&#xff0c;是持久化之外的一种数据冗余方式。 2、故…...

知识产权如何转为实缴资本,实操

网上已传疯了&#xff0c;相关部门要求企业注册资本认缴的必须在5年内完成实缴&#xff0c;这一下子引起企业老板们着急了。以前公司注册时&#xff0c;很多老板因为是认缴资本&#xff0c;完全凭脑袋一拍&#xff0c;写上注册资金5000万&#xff0c;有的甚至写上几个小目标。现…...

docker-compose安装

一、docker-compose是什么 Docker Compose是一个用来定义和运行复杂应用的Docker工具。 一个使用Docker容器的应用&#xff0c;通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。 Compose 通过一个配置文件来管理多个Docker容器&#xff0c;在配置文件…...

「 典型安全漏洞系列 」06.路径遍历(Path Traversal)详解

引言&#xff1a;什么是路径遍历&#xff1f;如何进行路径遍历攻击并规避常见防御&#xff1f;如何防止路径遍历漏洞。 1. 简介 路径遍历&#xff08;Path Traversal&#xff09;是一种安全漏洞&#xff0c;也被称为目录遍历或目录穿越、文件路径遍历。它发生在应用程序未正确…...

【Android Gradle 插件】Gradle 参考文档收集

Android Plugin DSL Reference 参考文档 Android Plugin DSL Reference 参考文档 : Android Studio 构建配置官方文档 : 配置 build | Android Studio | Android Developers 添加构建依赖项 参考文档 : https://developer.android.google.cn/studio/build/dependencies …...

Controller的部分注解

目录 1.增加 用到注解 1.1RequestBody注解解析&#xff1a; 2.查询方法当中参数不用注解&#xff01; 3.起售停售用到注解 3.1PathVariable解析 4.删除菜品注解 4.1RequestParam 5.修改用到的注解 5.1修改分两步 用到两个注解 6&#xff1a;总结 1.增加 用到注解…...

CMake简明教程 笔记

推荐B站视频&#xff1a;1.1 Cmake构建项目的流程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1xa4y1R7vT?p1&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 >>目录 1&#xff09;CMake初体验 CMake构建流程Windows下使用CMake构建项目Linux下使用CMake构…...

使用 sorted set 实现令牌桶限流

业务场景为限制消息发送&#xff0c;要求每天不超过一次&#xff0c;每七天不超过三次。 Redission 的 RRateLimiter 虽然功能完备且支持自定义限流配置&#xff0c;但是每个限流器都需要维护三个 key&#xff0c;并且 lua 脚本中的判断逻辑较为复杂。 见&#xff1a;Redisso…...

云上高可用系统-韧性设计模式

一、走近韧性设计模式 &#xff08;一&#xff09;基本概念 韧性设计模式是一系列在软件工程中用于提高系统韧性的设计原则、策略、实践和模式。韧性&#xff08;Resilience&#xff09;在这里指的是系统对于各种故障、异常和压力的抵抗能力&#xff0c;以及在遭受这些挑战后…...

【保姆级教程】Windows11下go-zero的etcd安装与初步使用

【Go-Zero】Windows11下etcd的安装与初步使用 大家好 我是寸铁&#x1f44a; 总结了一篇Windows11下etcd的安装与初步使用的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言&#xff1a; 在使用etcd 前&#xff0c;我们需要了解一下etcd 是什么&#xff0c;为什么使用etcd…...

golang通过go-git下载gitlab源码

1 申请令牌 方法1&#xff1a;具体项目下申请&#xff1a; 方法2&#xff1a;全局申请 2 获取token 3 下载代码 package mainimport ("fmt""os""github.com/go-git/go-git/v5" )func main() {_, err : git.PlainClone("/tmp/foo",…...